From 9df731a176aab8e03b984b681b1bea01ccff6644 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 07:23:06 +0000
Subject: [PATCH] rk3568 rt uboot init

---
 u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c           |  313 
 u-boot/arch/arm/dts/rk3588.dtsi                            |    4 
 u-boot/cmd/ddr_tool/memtester/types.h                      |    0 
 u-boot/arch/arm/dts/rk3308-u-boot.dtsi                     |   12 
 u-boot/arch/arm/mach-rockchip/rk3562/Makefile              |   11 
 u-boot/lib/sha1.c                                          |   33 
 u-boot/drivers/phy/phy-rockchip-inno-usb2.c                |  364 
 u-boot/configs/rk3568-spl-spi-nand_defconfig               |   11 
 u-boot/drivers/ufs/Makefile                                |    8 
 u-boot/drivers/scsi/scsi.c                                 |    4 
 u-boot/arch/arm/include/asm/arch-rockchip/uimage.h         |    3 
 u-boot/drivers/video/drm/rockchip_vop2.c                   | 2254 +
 u-boot/drivers/video/drm/dw-dp.c                           |   54 
 u-boot/configs/rk3568-rt.config                            |    2 
 u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h     |  416 
 u-boot/board/rockchip/evb_rk3528/Kconfig                   |   15 
 u-boot/arch/arm/cpu/armv7/start.S                          |    2 
 u-boot/drivers/video/drm/Makefile                          |   15 
 u-boot/common/fb_mmc.c                                     |   18 
 u-boot/drivers/net/phy/rk630phy.c                          |    3 
 u-boot/drivers/ram/rockchip/sdram_rk3562.c                 |   31 
 u-boot/drivers/phy/phy-rockchip-naneng-combphy.c           |  231 
 u-boot/scripts/setlocalversion                             |    7 
 u-boot/drivers/nvme/nvme.c                                 |   27 
 u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c          |   41 
 u-boot/drivers/core/read.c                                 |   11 
 u-boot/arch/arm/cpu/armv8/sha256_ce_core.S                 |  134 
 u-boot/drivers/video/drm/Kconfig                           |   28 
 u-boot/configs/rv1106-usb.config                           |   17 
 u-boot/drivers/pinctrl/Makefile                            |    1 
 u-boot/drivers/video/drm/rockchip_rgb.c                    |  362 
 u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c              |   89 
 u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c              |  661 
 u-boot/common/image-fdt.c                                  |   80 
 u-boot/arch/arm/dts/px30-u-boot.dtsi                       |    7 
 u-boot/arch/arm/lib/bootm-fdt.c                            |    3 
 u-boot/drivers/power/charge_animation.c                    |    6 
 u-boot/drivers/usb/dwc3/io.h                               |    5 
 u-boot/cmd/pci.c                                           |  285 
 u-boot/arch/arm/dts/rk3528-u-boot.dtsi                     |  206 
 u-boot/arch/arm/mach-rockchip/rockchip_smccc.c             |   17 
 u-boot/disk/part_efi.c                                     |    5 
 u-boot/drivers/core/root.c                                 |   13 
 u-boot/drivers/power/pmic/rk8xx.c                          |   73 
 u-boot/disk/part_env.c                                     |    9 
 u-boot/configs/rv1126-bat-spi-nor-tb.config                |    2 
 u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c         |    4 
 u-boot/drivers/core/device.c                               |    2 
 u-boot/drivers/video/drm/rockchip_tve.h                    |  253 
 u-boot/include/dm/fdtaddr.h                                |   12 
 u-boot/cmd/script_update.c                                 |   38 
 u-boot/arch/arm/include/asm/system.h                       |    1 
 u-boot/drivers/video/drm/rockchip_tve.c                    |  848 
 u-boot/include/linux/mtd/mtd.h                             |   24 
 u-boot/configs/rk3036_defconfig                            |    2 
 u-boot/drivers/ram/rockchip/sdram_rv1126.c                 |   38 
 u-boot/drivers/power/regulator/fixed.c                     |   10 
 u-boot/disk/part.c                                         |   25 
 u-boot/arch/arm/include/asm/arch-rockchip/vendor.h         |    3 
 u-boot/scripts/android2fit.sh                              |    4 
 u-boot/drivers/mtd/mtd_blk.c                               |   16 
 u-boot/drivers/clk/clk-uclass.c                            |    3 
 u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S             |    4 
 u-boot/drivers/mtd/nand/spi/skyhigh.c                      |   51 
 u-boot/drivers/ufs/Kconfig                                 |   24 
 u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c          |  426 
 u-boot/include/configs/woodburn_common.h                   |    4 
 u-boot/drivers/video/drm/rohm-bu18tl82.c                   |   17 
 u-boot/include/configs/rk3528_common.h                     |  109 
 u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c       |    3 
 u-boot/arch/arm/mach-rockchip/fit.c                        |   68 
 u-boot/drivers/i2c/muxes/max96745.c                        |   44 
 u-boot/drivers/clk/rockchip/clk_rk3562.c                   | 2046 +
 u-boot/arch/arm/cpu/armv8/Kconfig                          |   15 
 u-boot/fs/ubifs/super.c                                    |   21 
 u-boot/drivers/mtd/nand/spi/xincun.c                       |  108 
 u-boot/drivers/mmc/sdhci.c                                 |   53 
 u-boot/drivers/clk/rockchip/Makefile                       |    2 
 u-boot/include/configs/rk3588_common.h                     |    8 
 u-boot/common/Makefile                                     |   10 
 u-boot/configs/rv1106-optee.config                         |    5 
 u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c       |   26 
 u-boot/drivers/misc/rk3562-secure-otp.S                    | 15906 ++++++++++
 u-boot/drivers/ram/rockchip/Makefile                       |    2 
 u-boot/drivers/gpio/Makefile                               |    1 
 u-boot/include/configs/evb_rk3528.h                        |   26 
 u-boot/include/key.h                                       |    7 
 u-boot/include/spl_ab.h                                    |   10 
 u-boot/drivers/input/rk_key.c                              |    8 
 u-boot/board/rockchip/evb_rk3528/Makefile                  |    7 
 u-boot/drivers/ufs/ufs-uclass.c                            |   18 
 u-boot/drivers/video/drm/rockchip_display.h                |   50 
 u-boot/drivers/mtd/nand/spi/fmsh.c                         |   40 
 u-boot/drivers/video/drm/rockchip_display.c                |  661 
 u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile                    |    7 
 u-boot/configs/rk3399_defconfig                            |    3 
 u-boot/drivers/phy/phy-rockchip-usbdp.c                    |   26 
 u-boot/drivers/input/key-uclass.c                          |   83 
 u-boot/drivers/video/drm/rockchip_spl_display.c            |  265 
 u-boot/drivers/usb/dwc3/gadget.c                           |    2 
 u-boot/arch/arm/dts/rk3528-evb.dts                         |   31 
 u-boot/cmd/ddr_tool/memtester/Makefile                     |    8 
 u-boot/include/dt-bindings/power/rk3562-power.h            |   33 
 u-boot/drivers/video/drm/rockchip_display_helper.c         |  279 
 u-boot/drivers/input/spl_adc_key.c                         |  141 
 u-boot/lib/avb/libavb_user/avb_ops_user.c                  |  147 
 u-boot/drivers/misc/Makefile                               |    8 
 u-boot/include/configs/rk3562_common.h                     |   84 
 u-boot/common/mp_boot_rk3528.S                             | 9682 ++++++
 u-boot/examples/standalone/rkspi.h                         |  138 
 u-boot/drivers/cpu/rockchip_amp.c                          |   52 
 u-boot/common/spl/Kconfig                                  |   24 
 u-boot/configs/rv1106-spi-nor_defconfig                    |   10 
 u-boot/board/rockchip/evb_rk3562/Kconfig                   |   15 
 u-boot/common/image-android.c                              |  306 
 u-boot/include/dt-bindings/display/rockchip-tve.h          |   15 
 u-boot/include/u-boot/sha1.h                               |    2 
 u-boot/include/mp_boot.h                                   |   25 
 u-boot/drivers/mtd/nand/spi/core.c                         |   14 
 u-boot/drivers/rkflash/sfc_nand.c                          |   30 
 u-boot/tools/Makefile                                      |    6 
 u-boot/configs/rk3562_defconfig                            |  211 
 u-boot/arch/arm/cpu/armv8/Makefile                         |    2 
 u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h     |  396 
 u-boot/drivers/video/drm/panel-rohm-bu18rl82.c             |  349 
 u-boot/common/spl/spl.c                                    |   14 
 u-boot/cmd/ddr_tool/Makefile                               |   25 
 u-boot/drivers/video/drm/rockchip_post_csc.c               | 1587 +
 u-boot/lib/rsa/rsa-verify.c                                |   16 
 u-boot/configs/px30-tb_defconfig                           |    2 
 u-boot/arch/arm/dts/rk3528-pinctrl.dtsi                    | 1241 
 u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c              |   17 
 u-boot/drivers/video/drm/rockchip_post_csc.h               |   35 
 u-boot/drivers/net/gmac_rockchip.c                         |  494 
 u-boot/arch/arm/dts/rk3568-u-boot.dtsi                     |   33 
 u-boot/arch/arm/mach-rockchip/vendor.c                     |   32 
 u-boot/arch/arm/dts/rk3588-u-boot.dtsi                     |    3 
 u-boot/drivers/i2c/muxes/Makefile                          |    1 
 u-boot/arch/arm/dts/rk3588s.dtsi                           |   21 
 u-boot/include/android_ab.h                                |    2 
 u-boot/arch/arm/mach-rockchip/chip_info.c                  |    4 
 u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi                 |   28 
 u-boot/arch/arm/dts/rv1106-u-boot.dtsi                     |   42 
 u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h     |   89 
 u-boot/drivers/mtd/spi/sf_internal.h                       |    1 
 u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h   |   81 
 u-boot/drivers/video/drm/rockchip_panel.c                  |  120 
 u-boot/cmd/Makefile                                        |    4 
 u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c       |   24 
 u-boot/drivers/video/drm/rockchip_vop_reg.c                |   22 
 u-boot/drivers/spi/soft_spi.c                              |   34 
 u-boot/include/android_avb/avb_ops_user.h                  |   16 
 u-boot/drivers/mtd/nand/spi/Makefile                       |    2 
 u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c              |   69 
 u-boot/cmd/ddr_tool/memtester/memtester.h                  |    6 
 u-boot/drivers/video/drm/rockchip_connector.h              |  124 
 u-boot/cmd/mmc.c                                           |    4 
 u-boot/lib/optee_clientApi/OpteeClientInterface.c          |   16 
 u-boot/cmd/ddr_tool/stressapptest/Makefile                 |    7 
 u-boot/drivers/video/Makefile                              |    6 
 u-boot/lib/avb/libavb_user/Kconfig                         |    1 
 u-boot/drivers/video/drm/rockchip_connector.c              |   45 
 u-boot/arch/arm/mach-rockchip/fit_nodes.sh                 |   73 
 u-boot/drivers/video/drm/dw_hdmi.h                         |    4 
 u-boot/cmd/ddr_tool/memtester/memtester.c                  |    4 
 u-boot/drivers/mtd/nand/spi/hyf.c                          |   22 
 u-boot/configs/rk322x_defconfig                            |    2 
 u-boot/drivers/clk/rockchip/clk_rk3528.c                   | 2145 +
 u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c         |   13 
 u-boot/configs/rk3588_defconfig                            |    9 
 u-boot/drivers/video/drm/rockchip_crtc.h                   |    6 
 u-boot/configs/px30_defconfig                              |    1 
 u-boot/configs/rk3328_defconfig                            |    2 
 u-boot/drivers/video/drm/dw_hdmi.c                         |  186 
 u-boot/common/android_bootloader.c                         |  415 
 u-boot/drivers/phy/Makefile                                |    2 
 u-boot/cmd/ddr_tool/Kconfig                                |   32 
 u-boot/arch/arm/mach-rockchip/rk_meta.c                    |   25 
 u-boot/drivers/video/drm/rockchip_crtc.c                   |   40 
 u-boot/tools/rkcommon.c                                    |    2 
 u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S               |    4 
 u-boot/arch/arm/dts/Makefile                               |    2 
 u-boot/arch/arm/mach-rockchip/rk3528/Kconfig               |   17 
 u-boot/drivers/ufs/unipro.h                                |  270 
 u-boot/include/spl_display.h                               |   28 
 u-boot/common/spl/spl_fit.c                                |   20 
 u-boot/include/configs/rk3288_common.h                     |    2 
 u-boot/drivers/gpio/gpio-uclass.c                          |    2 
 u-boot/arch/arm/dts/rk3308.dtsi                            |    7 
 u-boot/common/android_ab.c                                 |   56 
 u-boot/include/configs/evb_rk3562.h                        |   26 
 u-boot/env/envf.c                                          |   51 
 u-boot/drivers/ufs/ti-j721e-ufs.c                          |   74 
 u-boot/cmd/ddr_tool/stressapptest/stressapptest.c          | 1207 
 u-boot/include/edid.h                                      |   41 
 u-boot/common/board_f.c                                    |    4 
 u-boot/lib/avb/libavb/avb_slot_verify.c                    |   15 
 u-boot/arch/arm/mach-rockchip/boot_mode.c                  |    4 
 u-boot/arch/arm/mach-rockchip/hotkey.c                     |    4 
 u-boot/arch/arm/mach-rockchip/Kconfig                      |   95 
 u-boot/cmd/ddr_tool/stressapptest/stressapptest.h          |   70 
 u-boot/arch/arm/cpu/armv8/start.S                          |   74 
 u-boot/make.sh                                             |    8 
 u-boot/examples/standalone/Makefile                        |    1 
 u-boot/arch/arm/include/asm/arch-rockchip/fit.h            |    2 
 u-boot/examples/standalone/rkspi.c                         |  454 
 u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c |   81 
 u-boot/include/dt-bindings/clock/rk3528-cru.h              |  754 
 u-boot/configs/rk3588-qnx_defconfig                        |  212 
 u-boot/include/dt-bindings/suspend/rockchip-rk3528.h       |   54 
 u-boot/drivers/mmc/dw_mmc.c                                |   78 
 u-boot/drivers/video/drm/dw_mipi_dsi.c                     |   19 
 u-boot/drivers/video/drm/dw_mipi_dsi2.c                    |  248 
 u-boot/include/linux/dw_hdmi.h                             |    3 
 u-boot/cmd/Kconfig                                         |   17 
 u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c              |   38 
 u-boot/configs/rv1126-spi-nor-tiny_defconfig               |    1 
 u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S             |    4 
 u-boot/configs/rv1106-display.config                       |    2 
 u-boot/include/image.h                                     |   14 
 u-boot/cmd/bootfit.c                                       |    1 
 u-boot/common/Kconfig                                      |   12 
 u-boot/drivers/mmc/rockchip_dw_mmc.c                       |    2 
 u-boot/include/android_image.h                             |    6 
 u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c          |   41 
 u-boot/examples/standalone/README_rkspi.md                 |  126 
 u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h      |    2 
 u-boot/drivers/mtd/ubi/debug.h                             |    9 
 u-boot/arch/arm/dts/rk3562.dtsi                            | 2325 +
 u-boot/fs/ubifs/debug.h                                    |   24 
 u-boot/arch/arm/mach-rockchip/uimage.c                     |   67 
 u-boot/include/scsi.h                                      |    4 
 u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c              |  494 
 u-boot/drivers/watchdog/rockchip_wdt.c                     |   11 
 u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h     |   76 
 u-boot/drivers/misc/rk3528-secure-otp.S                    | 15901 ++++++++++
 u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h   |   11 
 u-boot/include/configs/rv1106_common.h                     |    1 
 u-boot/common/image-fit.c                                  |    1 
 u-boot/drivers/Kconfig                                     |    2 
 u-boot/drivers/core/fdtaddr.c                              |   10 
 u-boot/drivers/rkflash/sfc_nor.c                           |   23 
 u-boot/configs/rk3326_defconfig                            |    4 
 u-boot/drivers/ufs/cdns-platform.c                         |  125 
 u-boot/configs/rk3126_defconfig                            |    1 
 u-boot/drivers/pinctrl/Kconfig                             |    8 
 u-boot/include/asm-generic/u-boot.h                        |    2 
 u-boot/scripts/fit-core.sh                                 |   39 
 u-boot/arch/arm/mach-rockchip/board.c                      |  202 
 u-boot/board/rockchip/evb_rk3528/evb_rk3528.c              |   33 
 u-boot/cmd/cache.c                                         |   28 
 u-boot/drivers/video/drm/analogix_dp.c                     |   52 
 u-boot/configs/rv1126-ipc.config                           |    2 
 u-boot/arch/arm/mach-rockchip/pstore.c                     |    2 
 u-boot/include/configs/rv1126_common.h                     |    2 
 u-boot/drivers/mtd/nand/spi/gigadevice.c                   |  202 
 u-boot/lib/rsa/rsa-sign.c                                  |   21 
 u-boot/drivers/video/drm/rockchip_vop.c                    |   31 
 u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c               |   12 
 u-boot/include/drm_modes.h                                 |   94 
 u-boot/drivers/power/regulator/regulator-uclass.c          |   92 
 u-boot/drivers/video/drm/rockchip_vop.h                    |    5 
 u-boot/cmd/ddr_tool/io_map.c                               |    0 
 u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h     |  211 
 u-boot/cmd/ddr_tool/io_map.h                               |    6 
 u-boot/cmd/ddr_tool/memtester/tests.h                      |    5 
 u-boot/drivers/mtd/spi/spi-nor-ids.c                       |  186 
 u-boot/drivers/mtd/nand/spi/unim.c                         |    9 
 u-boot/drivers/crypto/rockchip/crypto_v2.c                 |  226 
 u-boot/drivers/input/adc_key.c                             |   62 
 u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h   |   12 
 u-boot/fs/ubifs/io.c                                       |    8 
 u-boot/cmd/ddr_tool/memtester/tests.c                      |    2 
 u-boot/cmd/ddr_tool/memtester/sizes.h                      |    6 
 u-boot/drivers/clk/rockchip/clk_pll.c                      |   23 
 u-boot/lib/sha256.c                                        |   31 
 u-boot/include/irq-platform.h                              |   40 
 u-boot/drivers/video/drm/rohm-bu18rl82.c                   |    1 
 u-boot/drivers/mtd/nand/spi/dosilicon.c                    |   22 
 u-boot/board/rockchip/evb_rk3562/Makefile                  |    7 
 u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c             |   25 
 u-boot/common/spl/spl_boot_image.c                         |  305 
 u-boot/arch/arm/dts/rk3562-pinctrl.dtsi                    | 1872 +
 u-boot/arch/arm/mach-rockchip/Makefile                     |    5 
 u-boot/drivers/adc/rockchip-saradc-v2.c                    |   33 
 u-boot/drivers/gpio/Kconfig                                |   15 
 u-boot/drivers/mmc/rockchip_sdhci.c                        |  212 
 u-boot/drivers/cpu/amp.its                                 |   24 
 u-boot/common/spl/spl_ab.c                                 |   35 
 u-boot/drivers/mmc/mmc-uclass.c                            |   14 
 u-boot/arch/arm/dts/px30.dtsi                              |    7 
 u-boot/arch/arm/dts/rk3128.dtsi                            |   14 
 u-boot/drivers/clk/rockchip/clk_rk3399.c                   |    4 
 u-boot/common/board_r.c                                    |   18 
 u-boot/include/dt-bindings/power/rk3528-power.h            |   18 
 u-boot/drivers/mtd/nand/spi/foresee.c                      |   20 
 u-boot/arch/arm/dts/rk3562-evb.dts                         |   31 
 u-boot/scripts/check-rkconfig.sh                           |   23 
 u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c                 |   21 
 u-boot/arch/arm/lib/crt0_64.S                              |   36 
 u-boot/drivers/video/drm/rockchip_lvds.c                   |   26 
 u-boot/common/spl/Makefile                                 |    3 
 u-boot/drivers/video/drm/panel-maxim-max96752f.c           |  303 
 u-boot/arch/arm/dts/rk3036-sdk.dts                         |   14 
 u-boot/drivers/ufs/ufs.c                                   | 1970 +
 u-boot/configs/rv1106-spi-nor-tb_defconfig                 |   11 
 u-boot/include/charset.h                                   |    3 
 u-boot/drivers/spi/rockchip_sfc.c                          |    2 
 u-boot/drivers/ufs/ufs.h                                   |  917 
 u-boot/include/mmc.h                                       |   10 
 u-boot/drivers/Makefile                                    |    3 
 u-boot/drivers/video/drm/max96755f.c                       |   47 
 u-boot/arch/arm/dts/rv1106.dtsi                            |    2 
 u-boot/configs/rv1106-emmc-tb_defconfig                    |   11 
 u-boot/include/boot_rkimg.h                                |    1 
 u-boot/arch/arm/mach-rockchip/boot_rkimg.c                 |   27 
 u-boot/configs/rk3588-ab.config                            |    3 
 u-boot/include/linux/mtd/spinand.h                         |    2 
 u-boot/drivers/clk/rockchip/clk_rk3568.c                   |   14 
 u-boot/arch/arm/dts/rv1106-evb2.dts                        |   22 
 u-boot/drivers/ram/rockchip/sdram_rk3528.c                 |   21 
 u-boot/drivers/ufs/ufshci-dwc.h                            |   33 
 u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h |   23 
 u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c            |   23 
 u-boot/include/dm/read.h                                   |   17 
 u-boot/include/sdhci.h                                     |   13 
 u-boot/drivers/pci/pcie_dw_rockchip.c                      |   63 
 u-boot/include/max96755f.h                                 |    1 
 u-boot/cmd/ddr_tool/ddr_test/Makefile                      |   20 
 u-boot/arch/arm/mach-rockchip/fit_args.sh                  |    4 
 u-boot/arch/arm/mach-rockchip/spl.c                        |   12 
 u-boot/arch/arm/cpu/armv8/sha1_ce_core.S                   |  132 
 u-boot/configs/rk3528-aarch32.config                       |   24 
 u-boot/arch/arm/dts/rk3568.dtsi                            |    8 
 u-boot/arch/arm/include/asm/arch-rockchip/clock.h          |    8 
 u-boot/include/max96745.h                                  |   15 
 u-boot/drivers/misc/rockchip-otp.c                         |   10 
 u-boot/include/dm/uclass-id.h                              |    1 
 u-boot/fs/ubifs/ubifs.h                                    |    8 
 u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c                   |   21 
 u-boot/arch/arm/lib/bootm.c                                |    9 
 u-boot/configs/rk-amp.config                               |    3 
 u-boot/drivers/i2c/muxes/Kconfig                           |    7 
 u-boot/include/asm-generic/atomic-long.h                   |    2 
 u-boot/arch/arm/dts/rv1126-u-boot.dtsi                     |    9 
 u-boot/configs/rk3308-amp.config                           |    3 
 u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h     |  196 
 u-boot/configs/rv1106_defconfig                            |    3 
 u-boot/arch/arm/mach-rockchip/kernel_dtb.c                 |  517 
 u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c           |  324 
 u-boot/include/rk_timer_irq.h                              |    6 
 u-boot/arch/arm/dts/rk3562-u-boot.dtsi                     |  203 
 u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c           |  689 
 u-boot/common/spl_mp_boot_rk3528.S                         | 9214 +++++
 u-boot/fs/ubifs/ubifs.c                                    |   18 
 u-boot/drivers/mtd/nand/spi/gsto.c                         |   92 
 u-boot/cmd/mtd.c                                           |   24 
 u-boot/configs/rk312x-rkflash.config                       |    6 
 u-boot/drivers/mmc/mmc.c                                   |   77 
 u-boot/arch/arm/mach-rockchip/rk3528/Makefile              |   11 
 u-boot/usb_update.txt                                      |    4 
 u-boot/drivers/video/drm/max96745.c                        |  105 
 u-boot/drivers/video/drm/rockchip_dw_hdmi.c                |  127 
 u-boot/cmd/ddr_tool/ddr_tool_mp.S                          |  171 
 u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h        |   15 
 u-boot/cmd/boot_android.c                                  |    4 
 u-boot/include/configs/rockchip-common.h                   |    2 
 u-boot/arch/arm/dts/rk3036.dtsi                            |   29 
 u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h   |   12 
 u-boot/arch/arm/dts/rk3128-u-boot.dtsi                     |    5 
 u-boot/lib/avb/libavb/avb_sha512.c                         |   59 
 u-boot/drivers/video/drm/dw_hdmi_qp.c                      |   66 
 u-boot/configs/rk3528_defconfig                            |  201 
 u-boot/arch/arm/Kconfig                                    |    4 
 u-boot/drivers/mtd/nand/spi/Kconfig                        |   12 
 u-boot/configs/rk3128x_defconfig                           |    2 
 u-boot/arch/arm/mach-rockchip/fit_misc.c                   |   34 
 u-boot/configs/rk3128_defconfig                            |    5 
 u-boot/common/board_info.c                                 |    1 
 u-boot/drivers/thermal/rockchip_thermal.c                  |  283 
 u-boot/arch/arm/mach-rockchip/resource_img.c               |  705 
 u-boot/board/rockchip/evb_rk3562/evb_rk3562.c              |   33 
 u-boot/configs/rk3568_defconfig                            |    2 
 u-boot/drivers/pinctrl/rockchip/Makefile                   |    2 
 u-boot/disk/Kconfig                                        |    8 
 u-boot/include/dt-bindings/soc/rockchip,boot-mode.h        |    2 
 u-boot/common/image-sparse.c                               |   17 
 u-boot/arch/arm/mach-rockchip/resource_hwid.c              |    9 
 u-boot/common/bootm.c                                      |    2 
 u-boot/include/power/rk8xx_pmic.h                          |    2 
 u-boot/arch/arm/mach-rockchip/rk3562/Kconfig               |   17 
 u-boot/cmd/ddr_tool/ddr_tool_common.c                      |    9 
 u-boot/drivers/ufs/ufshcd-dwc.h                            |   23 
 u-boot/fs/ubifs/tnc.c                                      |   25 
 u-boot/scripts/README.rockchip                             |    2 
 u-boot/cmd/ddr_tool/ddr_tool_common.h                      |    6 
 u-boot/drivers/clk/rockchip/clk_rk3588.c                   |   34 
 u-boot/drivers/rng/rockchip_rng.c                          |  143 
 u-boot/arch/arm/dts/rk3528.dtsi                            | 2184 +
 u-boot/include/dt-bindings/clock/rk3562-cru.h              |  733 
 u-boot/drivers/video/Kconfig                               |   21 
 u-boot/include/rockchip/crypto_v2.h                        |    2 
 u-boot/cmd/ddr_tool/ddr_dq_eye/ddr_dq_eye.c                |    0 
 u-boot/cmd/ufs.c                                           |   37 
 u-boot/drivers/ufs/ufshcd-dwc.c                            |  149 
 u-boot/drivers/mtd/nand/spi/jsc.c                          |    9 
 u-boot/drivers/gpio/rk_gpio.c                              |   11 
 /dev/null                                                  |   66 
 u-boot/Kconfig                                             |   15 
 u-boot/drivers/video/drm/drm_modes.c                       |   52 
 410 files changed, 91,241 insertions(+), 3,840 deletions(-)

diff --git a/u-boot/Kconfig b/u-boot/Kconfig
index b92331e..5489509 100644
--- a/u-boot/Kconfig
+++ b/u-boot/Kconfig
@@ -203,6 +203,18 @@
 	  SHA256 variant is supported: SHA512 and others are not currently
 	  supported in U-Boot.
 
+config FIT_ENABLE_RSA4096_SUPPORT
+	bool "Support RSA4096 verification of FIT image contents"
+	select RSA_SOFTWARE_EXP if !DM_CRYPTO
+	default n
+	help
+	  Enable this to support RSA4096 checksum of FIT image contents. A
+	  RSA4096 is a 4096-bit (512-byte) key used to check that
+	  check if the content comes from an encryption party. RSA4096 is one
+	  of algorithms recommended for use in secure applications since (as at 2016)
+	  there is no known feasible attack that could produce a 'collision' with differing
+	  input data. Use this for the higher security than RSA2048 in default.
+
 config FIT_SIGNATURE
 	bool "Enable signature verification of FIT uImages"
 	depends on DM
@@ -278,6 +290,9 @@
 	  Say y here if you want to enable fit image structure and data
 	  print.
 
+config FIT_OMIT_UBOOT
+	bool "Omit u-boot-nodtb.bin and u-boot.dtb when output uboot.itb"
+
 if SPL
 
 config SPL_FIT
diff --git a/u-boot/arch/arm/Kconfig b/u-boot/arch/arm/Kconfig
index 5152615..374817b 100644
--- a/u-boot/arch/arm/Kconfig
+++ b/u-boot/arch/arm/Kconfig
@@ -343,6 +343,10 @@
 	help
 	  This ARM64 system supports AArch32 execution state.
 
+config ARM_SMP
+	bool "Enable ARM Symmetric Multiprocessing"
+	default n
+
 choice
 	prompt "Target select"
 	default TARGET_HIKEY
diff --git a/u-boot/arch/arm/cpu/armv7/start.S b/u-boot/arch/arm/cpu/armv7/start.S
index ed631e9..218625e 100644
--- a/u-boot/arch/arm/cpu/armv7/start.S
+++ b/u-boot/arch/arm/cpu/armv7/start.S
@@ -164,7 +164,9 @@
 	mrc	p15, 0, r0, c1, c0, 0
 	bic	r0, r0, #0x00002000	@ clear bits 13 (--V-)
 	bic	r0, r0, #0x00000007	@ clear bits 2:0 (-CAM)
+#if 0 /* There is unalign access when decompress firmware. */
 	orr	r0, r0, #0x00000002	@ set bit 1 (--A-) Align
+#endif
 	orr	r0, r0, #0x00000800	@ set bit 11 (Z---) BTB
 #ifdef CONFIG_SYS_ICACHE_OFF
 	bic	r0, r0, #0x00001000	@ clear bit 12 (I) I-cache
diff --git a/u-boot/arch/arm/cpu/armv8/Kconfig b/u-boot/arch/arm/cpu/armv8/Kconfig
index 8e4c3dd..38efe90 100644
--- a/u-boot/arch/arm/cpu/armv8/Kconfig
+++ b/u-boot/arch/arm/cpu/armv8/Kconfig
@@ -143,4 +143,19 @@
 
 endif
 
+menuconfig ARMV8_CRYPTO
+	bool "ARM64 Accelerated Cryptographic Algorithms"
+
+if ARMV8_CRYPTO
+
+config ARMV8_CE_SHA1
+	bool "SHA-1 digest algorithm (ARMv8 Crypto Extensions)"
+	default y if SHA1
+
+config ARMV8_CE_SHA256
+	bool "SHA-256 digest algorithm (ARMv8 Crypto Extensions)"
+	default y if SHA256
+
+endif
+
 endif
diff --git a/u-boot/arch/arm/cpu/armv8/Makefile b/u-boot/arch/arm/cpu/armv8/Makefile
index c200dc2..0140f22 100644
--- a/u-boot/arch/arm/cpu/armv8/Makefile
+++ b/u-boot/arch/arm/cpu/armv8/Makefile
@@ -36,3 +36,5 @@
 obj-$(CONFIG_TARGET_HIKEY) += hisilicon/
 obj-$(CONFIG_ARMV8_PSCI) += psci.o
 obj-$(CONFIG_ARCH_SUNXI) += lowlevel_init.o
+obj-$(CONFIG_ARMV8_CE_SHA1) += sha1_ce_glue.o sha1_ce_core.o
+obj-$(CONFIG_ARMV8_CE_SHA256) += sha256_ce_glue.o sha256_ce_core.o
diff --git a/u-boot/arch/arm/cpu/armv8/sha1_ce_core.S b/u-boot/arch/arm/cpu/armv8/sha1_ce_core.S
new file mode 100644
index 0000000..fbf2714
--- /dev/null
+++ b/u-boot/arch/arm/cpu/armv8/sha1_ce_core.S
@@ -0,0 +1,132 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * sha1_ce_core.S - SHA-1 secure hash using ARMv8 Crypto Extensions
+ *
+ * Copyright (C) 2014 Linaro Ltd <ard.biesheuvel@linaro.org>
+ * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org>
+ */
+
+#include <config.h>
+#include <linux/linkage.h>
+#include <asm/system.h>
+#include <asm/macro.h>
+
+	.text
+	.arch		armv8-a+crypto
+
+	k0		.req	v0
+	k1		.req	v1
+	k2		.req	v2
+	k3		.req	v3
+
+	t0		.req	v4
+	t1		.req	v5
+
+	dga		.req	q6
+	dgav		.req	v6
+	dgb		.req	s7
+	dgbv		.req	v7
+
+	dg0q		.req	q12
+	dg0s		.req	s12
+	dg0v		.req	v12
+	dg1s		.req	s13
+	dg1v		.req	v13
+	dg2s		.req	s14
+
+	.macro		add_only, op, ev, rc, s0, dg1
+	.ifc		\ev, ev
+	add		t1.4s, v\s0\().4s, \rc\().4s
+	sha1h		dg2s, dg0s
+	.ifnb		\dg1
+	sha1\op		dg0q, \dg1, t0.4s
+	.else
+	sha1\op		dg0q, dg1s, t0.4s
+	.endif
+	.else
+	.ifnb		\s0
+	add		t0.4s, v\s0\().4s, \rc\().4s
+	.endif
+	sha1h		dg1s, dg0s
+	sha1\op		dg0q, dg2s, t1.4s
+	.endif
+	.endm
+
+	.macro		add_update, op, ev, rc, s0, s1, s2, s3, dg1
+	sha1su0		v\s0\().4s, v\s1\().4s, v\s2\().4s
+	add_only	\op, \ev, \rc, \s1, \dg1
+	sha1su1		v\s0\().4s, v\s3\().4s
+	.endm
+
+	.macro		loadrc, k, val, tmp
+	movz		\tmp, :abs_g0_nc:\val
+	movk		\tmp, :abs_g1:\val
+	dup		\k, \tmp
+	.endm
+
+	/*
+	 * void sha1_armv8_ce_process(uint32_t state[5], uint8_t const *src,
+	 * 			      uint32_t blocks)
+	 */
+ENTRY(sha1_armv8_ce_process)
+	/* load round constants */
+	loadrc		k0.4s, 0x5a827999, w6
+	loadrc		k1.4s, 0x6ed9eba1, w6
+	loadrc		k2.4s, 0x8f1bbcdc, w6
+	loadrc		k3.4s, 0xca62c1d6, w6
+
+	/* load state (4+1 digest states) */
+	ld1		{dgav.4s}, [x0]
+	ldr		dgb, [x0, #16]
+
+	/* load input (64 bytes into v8->v11 16B vectors) */
+0:	ld1		{v8.4s-v11.4s}, [x1], #64
+	sub		w2, w2, #1
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+	rev32		v8.16b, v8.16b
+	rev32		v9.16b, v9.16b
+	rev32		v10.16b, v10.16b
+	rev32		v11.16b, v11.16b
+#endif
+
+1:	add		t0.4s, v8.4s, k0.4s
+	mov		dg0v.16b, dgav.16b
+
+	add_update	c, ev, k0,  8,  9, 10, 11, dgb
+	add_update	c, od, k0,  9, 10, 11,  8
+	add_update	c, ev, k0, 10, 11,  8,  9
+	add_update	c, od, k0, 11,  8,  9, 10
+	add_update	c, ev, k1,  8,  9, 10, 11
+
+	add_update	p, od, k1,  9, 10, 11,  8
+	add_update	p, ev, k1, 10, 11,  8,  9
+	add_update	p, od, k1, 11,  8,  9, 10
+	add_update	p, ev, k1,  8,  9, 10, 11
+	add_update	p, od, k2,  9, 10, 11,  8
+
+	add_update	m, ev, k2, 10, 11,  8,  9
+	add_update	m, od, k2, 11,  8,  9, 10
+	add_update	m, ev, k2,  8,  9, 10, 11
+	add_update	m, od, k2,  9, 10, 11,  8
+	add_update	m, ev, k3, 10, 11,  8,  9
+
+	add_update	p, od, k3, 11,  8,  9, 10
+	add_only	p, ev, k3,  9
+	add_only	p, od, k3, 10
+	add_only	p, ev, k3, 11
+	add_only	p, od
+
+	/* update state */
+	add		dgbv.2s, dgbv.2s, dg1v.2s
+	add		dgav.4s, dgav.4s, dg0v.4s
+
+	/* loop on next block? */
+	cbz		w2, 2f
+	b		0b
+
+	/* store new state */
+2:	st1		{dgav.4s}, [x0]
+	str		dgb, [x0, #16]
+	mov		w0, w2
+	ret
+ENDPROC(sha1_armv8_ce_process)
diff --git a/u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c b/u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c
new file mode 100644
index 0000000..780b119
--- /dev/null
+++ b/u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * sha1_ce_glue.c - SHA-1 secure hash using ARMv8 Crypto Extensions
+ *
+ * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org>
+ */
+
+#include <common.h>
+#include <u-boot/sha1.h>
+
+extern void sha1_armv8_ce_process(uint32_t state[5], uint8_t const *src,
+				  uint32_t blocks);
+
+void sha1_process(sha1_context *ctx, const unsigned char *data,
+		  unsigned int blocks)
+{
+	if (!blocks)
+		return;
+
+	sha1_armv8_ce_process(ctx->state, data, blocks);
+}
diff --git a/u-boot/arch/arm/cpu/armv8/sha256_ce_core.S b/u-boot/arch/arm/cpu/armv8/sha256_ce_core.S
new file mode 100644
index 0000000..fbae3ca
--- /dev/null
+++ b/u-boot/arch/arm/cpu/armv8/sha256_ce_core.S
@@ -0,0 +1,134 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * sha256-ce-core.S - core SHA-256 transform using v8 Crypto Extensions
+ *
+ * Copyright (C) 2014 Linaro Ltd <ard.biesheuvel@linaro.org>
+ * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org>
+ */
+
+ #include <config.h>
+ #include <linux/linkage.h>
+ #include <asm/system.h>
+ #include <asm/macro.h>
+
+	.text
+	.arch		armv8-a+crypto
+
+	dga		.req	q20
+	dgav		.req	v20
+	dgb		.req	q21
+	dgbv		.req	v21
+
+	t0		.req	v22
+	t1		.req	v23
+
+	dg0q		.req	q24
+	dg0v		.req	v24
+	dg1q		.req	q25
+	dg1v		.req	v25
+	dg2q		.req	q26
+	dg2v		.req	v26
+
+	.macro		add_only, ev, rc, s0
+	mov		dg2v.16b, dg0v.16b
+	.ifeq		\ev
+	add		t1.4s, v\s0\().4s, \rc\().4s
+	sha256h		dg0q, dg1q, t0.4s
+	sha256h2	dg1q, dg2q, t0.4s
+	.else
+	.ifnb		\s0
+	add		t0.4s, v\s0\().4s, \rc\().4s
+	.endif
+	sha256h		dg0q, dg1q, t1.4s
+	sha256h2	dg1q, dg2q, t1.4s
+	.endif
+	.endm
+
+	.macro		add_update, ev, rc, s0, s1, s2, s3
+	sha256su0	v\s0\().4s, v\s1\().4s
+	add_only	\ev, \rc, \s1
+	sha256su1	v\s0\().4s, v\s2\().4s, v\s3\().4s
+	.endm
+
+	/*
+	 * The SHA-256 round constants
+	 */
+	.align		4
+.Lsha2_rcon:
+	.word		0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5
+	.word		0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5
+	.word		0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3
+	.word		0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
+	.word		0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc
+	.word		0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da
+	.word		0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7
+	.word		0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967
+	.word		0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13
+	.word		0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85
+	.word		0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3
+	.word		0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070
+	.word		0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5
+	.word		0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3
+	.word		0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208
+	.word		0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+
+	/*
+	 * void sha256_armv8_ce_process(struct sha256_ce_state *sst,
+	 * 				uint8_t const *src, uint32_t blocks)
+	 */
+ENTRY(sha256_armv8_ce_process)
+	/* load round constants */
+	adr		x8, .Lsha2_rcon
+	ld1		{ v0.4s- v3.4s}, [x8], #64
+	ld1		{ v4.4s- v7.4s}, [x8], #64
+	ld1		{ v8.4s-v11.4s}, [x8], #64
+	ld1		{v12.4s-v15.4s}, [x8]
+
+	/* load state */
+	ldp		dga, dgb, [x0]
+
+	/* load input */
+0:	ld1		{v16.4s-v19.4s}, [x1], #64
+	sub		w2, w2, #1
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+	rev32		v16.16b, v16.16b
+	rev32		v17.16b, v17.16b
+	rev32		v18.16b, v18.16b
+	rev32		v19.16b, v19.16b
+#endif
+
+1:	add		t0.4s, v16.4s, v0.4s
+	mov		dg0v.16b, dgav.16b
+	mov		dg1v.16b, dgbv.16b
+
+	add_update	0,  v1, 16, 17, 18, 19
+	add_update	1,  v2, 17, 18, 19, 16
+	add_update	0,  v3, 18, 19, 16, 17
+	add_update	1,  v4, 19, 16, 17, 18
+
+	add_update	0,  v5, 16, 17, 18, 19
+	add_update	1,  v6, 17, 18, 19, 16
+	add_update	0,  v7, 18, 19, 16, 17
+	add_update	1,  v8, 19, 16, 17, 18
+
+	add_update	0,  v9, 16, 17, 18, 19
+	add_update	1, v10, 17, 18, 19, 16
+	add_update	0, v11, 18, 19, 16, 17
+	add_update	1, v12, 19, 16, 17, 18
+
+	add_only	0, v13, 17
+	add_only	1, v14, 18
+	add_only	0, v15, 19
+	add_only	1
+
+	/* update state */
+	add		dgav.4s, dgav.4s, dg0v.4s
+	add		dgbv.4s, dgbv.4s, dg1v.4s
+
+	/* handled all input blocks? */
+	cbnz		w2, 0b
+
+	/* store new state */
+3:	stp		dga, dgb, [x0]
+	ret
+ENDPROC(sha256_armv8_ce_process)
diff --git a/u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c b/u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c
new file mode 100644
index 0000000..67dd796
--- /dev/null
+++ b/u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * sha256_ce_glue.c - SHA-256 secure hash using ARMv8 Crypto Extensions
+ *
+ * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org>
+ */
+
+#include <common.h>
+#include <u-boot/sha256.h>
+
+extern void sha256_armv8_ce_process(uint32_t state[8], uint8_t const *src,
+				    uint32_t blocks);
+
+void sha256_process(sha256_context *ctx, const unsigned char *data,
+		    unsigned int blocks)
+{
+	if (!blocks)
+		return;
+
+	sha256_armv8_ce_process(ctx->state, data, blocks);
+}
diff --git a/u-boot/arch/arm/cpu/armv8/start.S b/u-boot/arch/arm/cpu/armv8/start.S
index 8447fc6..f84932d 100644
--- a/u-boot/arch/arm/cpu/armv8/start.S
+++ b/u-boot/arch/arm/cpu/armv8/start.S
@@ -117,6 +117,43 @@
 0:
 
 	/*
+	 * Enable instruction cache (if required), stack pointer,
+	 * data access alignment checks and SError.
+	 */
+#ifndef CONFIG_SYS_ICACHE_OFF
+	mov x1, #CR_I
+#else
+	mov x1, #0
+#endif
+	switch_el x2, 3f, 2f, 1f
+3:	mrs	x0, sctlr_el3
+	orr	x0, x0, x1
+	msr	sctlr_el3, x0
+#ifndef CONFIG_SUPPORT_USBPLUG
+	msr	daifclr, #4			/* Enable SError. SCR_EL3.EA=1 was already set in start.S */
+#endif
+	b	0f
+2:	mrs	x0, sctlr_el2
+	orr	x0, x0, x1
+	msr	sctlr_el2, x0
+
+	mrs	x0, hcr_el2
+	orr	x0, x0, #HCR_EL2_TGE
+	orr	x0, x0, #HCR_EL2_AMO
+#if CONFIG_IS_ENABLED(IRQ)
+	orr	x0, x0, #HCR_EL2_IMO
+#endif
+	msr	hcr_el2, x0
+	msr	daifclr, #4
+	b	0f
+1:	mrs	x0, sctlr_el1
+	orr	x0, x0, x1
+	msr	sctlr_el1, x0
+	msr	daifclr, #4
+0:
+	isb
+
+	/*
 	 * Enable SMPEN bit for coherency.
 	 * This register is not architectural but at the moment
 	 * this bit should be set for A53/A57/A72.
@@ -160,6 +197,43 @@
 	cbz	x0, slave_cpu
 	br	x0			/* branch to the given address */
 #endif /* CONFIG_ARMV8_MULTIENTRY */
+
+#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_ARM_SMP)
+	mrs	x0, mpidr_el1
+	and x0, x0, #0xfff
+	cmp x0, #0
+	beq master_cpu
+
+#ifdef SMP_CPU1
+	cmp x0, #(SMP_CPU1)
+	ldr x1, =(SMP_CPU1_STACK)
+	beq slave_cpu
+#endif
+
+#ifdef SMP_CPU2
+	cmp x0, #(SMP_CPU2)
+	ldr x1, =(SMP_CPU2_STACK)
+	beq slave_cpu
+#endif
+
+#ifdef SMP_CPU3
+	cmp x0, #(SMP_CPU3)
+	ldr x1, =(SMP_CPU3_STACK)
+	beq slave_cpu
+#endif
+	dsb sy
+	isb
+
+loop:
+	wfe
+	b loop
+
+slave_cpu:
+	bic	sp, x1, #0xf
+	bl	smp_entry
+	b	loop
+#endif
+
 master_cpu:
 	bl	_main
 
diff --git a/u-boot/arch/arm/dts/Makefile b/u-boot/arch/arm/dts/Makefile
index b834bc3..0fcc630 100644
--- a/u-boot/arch/arm/dts/Makefile
+++ b/u-boot/arch/arm/dts/Makefile
@@ -453,12 +453,14 @@
 dtb-$(CONFIG_ARCH_STI) += stih410-b2260.dtb
 
 # Compile embeded kernel dts to dtb, and put it behind of u-boot.dtb
+ifeq ($(findstring arch/arm/dts/,$(EMBED_KERN_DTB_PATH)),arch/arm/dts/)
 EMBED_KERN_DTB_PATH := $(CONFIG_EMBED_KERNEL_DTB_PATH:"%"=%)
 EMBED_KERN_DTS_PATH := $(subst dtb,dts, $(EMBED_KERN_DTB_PATH))
 ifneq ($(wildcard $(EMBED_KERN_DTS_PATH)),)
 EMBED_KERN_DTB=$(shell echo $(EMBED_KERN_DTB_PATH) | awk -F '/' '{ print $$NF }')
 dtb-y += $(EMBED_KERN_DTB)
 endif
+endif
 
 targets += $(dtb-y)
 
diff --git a/u-boot/arch/arm/dts/px30-u-boot.dtsi b/u-boot/arch/arm/dts/px30-u-boot.dtsi
index ceda2f4..6c9ac21 100644
--- a/u-boot/arch/arm/dts/px30-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/px30-u-boot.dtsi
@@ -14,6 +14,13 @@
 		u-boot,spl-boot-order = &emmc, &sdmmc;
 		stdout-path = &uart2;
 	};
+
+	secure-otp@ff110000 {
+		compatible = "rockchip,px30-secure-otp";
+		reg = <0x0 0xff110000 0x0 0x4000>;
+		secure_conf = <0xff11C008>;
+		mask_addr = <0xff2d0000>;
+	};
 };
 
 &psci {
diff --git a/u-boot/arch/arm/dts/px30.dtsi b/u-boot/arch/arm/dts/px30.dtsi
index e105f4f..bffbbff 100644
--- a/u-boot/arch/arm/dts/px30.dtsi
+++ b/u-boot/arch/arm/dts/px30.dtsi
@@ -288,13 +288,6 @@
 		status = "disabled";
 	};
 
-	secure_otp: secure_otp@ff110000 {
-		compatible = "rockchip,px30-secure-otp";
-		reg = <0x0 0xff110000 0x0 0x4000>;
-		secure_conf = <0xff11C008>;
-		mask_addr = <0xff2d0000>;
-	};
-
 	gic: interrupt-controller@ff131000 {
 		compatible = "arm,gic-400";
 		#interrupt-cells = <3>;
diff --git a/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi b/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi
index ca97e45..b848d5e 100644
--- a/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi
@@ -37,3 +37,31 @@
 	status = "okay";
 };
 
+&pinctrl {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&gpio0 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&gpio1 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&gpio2 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&usb2phy {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&usb_otg {
+	u-boot,dm-pre-reloc;
+};
diff --git a/u-boot/arch/arm/dts/rk3036-sdk.dts b/u-boot/arch/arm/dts/rk3036-sdk.dts
index e881387..8a53690 100644
--- a/u-boot/arch/arm/dts/rk3036-sdk.dts
+++ b/u-boot/arch/arm/dts/rk3036-sdk.dts
@@ -7,6 +7,7 @@
 /dts-v1/;
 
 #include "rk3036.dtsi"
+#include <dt-bindings/input/input.h>
 
 / {
 	model = "SDK-RK3036";
@@ -37,6 +38,19 @@
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 	};
+
+	gpio-keys {
+		u-boot,dm-pre-reloc;
+		compatible = "gpio-keys";
+		status = "okay";
+
+		volume-up {
+			u-boot,dm-pre-reloc;
+			linux,code = <KEY_VOLUMEUP>;
+			label = "Volume Up";
+			gpios = <&gpio2 23 GPIO_ACTIVE_LOW>;
+		};
+	};
 };
 
 &i2c1 {
diff --git a/u-boot/arch/arm/dts/rk3036.dtsi b/u-boot/arch/arm/dts/rk3036.dtsi
index 10ee7b8..b24a219 100644
--- a/u-boot/arch/arm/dts/rk3036.dtsi
+++ b/u-boot/arch/arm/dts/rk3036.dtsi
@@ -223,6 +223,35 @@
 	grf: syscon@20008000 {
 		compatible = "rockchip,rk3036-grf", "syscon";
 		reg = <0x20008000 0x1000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		usb2phy: usb2-phy@17c {
+			compatible = "rockchip,rk3036-usb2phy";
+			reg = <0x017c 0x0c>;
+			clocks = <&cru SCLK_OTGPHY0>;
+			clock-names = "phyclk";
+			#clock-cells = <0>;
+			clock-output-names = "usb480m_phy";
+			status = "disabled";
+
+			u2phy_otg: otg-port {
+				#phy-cells = <0>;
+				interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
+					<GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>,
+					<GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+				interrupt-names = "otg-bvalid", "otg-id",
+						"linestate";
+				status = "disabled";
+			};
+
+			u2phy_host: host-port {
+				#phy-cells = <0>;
+				interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+				interrupt-names = "linestate";
+				status = "disabled";
+			};
+		};
 	};
 
 	usb_otg: usb@10180000 {
diff --git a/u-boot/arch/arm/dts/rk3128-u-boot.dtsi b/u-boot/arch/arm/dts/rk3128-u-boot.dtsi
index 654bf3e..0173a15 100644
--- a/u-boot/arch/arm/dts/rk3128-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/rk3128-u-boot.dtsi
@@ -39,6 +39,11 @@
 	};
 };
 
+&sfc {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
 &emmc {
 	u-boot,dm-pre-reloc;
 	status = "okay";
diff --git a/u-boot/arch/arm/dts/rk3128.dtsi b/u-boot/arch/arm/dts/rk3128.dtsi
index 9e4d387..5ef71de 100644
--- a/u-boot/arch/arm/dts/rk3128.dtsi
+++ b/u-boot/arch/arm/dts/rk3128.dtsi
@@ -222,6 +222,18 @@
 		reg = <0x20000110 0x24>;
 		#reset-cells = <1>;
 	};
+
+	sfc: sfc@1020c000 {
+		compatible ="rockchip,rksfc","rockchip,sfc";
+		reg = <0x1020c000 0x8000>;
+		interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_SFC>, <&cru HCLK_SFC>;
+		clock-names = "clk_sfc", "hclk_sfc";
+		assigned-clocks = <&cru SCLK_SFC>;
+		assigned-clock-rates = <60000000>;
+		status = "disabled";
+	};
+
 	nandc: nandc@10500000 {
 		compatible = "rockchip,rk-nandc";
 		reg = <0x10500000 0x4000>;
@@ -590,6 +602,8 @@
 	grf: syscon@20008000 {
 		compatible = "rockchip,rk3128-grf", "syscon";
 		reg = <0x20008000 0x1000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
 
 		lvds: lvds {
 			compatible = "rockchip,rk3126-lvds";
diff --git a/u-boot/arch/arm/dts/rk3308-u-boot.dtsi b/u-boot/arch/arm/dts/rk3308-u-boot.dtsi
index 90ccefe..dc565b1 100644
--- a/u-boot/arch/arm/dts/rk3308-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/rk3308-u-boot.dtsi
@@ -14,6 +14,14 @@
 		stdout-path = &uart2;
 		u-boot,spl-boot-order = &sdmmc, &spi_nand, &spi_nor, &nandc, &emmc;
 	};
+
+	secure-otp@ff2a8000 {
+		compatible = "rockchip,rk3308-secure-otp";
+		reg = <0x0 0xff2a8000 0x0 0x4000>;
+		secure_conf = <0xff2b0004>;
+		mask_addr = <0xff540000>;
+		u-boot,dm-pre-reloc;
+	};
 };
 
 &psci {
@@ -121,10 +129,6 @@
 &saradc {
 	u-boot,dm-pre-reloc;
 	status = "okay";
-};
-
-&secure_otp {
-	u-boot,dm-pre-reloc;
 };
 
 &uart0 {
diff --git a/u-boot/arch/arm/dts/rk3308.dtsi b/u-boot/arch/arm/dts/rk3308.dtsi
index ff989ef..acdb47f 100644
--- a/u-boot/arch/arm/dts/rk3308.dtsi
+++ b/u-boot/arch/arm/dts/rk3308.dtsi
@@ -264,13 +264,6 @@
 		status = "disabled";
 	};
 
-	secure_otp: secure_otp@0xff2a8000 {
-		compatible = "rockchip,rk3308-secure-otp";
-		reg = <0x0 0xff2a8000 0x0 0x4000>;
-		secure_conf = <0xff2b0004>;
-		mask_addr = <0xff540000>;
-	};
-
 	vop: vop@ff2e0000 {
 		compatible = "rockchip,rk3308-vop";
 		reg = <0x0 0xff2e0000 0x0 0x1fc>, <0x0 0xff2e0a00 0x0 0x400>;
diff --git a/u-boot/arch/arm/dts/rk3528-evb.dts b/u-boot/arch/arm/dts/rk3528-evb.dts
new file mode 100644
index 0000000..600601a
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3528-evb.dts
@@ -0,0 +1,31 @@
+/*
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * (C) Copyright 2020 Rockchip Electronics Co., Ltd
+ */
+
+/dts-v1/;
+#include "rk3528.dtsi"
+#include "rk3528-u-boot.dtsi"
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "Rockchip RK3528 Evaluation Board";
+	compatible = "rockchip,rk3528-evb", "rockchip,rk3528";
+
+	adc-keys {
+		compatible = "adc-keys";
+		io-channels = <&saradc 1>;
+		io-channel-names = "buttons";
+		keyup-threshold-microvolt = <1800000>;
+		u-boot,dm-pre-reloc;
+		status = "okay";
+
+		volumeup-key {
+			u-boot,dm-pre-reloc;
+			linux,code = <KEY_VOLUMEUP>;
+			label = "volume up";
+			press-threshold-microvolt = <9>;
+		};
+	};
+};
diff --git a/u-boot/arch/arm/dts/rk3528-pinctrl.dtsi b/u-boot/arch/arm/dts/rk3528-pinctrl.dtsi
new file mode 100644
index 0000000..063606a
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3528-pinctrl.dtsi
@@ -0,0 +1,1241 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#include <dt-bindings/pinctrl/rockchip.h>
+#include "rockchip-pinconf.dtsi"
+
+/*
+ * This file is auto generated by pin2dts tool, please keep these code
+ * by adding changes at end of this file.
+ */
+&pinctrl {
+	arm {
+		arm_pins: arm-pins {
+			rockchip,pins =
+				/* arm_avs */
+				<4 RK_PC4 3 &pcfg_pull_none>;
+		};
+	};
+
+	can0 {
+		can0m0_pins: can0m0-pins {
+			rockchip,pins =
+				/* can0_rx_m0 */
+				<4 RK_PA0 3 &pcfg_pull_none>,
+				/* can0_tx_m0 */
+				<4 RK_PA1 3 &pcfg_pull_none>;
+		};
+
+		can0m1_pins: can0m1-pins {
+			rockchip,pins =
+				/* can0_rx_m1 */
+				<4 RK_PC6 3 &pcfg_pull_none>,
+				/* can0_tx_m1 */
+				<4 RK_PC5 3 &pcfg_pull_none>;
+		};
+	};
+
+	can1 {
+		can1m0_pins: can1m0-pins {
+			rockchip,pins =
+				/* can1_rx_m0 */
+				<4 RK_PA2 4 &pcfg_pull_none>,
+				/* can1_tx_m0 */
+				<4 RK_PA3 4 &pcfg_pull_none>;
+		};
+
+		can1m1_pins: can1m1-pins {
+			rockchip,pins =
+				/* can1_rx_m1 */
+				<4 RK_PB0 4 &pcfg_pull_none>,
+				/* can1_tx_m1 */
+				<4 RK_PB1 4 &pcfg_pull_none>;
+		};
+	};
+
+	can2 {
+		can2m0_pins: can2m0-pins {
+			rockchip,pins =
+				/* can2_rx_m0 */
+				<1 RK_PB3 2 &pcfg_pull_none>,
+				/* can2_tx_m0 */
+				<1 RK_PB2 2 &pcfg_pull_none>;
+		};
+
+		can2m1_pins: can2m1-pins {
+			rockchip,pins =
+				/* can2_rx_m1 */
+				<3 RK_PA5 5 &pcfg_pull_none>,
+				/* can2_tx_m1 */
+				<3 RK_PA4 5 &pcfg_pull_none>;
+		};
+	};
+
+	can3 {
+		can3m0_pins: can3m0-pins {
+			rockchip,pins =
+				/* can3_rx_m0 */
+				<1 RK_PB5 2 &pcfg_pull_none>,
+				/* can3_tx_m0 */
+				<1 RK_PB4 2 &pcfg_pull_none>;
+		};
+
+		can3m1_pins: can3m1-pins {
+			rockchip,pins =
+				/* can3_rx_m1 */
+				<3 RK_PB3 2 &pcfg_pull_none>,
+				/* can3_tx_m1 */
+				<3 RK_PB2 2 &pcfg_pull_none>;
+		};
+	};
+
+	clk {
+		clkm0_32k_out: clkm0-32k-out {
+			rockchip,pins =
+				/* clkm0_32k_out */
+				<3 RK_PC3 3 &pcfg_pull_none>;
+		};
+
+		clkm1_32k_out: clkm1-32k-out {
+			rockchip,pins =
+				/* clkm1_32k_out */
+				<1 RK_PC3 1 &pcfg_pull_none>;
+		};
+	};
+
+	emmc {
+		emmc_rstnout: emmc-rstnout {
+			rockchip,pins =
+				/* emmc_rstn */
+				<1 RK_PD6 1 &pcfg_pull_none>;
+		};
+
+		emmc_bus8: emmc-bus8 {
+			rockchip,pins =
+				/* emmc_d0 */
+				<1 RK_PC4 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d1 */
+				<1 RK_PC5 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d2 */
+				<1 RK_PC6 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d3 */
+				<1 RK_PC7 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d4 */
+				<1 RK_PD0 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d5 */
+				<1 RK_PD1 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d6 */
+				<1 RK_PD2 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d7 */
+				<1 RK_PD3 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		emmc_clk: emmc-clk {
+			rockchip,pins =
+				/* emmc_clk */
+				<1 RK_PD5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		emmc_cmd: emmc-cmd {
+			rockchip,pins =
+				/* emmc_cmd */
+				<1 RK_PD4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		emmc_strb: emmc-strb {
+			rockchip,pins =
+				/* emmc_strb */
+				<1 RK_PD7 1 &pcfg_pull_none>;
+		};
+	};
+
+	eth {
+		eth_pins: eth-pins {
+			rockchip,pins =
+				/* eth_clk_25m_out */
+				<3 RK_PB5 2 &pcfg_pull_none>;
+		};
+	};
+
+	fephy {
+		fephym0_led_dpx: fephym0-led_dpx {
+			rockchip,pins =
+				/* fephy_led_dpx_m0 */
+				<4 RK_PB5 2 &pcfg_pull_none>;
+		};
+
+		fephym0_led_link: fephym0-led_link {
+			rockchip,pins =
+				/* fephy_led_link_m0 */
+				<4 RK_PC0 2 &pcfg_pull_none>;
+		};
+
+		fephym0_led_spd: fephym0-led_spd {
+			rockchip,pins =
+				/* fephy_led_spd_m0 */
+				<4 RK_PB7 2 &pcfg_pull_none>;
+		};
+
+		fephym1_led_dpx: fephym1-led_dpx {
+			rockchip,pins =
+				/* fephy_led_dpx_m1 */
+				<2 RK_PA4 5 &pcfg_pull_none>;
+		};
+
+		fephym1_led_link: fephym1-led_link {
+			rockchip,pins =
+				/* fephy_led_link_m1 */
+				<2 RK_PA6 5 &pcfg_pull_none>;
+		};
+
+		fephym1_led_spd: fephym1-led_spd {
+			rockchip,pins =
+				/* fephy_led_spd_m1 */
+				<2 RK_PA5 5 &pcfg_pull_none>;
+		};
+	};
+
+	fspi {
+		fspi_pins: fspi-pins {
+			rockchip,pins =
+				/* fspi_clk */
+				<1 RK_PD5 2 &pcfg_pull_none>,
+				/* fspi_d0 */
+				<1 RK_PC4 2 &pcfg_pull_none>,
+				/* fspi_d1 */
+				<1 RK_PC5 2 &pcfg_pull_none>,
+				/* fspi_d2 */
+				<1 RK_PC6 2 &pcfg_pull_none>,
+				/* fspi_d3 */
+				<1 RK_PC7 2 &pcfg_pull_none>;
+		};
+
+		fspi_csn0: fspi-csn0 {
+			rockchip,pins =
+				/* fspi_csn0 */
+				<1 RK_PD0 2 &pcfg_pull_none>;
+		};
+		fspi_csn1: fspi-csn1 {
+			rockchip,pins =
+				/* fspi_csn1 */
+				<1 RK_PD1 2 &pcfg_pull_none>;
+		};
+	};
+
+	gpu {
+		gpu_pins: gpu-pins {
+			rockchip,pins =
+				/* gpu_avs */
+				<4 RK_PC3 3 &pcfg_pull_none>;
+		};
+	};
+
+	hdmi {
+		hdmi_pins: hdmi-pins {
+			rockchip,pins =
+				/* hdmi_tx_cec */
+				<0 RK_PA3 1 &pcfg_pull_none>,
+				/* hdmi_tx_hpd */
+				<0 RK_PA2 1 &pcfg_pull_none>,
+				/* hdmi_tx_scl */
+				<0 RK_PA4 1 &pcfg_pull_none>,
+				/* hdmi_tx_sda */
+				<0 RK_PA5 1 &pcfg_pull_none>;
+		};
+	};
+
+	hsm {
+		hsmm0_pins: hsmm0-pins {
+			rockchip,pins =
+				/* hsm_clk_out_m0 */
+				<2 RK_PA2 4 &pcfg_pull_none>;
+		};
+
+		hsmm1_pins: hsmm1-pins {
+			rockchip,pins =
+				/* hsm_clk_out_m1 */
+				<1 RK_PA4 3 &pcfg_pull_none>;
+		};
+	};
+
+	i2c0 {
+		i2c0m0_xfer: i2c0m0-xfer {
+			rockchip,pins =
+				/* i2c0_scl_m0 */
+				<4 RK_PC4 2 &pcfg_pull_none_smt>,
+				/* i2c0_sda_m0 */
+				<4 RK_PC3 2 &pcfg_pull_none_smt>;
+		};
+
+		i2c0m1_xfer: i2c0m1-xfer {
+			rockchip,pins =
+				/* i2c0_scl_m1 */
+				<4 RK_PA1 2 &pcfg_pull_none_smt>,
+				/* i2c0_sda_m1 */
+				<4 RK_PA0 2 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c1 {
+		i2c1m0_xfer: i2c1m0-xfer {
+			rockchip,pins =
+				/* i2c1_scl_m0 */
+				<4 RK_PA3 2 &pcfg_pull_none_smt>,
+				/* i2c1_sda_m0 */
+				<4 RK_PA2 2 &pcfg_pull_none_smt>;
+		};
+
+		i2c1m1_xfer: i2c1m1-xfer {
+			rockchip,pins =
+				/* i2c1_scl_m1 */
+				<4 RK_PC5 4 &pcfg_pull_none_smt>,
+				/* i2c1_sda_m1 */
+				<4 RK_PC6 4 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c2 {
+		i2c2m0_xfer: i2c2m0-xfer {
+			rockchip,pins =
+				/* i2c2_scl_m0 */
+				<0 RK_PA4 2 &pcfg_pull_none_smt>,
+				/* i2c2_sda_m0 */
+				<0 RK_PA5 2 &pcfg_pull_none_smt>;
+		};
+
+		i2c2m1_xfer: i2c2m1-xfer {
+			rockchip,pins =
+				/* i2c2_scl_m1 */
+				<1 RK_PA5 3 &pcfg_pull_none_smt>,
+				/* i2c2_sda_m1 */
+				<1 RK_PA6 3 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c3 {
+		i2c3m0_xfer: i2c3m0-xfer {
+			rockchip,pins =
+				/* i2c3_scl_m0 */
+				<1 RK_PA0 2 &pcfg_pull_none_smt>,
+				/* i2c3_sda_m0 */
+				<1 RK_PA1 2 &pcfg_pull_none_smt>;
+		};
+
+		i2c3m1_xfer: i2c3m1-xfer {
+			rockchip,pins =
+				/* i2c3_scl_m1 */
+				<3 RK_PC1 5 &pcfg_pull_none_smt>,
+				/* i2c3_sda_m1 */
+				<3 RK_PC3 5 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c4 {
+		i2c4_xfer: i2c4-xfer {
+			rockchip,pins =
+				/* i2c4_scl */
+				<2 RK_PA0 4 &pcfg_pull_none_smt>,
+				/* i2c4_sda */
+				<2 RK_PA1 4 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c5 {
+		i2c5m0_xfer: i2c5m0-xfer {
+			rockchip,pins =
+				/* i2c5_scl_m0 */
+				<1 RK_PB2 3 &pcfg_pull_none_smt>,
+				/* i2c5_sda_m0 */
+				<1 RK_PB3 3 &pcfg_pull_none_smt>;
+		};
+
+		i2c5m1_xfer: i2c5m1-xfer {
+			rockchip,pins =
+				/* i2c5_scl_m1 */
+				<1 RK_PD2 3 &pcfg_pull_none_smt>,
+				/* i2c5_sda_m1 */
+				<1 RK_PD3 3 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c6 {
+		i2c6m0_xfer: i2c6m0-xfer {
+			rockchip,pins =
+				/* i2c6_scl_m0 */
+				<3 RK_PB2 5 &pcfg_pull_none_smt>,
+				/* i2c6_sda_m0 */
+				<3 RK_PB3 5 &pcfg_pull_none_smt>;
+		};
+
+		i2c6m1_xfer: i2c6m1-xfer {
+			rockchip,pins =
+				/* i2c6_scl_m1 */
+				<1 RK_PD4 3 &pcfg_pull_none_smt>,
+				/* i2c6_sda_m1 */
+				<1 RK_PD7 3 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c7 {
+		i2c7_xfer: i2c7-xfer {
+			rockchip,pins =
+				/* i2c7_scl */
+				<2 RK_PA5 4 &pcfg_pull_none_smt>,
+				/* i2c7_sda */
+				<2 RK_PA6 4 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2s0 {
+		i2s0m0_pins: i2s0m0-pins {
+			rockchip,pins =
+				/* i2s0_lrck_m0 */
+				<3 RK_PB6 1 &pcfg_pull_none>,
+				/* i2s0_mclk_m0 */
+				<3 RK_PB4 1 &pcfg_pull_none>,
+				/* i2s0_sclk_m0 */
+				<3 RK_PB5 1 &pcfg_pull_none>,
+				/* i2s0_sdi_m0 */
+				<3 RK_PB7 1 &pcfg_pull_none>,
+				/* i2s0_sdo_m0 */
+				<3 RK_PC0 1 &pcfg_pull_none>;
+		};
+
+		i2s0m1_pins: i2s0m1-pins {
+			rockchip,pins =
+				/* i2s0_lrck_m1 */
+				<1 RK_PB6 1 &pcfg_pull_none>,
+				/* i2s0_mclk_m1 */
+				<1 RK_PB4 1 &pcfg_pull_none>,
+				/* i2s0_sclk_m1 */
+				<1 RK_PB5 1 &pcfg_pull_none>,
+				/* i2s0_sdi_m1 */
+				<1 RK_PB7 1 &pcfg_pull_none>,
+				/* i2s0_sdo_m1 */
+				<1 RK_PC0 1 &pcfg_pull_none>;
+		};
+	};
+
+	i2s1 {
+		i2s1_pins: i2s1-pins {
+			rockchip,pins =
+				/* i2s1_lrck */
+				<4 RK_PA6 1 &pcfg_pull_none>,
+				/* i2s1_mclk */
+				<4 RK_PA4 1 &pcfg_pull_none>,
+				/* i2s1_sclk */
+				<4 RK_PA5 1 &pcfg_pull_none>,
+				/* i2s1_sdi0 */
+				<4 RK_PB4 1 &pcfg_pull_none>,
+				/* i2s1_sdi1 */
+				<4 RK_PB3 1 &pcfg_pull_none>,
+				/* i2s1_sdi2 */
+				<4 RK_PA3 1 &pcfg_pull_none>,
+				/* i2s1_sdi3 */
+				<4 RK_PA2 1 &pcfg_pull_none>,
+				/* i2s1_sdo0 */
+				<4 RK_PA7 1 &pcfg_pull_none>,
+				/* i2s1_sdo1 */
+				<4 RK_PB0 1 &pcfg_pull_none>,
+				/* i2s1_sdo2 */
+				<4 RK_PB1 1 &pcfg_pull_none>,
+				/* i2s1_sdo3 */
+				<4 RK_PB2 1 &pcfg_pull_none>;
+		};
+	};
+
+	jtag {
+		jtagm0_pins: jtagm0-pins {
+			rockchip,pins =
+				/* jtag_cpu_tck_m0 */
+				<2 RK_PA2 2 &pcfg_pull_none>,
+				/* jtag_cpu_tms_m0 */
+				<2 RK_PA3 2 &pcfg_pull_none>,
+				/* jtag_mcu_tck_m0 */
+				<2 RK_PA4 2 &pcfg_pull_none>,
+				/* jtag_mcu_tms_m0 */
+				<2 RK_PA5 2 &pcfg_pull_none>;
+		};
+
+		jtagm1_pins: jtagm1-pins {
+			rockchip,pins =
+				/* jtag_cpu_tck_m1 */
+				<4 RK_PD0 2 &pcfg_pull_none>,
+				/* jtag_cpu_tms_m1 */
+				<4 RK_PC7 2 &pcfg_pull_none>,
+				/* jtag_mcu_tck_m1 */
+				<4 RK_PD0 3 &pcfg_pull_none>,
+				/* jtag_mcu_tms_m1 */
+				<4 RK_PC7 3 &pcfg_pull_none>;
+		};
+	};
+
+	pcie {
+		pciem0_pins: pciem0-pins {
+			rockchip,pins =
+				/* pcie_clkreqn_m0 */
+				<3 RK_PA6 5 &pcfg_pull_none>,
+				/* pcie_perstn_m0 */
+				<3 RK_PB0 5 &pcfg_pull_none>,
+				/* pcie_waken_m0 */
+				<3 RK_PA7 5 &pcfg_pull_none>;
+		};
+
+		pciem1_pins: pciem1-pins {
+			rockchip,pins =
+				/* pcie_clkreqn_m1 */
+				<1 RK_PA0 4 &pcfg_pull_none>,
+				/* pcie_perstn_m1 */
+				<1 RK_PA2 4 &pcfg_pull_none>,
+				/* pcie_waken_m1 */
+				<1 RK_PA1 4 &pcfg_pull_none>;
+		};
+	};
+
+	pdm {
+		pdm_clk0: pdm-clk0 {
+			rockchip,pins =
+				/* pdm_clk0 */
+				<4 RK_PB5 3 &pcfg_pull_none>;
+		};
+
+		pdm_clk1: pdm-clk1 {
+			rockchip,pins =
+				/* pdm_clk1 */
+				<4 RK_PA4 3 &pcfg_pull_none>;
+		};
+
+		pdm_sdi0: pdm-sdi0 {
+			rockchip,pins =
+				/* pdm_sdi0 */
+				<4 RK_PB2 3 &pcfg_pull_none>;
+		};
+
+		pdm_sdi1: pdm-sdi1 {
+			rockchip,pins =
+				/* pdm_sdi1 */
+				<4 RK_PB1 3 &pcfg_pull_none>;
+		};
+
+		pdm_sdi2: pdm-sdi2 {
+			rockchip,pins =
+				/* pdm_sdi2 */
+				<4 RK_PB3 3 &pcfg_pull_none>;
+		};
+
+		pdm_sdi3: pdm-sdi3 {
+			rockchip,pins =
+				/* pdm_sdi3 */
+				<4 RK_PC1 3 &pcfg_pull_none>;
+		};
+	};
+
+	pmu {
+		pmu_pins: pmu-pins {
+			rockchip,pins =
+				/* pmu_debug */
+				<4 RK_PA0 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm0 {
+		pwm0m0_pins: pwm0m0-pins {
+			rockchip,pins =
+				/* pwm0_m0 */
+				<4 RK_PC3 1 &pcfg_pull_none>;
+		};
+
+		pwm0m1_pins: pwm0m1-pins {
+			rockchip,pins =
+				/* pwm0_m1 */
+				<1 RK_PA2 5 &pcfg_pull_none>;
+		};
+	};
+
+	pwm1 {
+		pwm1m0_pins: pwm1m0-pins {
+			rockchip,pins =
+				/* pwm1_m0 */
+				<4 RK_PC4 1 &pcfg_pull_none>;
+		};
+
+		pwm1m1_pins: pwm1m1-pins {
+			rockchip,pins =
+				/* pwm1_m1 */
+				<1 RK_PA3 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm2 {
+		pwm2m0_pins: pwm2m0-pins {
+			rockchip,pins =
+				/* pwm2_m0 */
+				<4 RK_PC5 1 &pcfg_pull_none>;
+		};
+
+		pwm2m1_pins: pwm2m1-pins {
+			rockchip,pins =
+				/* pwm2_m1 */
+				<1 RK_PA7 2 &pcfg_pull_none>;
+		};
+	};
+
+	pwm3 {
+		pwm3m0_pins: pwm3m0-pins {
+			rockchip,pins =
+				/* pwm3_m0 */
+				<4 RK_PC6 1 &pcfg_pull_none>;
+		};
+
+		pwm3m1_pins: pwm3m1-pins {
+			rockchip,pins =
+				/* pwm3_m1 */
+				<2 RK_PA4 3 &pcfg_pull_none>;
+		};
+	};
+
+	pwm4 {
+		pwm4m0_pins: pwm4m0-pins {
+			rockchip,pins =
+				/* pwm4_m0 */
+				<4 RK_PB7 1 &pcfg_pull_none>;
+		};
+
+		pwm4m1_pins: pwm4m1-pins {
+			rockchip,pins =
+				/* pwm4_m1 */
+				<1 RK_PA4 2 &pcfg_pull_none>;
+		};
+	};
+
+	pwm5 {
+		pwm5m0_pins: pwm5m0-pins {
+			rockchip,pins =
+				/* pwm5_m0 */
+				<4 RK_PC0 1 &pcfg_pull_none>;
+		};
+
+		pwm5m1_pins: pwm5m1-pins {
+			rockchip,pins =
+				/* pwm5_m1 */
+				<3 RK_PC3 1 &pcfg_pull_none>;
+		};
+	};
+
+	pwm6 {
+		pwm6m0_pins: pwm6m0-pins {
+			rockchip,pins =
+				/* pwm6_m0 */
+				<4 RK_PC1 1 &pcfg_pull_none>;
+		};
+
+		pwm6m1_pins: pwm6m1-pins {
+			rockchip,pins =
+				/* pwm6_m1 */
+				<1 RK_PC3 3 &pcfg_pull_none>;
+		};
+
+		pwm6m2_pins: pwm6m2-pins {
+			rockchip,pins =
+				/* pwm6_m2 */
+				<3 RK_PC1 1 &pcfg_pull_none>;
+		};
+	};
+
+	pwm7 {
+		pwm7m0_pins: pwm7m0-pins {
+			rockchip,pins =
+				/* pwm7_m0 */
+				<4 RK_PC2 1 &pcfg_pull_none>;
+		};
+
+		pwm7m1_pins: pwm7m1-pins {
+			rockchip,pins =
+				/* pwm7_m1 */
+				<1 RK_PC2 2 &pcfg_pull_none>;
+		};
+	};
+
+	pwr {
+		pwr_pins: pwr-pins {
+			rockchip,pins =
+				/* pwr_ctrl0 */
+				<4 RK_PC2 2 &pcfg_pull_none>,
+				/* pwr_ctrl1 */
+				<4 RK_PB6 1 &pcfg_pull_none>;
+		};
+	};
+
+	ref {
+		refm0_pins: refm0-pins {
+			rockchip,pins =
+				/* ref_clk_out_m0 */
+				<0 RK_PA1 1 &pcfg_pull_none>;
+		};
+
+		refm1_pins: refm1-pins {
+			rockchip,pins =
+				/* ref_clk_out_m1 */
+				<3 RK_PC3 6 &pcfg_pull_none>;
+		};
+	};
+
+	rgmii {
+		rgmii_miim: rgmii-miim {
+			rockchip,pins =
+				/* rgmii_mdc */
+				<3 RK_PB6 2 &pcfg_pull_none>,
+				/* rgmii_mdio */
+				<3 RK_PB7 2 &pcfg_pull_none>;
+		};
+
+		rgmii_rx_bus2: rgmii-rx_bus2 {
+			rockchip,pins =
+				/* rgmii_rxd0 */
+				<3 RK_PA3 2 &pcfg_pull_none>,
+				/* rgmii_rxd1 */
+				<3 RK_PA2 2 &pcfg_pull_none>,
+				/* rgmii_rxdv_crs */
+				<3 RK_PC2 2 &pcfg_pull_none>;
+		};
+
+		rgmii_tx_bus2: rgmii-tx_bus2 {
+			rockchip,pins =
+				/* rgmii_txd0 */
+				<3 RK_PA1 2 &pcfg_pull_none>,
+				/* rgmii_txd1 */
+				<3 RK_PA0 2 &pcfg_pull_none>,
+				/* rgmii_txen */
+				<3 RK_PC0 2 &pcfg_pull_none>;
+		};
+
+		rgmii_rgmii_clk: rgmii-rgmii_clk {
+			rockchip,pins =
+				/* rgmii_rxclk */
+				<3 RK_PA5 2 &pcfg_pull_none>,
+				/* rgmii_txclk */
+				<3 RK_PA4 2 &pcfg_pull_none>;
+		};
+
+		rgmii_rgmii_bus: rgmii-rgmii_bus {
+			rockchip,pins =
+				/* rgmii_rxd2 */
+				<3 RK_PA7 2 &pcfg_pull_none>,
+				/* rgmii_rxd3 */
+				<3 RK_PA6 2 &pcfg_pull_none>,
+				/* rgmii_txd2 */
+				<3 RK_PB1 2 &pcfg_pull_none>,
+				/* rgmii_txd3 */
+				<3 RK_PB0 2 &pcfg_pull_none>;
+		};
+
+		rgmii_clk: rgmii-clk {
+			rockchip,pins =
+				/* rgmii_clk */
+				<3 RK_PB4 2 &pcfg_pull_none>;
+		};
+		rgmii_txer: rgmii-txer {
+			rockchip,pins =
+				/* rgmii_txer */
+				<3 RK_PC1 2 &pcfg_pull_none>;
+		};
+	};
+
+	scr {
+		scrm0_pins: scrm0-pins {
+			rockchip,pins =
+				/* scr_clk_m0 */
+				<1 RK_PA2 3 &pcfg_pull_none>,
+				/* scr_data_m0 */
+				<1 RK_PA1 3 &pcfg_pull_none>,
+				/* scr_detn_m0 */
+				<1 RK_PA0 3 &pcfg_pull_none>,
+				/* scr_rstn_m0 */
+				<1 RK_PA3 3 &pcfg_pull_none>;
+		};
+
+		scrm1_pins: scrm1-pins {
+			rockchip,pins =
+				/* scr_clk_m1 */
+				<2 RK_PA5 3 &pcfg_pull_none>,
+				/* scr_data_m1 */
+				<2 RK_PA3 4 &pcfg_pull_none>,
+				/* scr_detn_m1 */
+				<2 RK_PA6 3 &pcfg_pull_none>,
+				/* scr_rstn_m1 */
+				<2 RK_PA4 4 &pcfg_pull_none>;
+		};
+	};
+
+	sdio0 {
+		sdio0_bus4: sdio0-bus4 {
+			rockchip,pins =
+				/* sdio0_d0 */
+				<1 RK_PA0 1 &pcfg_pull_up_drv_level_2>,
+				/* sdio0_d1 */
+				<1 RK_PA1 1 &pcfg_pull_up_drv_level_2>,
+				/* sdio0_d2 */
+				<1 RK_PA2 1 &pcfg_pull_up_drv_level_2>,
+				/* sdio0_d3 */
+				<1 RK_PA3 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdio0_clk: sdio0-clk {
+			rockchip,pins =
+				/* sdio0_clk */
+				<1 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdio0_cmd: sdio0-cmd {
+			rockchip,pins =
+				/* sdio0_cmd */
+				<1 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdio0_det: sdio0-det {
+			rockchip,pins =
+				/* sdio0_det */
+				<1 RK_PA6 1 &pcfg_pull_up>;
+		};
+
+		sdio0_pwren: sdio0-pwren {
+			rockchip,pins =
+				/* sdio0_pwren */
+				<1 RK_PA7 1 &pcfg_pull_none>;
+		};
+	};
+
+	sdio1 {
+		sdio1_bus4: sdio1-bus4 {
+			rockchip,pins =
+				/* sdio1_d0 */
+				<3 RK_PA6 1 &pcfg_pull_up_drv_level_2>,
+				/* sdio1_d1 */
+				<3 RK_PA7 1 &pcfg_pull_up_drv_level_2>,
+				/* sdio1_d2 */
+				<3 RK_PB0 1 &pcfg_pull_up_drv_level_2>,
+				/* sdio1_d3 */
+				<3 RK_PB1 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdio1_clk: sdio1-clk {
+			rockchip,pins =
+				/* sdio1_clk */
+				<3 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdio1_cmd: sdio1-cmd {
+			rockchip,pins =
+				/* sdio1_cmd */
+				<3 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdio1_det: sdio1-det {
+			rockchip,pins =
+				/* sdio1_det */
+				<3 RK_PB3 1 &pcfg_pull_up>;
+		};
+
+		sdio1_pwren: sdio1-pwren {
+			rockchip,pins =
+				/* sdio1_pwren */
+				<3 RK_PB2 1 &pcfg_pull_none>;
+		};
+	};
+
+	sdmmc_pins: sdmmc-pins {
+		sdmmc_bus4: sdmmc-bus4 {
+			rockchip,pins =
+				/* sdmmc_d0 */
+				<2 RK_PA0 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc_d1 */
+				<2 RK_PA1 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc_d2 */
+				<2 RK_PA2 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc_d3 */
+				<2 RK_PA3 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc_clk: sdmmc-clk {
+			rockchip,pins =
+				/* sdmmc_clk */
+				<2 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc_cmd: sdmmc-cmd {
+			rockchip,pins =
+				/* sdmmc_cmd */
+				<2 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc_det: sdmmc-det {
+			rockchip,pins =
+				/* sdmmc_detn */
+				<2 RK_PA6 1 &pcfg_pull_up>;
+		};
+
+		sdmmc_pwren: sdmmc-pwren {
+			rockchip,pins =
+				/* sdmmc_pwren */
+				<4 RK_PA1 1 &pcfg_pull_none>;
+		};
+	};
+
+	spdif {
+		spdifm0_pins: spdifm0-pins {
+			rockchip,pins =
+				/* spdif_tx_m0 */
+				<4 RK_PA0 1 &pcfg_pull_none>;
+		};
+
+		spdifm1_pins: spdifm1-pins {
+			rockchip,pins =
+				/* spdif_tx_m1 */
+				<1 RK_PC3 2 &pcfg_pull_none>;
+		};
+
+		spdifm2_pins: spdifm2-pins {
+			rockchip,pins =
+				/* spdif_tx_m2 */
+				<3 RK_PC3 2 &pcfg_pull_none>;
+		};
+	};
+
+	spi0 {
+		spi0_pins: spi0-pins {
+			rockchip,pins =
+				/* spi0_clk */
+				<4 RK_PB4 2 &pcfg_pull_none>,
+				/* spi0_miso */
+				<4 RK_PB3 2 &pcfg_pull_none>,
+				/* spi0_mosi */
+				<4 RK_PB2 2 &pcfg_pull_none>;
+		};
+
+		spi0_csn0: spi0-csn0 {
+			rockchip,pins =
+				/* spi0_csn0 */
+				<4 RK_PB6 2 &pcfg_pull_none>;
+		};
+		spi0_csn1: spi0-csn1 {
+			rockchip,pins =
+				/* spi0_csn1 */
+				<4 RK_PC1 2 &pcfg_pull_none>;
+		};
+	};
+
+	spi1 {
+		spi1_pins: spi1-pins {
+			rockchip,pins =
+				/* spi1_clk */
+				<1 RK_PB6 2 &pcfg_pull_none>,
+				/* spi1_miso */
+				<1 RK_PC0 2 &pcfg_pull_none>,
+				/* spi1_mosi */
+				<1 RK_PB7 2 &pcfg_pull_none>;
+		};
+
+		spi1_csn0: spi1-csn0 {
+			rockchip,pins =
+				/* spi1_csn0 */
+				<1 RK_PC1 1 &pcfg_pull_none>;
+		};
+		spi1_csn1: spi1-csn1 {
+			rockchip,pins =
+				/* spi1_csn1 */
+				<1 RK_PC2 1 &pcfg_pull_none>;
+		};
+	};
+
+	tsi0 {
+		tsi0_pins: tsi0-pins {
+			rockchip,pins =
+				/* tsi0_clkin */
+				<3 RK_PB2 3 &pcfg_pull_none>,
+				/* tsi0_d0 */
+				<3 RK_PB1 3 &pcfg_pull_none>,
+				/* tsi0_d1 */
+				<3 RK_PB5 3 &pcfg_pull_none>,
+				/* tsi0_d2 */
+				<3 RK_PB6 3 &pcfg_pull_none>,
+				/* tsi0_d3 */
+				<3 RK_PB7 3 &pcfg_pull_none>,
+				/* tsi0_d4 */
+				<3 RK_PA3 3 &pcfg_pull_none>,
+				/* tsi0_d5 */
+				<3 RK_PA2 3 &pcfg_pull_none>,
+				/* tsi0_d6 */
+				<3 RK_PA1 3 &pcfg_pull_none>,
+				/* tsi0_d7 */
+				<3 RK_PA0 3 &pcfg_pull_none>,
+				/* tsi0_fail */
+				<3 RK_PC0 3 &pcfg_pull_none>,
+				/* tsi0_sync */
+				<3 RK_PB4 3 &pcfg_pull_none>,
+				/* tsi0_valid */
+				<3 RK_PB3 3 &pcfg_pull_none>;
+		};
+	};
+
+	tsi1 {
+		tsi1_pins: tsi1-pins {
+			rockchip,pins =
+				/* tsi1_clkin */
+				<3 RK_PA5 3 &pcfg_pull_none>,
+				/* tsi1_d0 */
+				<3 RK_PA4 3 &pcfg_pull_none>,
+				/* tsi1_sync */
+				<3 RK_PA7 3 &pcfg_pull_none>,
+				/* tsi1_valid */
+				<3 RK_PA6 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart0 {
+		uart0m0_xfer: uart0m0-xfer {
+			rockchip,pins =
+				/* uart0_rx_m0 */
+				<4 RK_PC7 1 &pcfg_pull_up>,
+				/* uart0_tx_m0 */
+				<4 RK_PD0 1 &pcfg_pull_up>;
+		};
+
+		uart0m1_xfer: uart0m1-xfer {
+			rockchip,pins =
+				/* uart0_rx_m1 */
+				<2 RK_PA0 2 &pcfg_pull_up>,
+				/* uart0_tx_m1 */
+				<2 RK_PA1 2 &pcfg_pull_up>;
+		};
+	};
+
+	uart1 {
+		uart1m0_xfer: uart1m0-xfer {
+			rockchip,pins =
+				/* uart1_rx_m0 */
+				<4 RK_PA7 2 &pcfg_pull_up>,
+				/* uart1_tx_m0 */
+				<4 RK_PA6 2 &pcfg_pull_up>;
+		};
+
+		uart1m1_xfer: uart1m1-xfer {
+			rockchip,pins =
+				/* uart1_rx_m1 */
+				<4 RK_PC6 2 &pcfg_pull_up>,
+				/* uart1_tx_m1 */
+				<4 RK_PC5 2 &pcfg_pull_up>;
+		};
+
+		uart1_ctsn: uart1-ctsn {
+			rockchip,pins =
+				/* uart1_ctsn */
+				<4 RK_PA4 2 &pcfg_pull_none>;
+		};
+		uart1_rtsn: uart1-rtsn {
+			rockchip,pins =
+				/* uart1_rtsn */
+				<4 RK_PA5 2 &pcfg_pull_none>;
+		};
+	};
+
+	uart2 {
+		uart2m0_xfer: uart2m0-xfer {
+			rockchip,pins =
+				/* uart2_rx_m0 */
+				<3 RK_PA0 1 &pcfg_pull_up>,
+				/* uart2_tx_m0 */
+				<3 RK_PA1 1 &pcfg_pull_up>;
+		};
+
+		uart2m0_ctsn: uart2m0-ctsn {
+			rockchip,pins =
+				/* uart2m0_ctsn */
+				<3 RK_PA3 1 &pcfg_pull_none>;
+		};
+		uart2m0_rtsn: uart2m0-rtsn {
+			rockchip,pins =
+				/* uart2m0_rtsn */
+				<3 RK_PA2 1 &pcfg_pull_none>;
+		};
+
+		uart2m1_xfer: uart2m1-xfer {
+			rockchip,pins =
+				/* uart2_rx_m1 */
+				<1 RK_PB0 1 &pcfg_pull_up>,
+				/* uart2_tx_m1 */
+				<1 RK_PB1 1 &pcfg_pull_up>;
+		};
+
+		uart2m1_ctsn: uart2m1-ctsn {
+			rockchip,pins =
+				/* uart2m1_ctsn */
+				<1 RK_PB3 1 &pcfg_pull_none>;
+		};
+		uart2m1_rtsn: uart2m1-rtsn {
+			rockchip,pins =
+				/* uart2m1_rtsn */
+				<1 RK_PB2 1 &pcfg_pull_none>;
+		};
+	};
+
+	uart3 {
+		uart3m0_xfer: uart3m0-xfer {
+			rockchip,pins =
+				/* uart3_rx_m0 */
+				<4 RK_PB0 2 &pcfg_pull_up>,
+				/* uart3_tx_m0 */
+				<4 RK_PB1 2 &pcfg_pull_up>;
+		};
+
+		uart3m1_xfer: uart3m1-xfer {
+			rockchip,pins =
+				/* uart3_rx_m1 */
+				<4 RK_PB7 3 &pcfg_pull_up>,
+				/* uart3_tx_m1 */
+				<4 RK_PC0 3 &pcfg_pull_up>;
+		};
+
+		uart3_ctsn: uart3-ctsn {
+			rockchip,pins =
+				/* uart3_ctsn */
+				<4 RK_PA3 3 &pcfg_pull_none>;
+		};
+		uart3_rtsn: uart3-rtsn {
+			rockchip,pins =
+				/* uart3_rtsn */
+				<4 RK_PA2 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart4 {
+		uart4_xfer: uart4-xfer {
+			rockchip,pins =
+				/* uart4_rx */
+				<2 RK_PA2 3 &pcfg_pull_up>,
+				/* uart4_tx */
+				<2 RK_PA3 3 &pcfg_pull_up>;
+		};
+
+		uart4_ctsn: uart4-ctsn {
+			rockchip,pins =
+				/* uart4_ctsn */
+				<2 RK_PA1 3 &pcfg_pull_none>;
+		};
+		uart4_rtsn: uart4-rtsn {
+			rockchip,pins =
+				/* uart4_rtsn */
+				<2 RK_PA0 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart5 {
+		uart5m0_xfer: uart5m0-xfer {
+			rockchip,pins =
+				/* uart5_rx_m0 */
+				<1 RK_PA2 2 &pcfg_pull_up>,
+				/* uart5_tx_m0 */
+				<1 RK_PA3 2 &pcfg_pull_up>;
+		};
+
+		uart5m0_ctsn: uart5m0-ctsn {
+			rockchip,pins =
+				/* uart5m0_ctsn */
+				<1 RK_PA6 2 &pcfg_pull_none>;
+		};
+		uart5m0_rtsn: uart5m0-rtsn {
+			rockchip,pins =
+				/* uart5m0_rtsn */
+				<1 RK_PA5 2 &pcfg_pull_none>;
+		};
+
+		uart5m1_xfer: uart5m1-xfer {
+			rockchip,pins =
+				/* uart5_rx_m1 */
+				<1 RK_PD4 2 &pcfg_pull_up>,
+				/* uart5_tx_m1 */
+				<1 RK_PD7 2 &pcfg_pull_up>;
+		};
+
+		uart5m1_ctsn: uart5m1-ctsn {
+			rockchip,pins =
+				/* uart5m1_ctsn */
+				<1 RK_PD3 2 &pcfg_pull_none>;
+		};
+		uart5m1_rtsn: uart5m1-rtsn {
+			rockchip,pins =
+				/* uart5m1_rtsn */
+				<1 RK_PD2 2 &pcfg_pull_none>;
+		};
+	};
+
+	uart6 {
+		uart6m0_xfer: uart6m0-xfer {
+			rockchip,pins =
+				/* uart6_rx_m0 */
+				<3 RK_PA7 4 &pcfg_pull_up>,
+				/* uart6_tx_m0 */
+				<3 RK_PA6 4 &pcfg_pull_up>;
+		};
+
+		uart6m1_xfer: uart6m1-xfer {
+			rockchip,pins =
+				/* uart6_rx_m1 */
+				<3 RK_PC3 4 &pcfg_pull_up>,
+				/* uart6_tx_m1 */
+				<3 RK_PC1 4 &pcfg_pull_up>;
+		};
+
+		uart6_ctsn: uart6-ctsn {
+			rockchip,pins =
+				/* uart6_ctsn */
+				<3 RK_PA4 4 &pcfg_pull_none>;
+		};
+		uart6_rtsn: uart6-rtsn {
+			rockchip,pins =
+				/* uart6_rtsn */
+				<3 RK_PA5 4 &pcfg_pull_none>;
+		};
+	};
+
+	uart7 {
+		uart7m0_xfer: uart7m0-xfer {
+			rockchip,pins =
+				/* uart7_rx_m0 */
+				<3 RK_PB3 4 &pcfg_pull_up>,
+				/* uart7_tx_m0 */
+				<3 RK_PB2 4 &pcfg_pull_up>;
+		};
+
+		uart7m0_ctsn: uart7m0-ctsn {
+			rockchip,pins =
+				/* uart7m0_ctsn */
+				<3 RK_PB0 4 &pcfg_pull_none>;
+		};
+		uart7m0_rtsn: uart7m0-rtsn {
+			rockchip,pins =
+				/* uart7m0_rtsn */
+				<3 RK_PB1 4 &pcfg_pull_none>;
+		};
+
+		uart7m1_xfer: uart7m1-xfer {
+			rockchip,pins =
+				/* uart7_rx_m1 */
+				<1 RK_PB3 4 &pcfg_pull_up>,
+				/* uart7_tx_m1 */
+				<1 RK_PB2 4 &pcfg_pull_up>;
+		};
+
+		uart7m1_ctsn: uart7m1-ctsn {
+			rockchip,pins =
+				/* uart7m1_ctsn */
+				<1 RK_PB0 4 &pcfg_pull_none>;
+		};
+		uart7m1_rtsn: uart7m1-rtsn {
+			rockchip,pins =
+				/* uart7m1_rtsn */
+				<1 RK_PB1 4 &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/u-boot/arch/arm/dts/rk3528-u-boot.dtsi b/u-boot/arch/arm/dts/rk3528-u-boot.dtsi
new file mode 100644
index 0000000..7d09361
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3528-u-boot.dtsi
@@ -0,0 +1,206 @@
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+/ {
+	aliases {
+		mmc0 = &sdhci;
+		mmc1 = &sdmmc;
+	};
+
+	chosen {
+		stdout-path = &uart2;
+		u-boot,spl-boot-order = &sdmmc, &sdhci, &spi_nand, &spi_nor;
+	};
+
+	secure-otp@ffcd0000 {
+		compatible = "rockchip,rk3528-secure-otp";
+		reg = <0x0 0xffcd0000 0x0 0x4000>;
+		secure_conf = <0xff4500c0>;
+		mask_addr = <0x0>;
+		cru_rst_addr = <0xff4a8080>;
+		u-boot,dm-spl;
+		status = "okay";
+	};
+
+};
+
+&grf {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&ioc_grf {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&cru {
+	/delete-property/ assigned-clocks;
+	/delete-property/ assigned-clock-rates;
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&crypto {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&rng {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&psci {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&uart2 {
+	clock-frequency = <24000000>;
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&sfc {
+	u-boot,dm-spl;
+	/delete-property/ pinctrl-names;
+	/delete-property/ pinctrl-0;
+	/delete-property/ assigned-clocks;
+	/delete-property/ assigned-clock-rates;
+	status = "okay";
+
+	#address-cells = <1>;
+	#size-cells = <0>;
+	spi_nand: flash@0 {
+		u-boot,dm-spl;
+		compatible = "spi-nand";
+		reg = <0>;
+		spi-tx-bus-width = <1>;
+		spi-rx-bus-width = <4>;
+		spi-max-frequency = <75000000>;
+	};
+
+	spi_nor: flash@1 {
+		u-boot,dm-spl;
+		compatible = "jedec,spi-nor";
+		label = "sfc_nor";
+		reg = <0>;
+		spi-tx-bus-width = <1>;
+		spi-rx-bus-width = <4>;
+		spi-max-frequency = <100000000>;
+	};
+};
+
+&sdhci {
+	bus-width = <8>;
+	u-boot,dm-spl;
+	/delete-property/ assigned-clocks;
+	/delete-property/ assigned-clock-rates;
+	/delete-property/ pinctrl-names;
+	/delete-property/ pinctrl-0;
+	mmc-hs400-1_8v;
+	mmc-hs400-enhanced-strobe;
+	fixed-emmc-driver-type = <1>;
+	status = "okay";
+};
+
+&sdmmc {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&saradc {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&u2phy_otg {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&usb2phy {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&firmware {
+	u-boot,dm-spl;
+};
+
+&scmi {
+	u-boot,dm-spl;
+};
+
+&scmi_clk {
+	u-boot,dm-spl;
+};
+
+&scmi_shmem {
+	u-boot,dm-spl;
+};
+
+&pinctrl {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&gpio0 {
+	u-boot,dm-spl;
+};
+
+&gpio1 {
+	u-boot,dm-spl;
+};
+
+&gpio2 {
+	u-boot,dm-spl;
+};
+
+&pcfg_pull_none_drv_level_1 {
+	u-boot,dm-spl;
+};
+
+&pcfg_pull_none_drv_level_2 {
+	u-boot,dm-spl;
+};
+
+&pcfg_pull_up_drv_level_1 {
+	u-boot,dm-spl;
+};
+
+&pcfg_pull_up_drv_level_2 {
+	u-boot,dm-spl;
+};
+
+&pcfg_pull_up {
+	u-boot,dm-spl;
+};
+
+&pcfg_pull_none {
+	u-boot,dm-spl;
+};
+
+&sdmmc_pins {
+	u-boot,dm-spl;
+};
+
+&sdmmc_bus4 {
+	u-boot,dm-spl;
+};
+
+&sdmmc_clk {
+	u-boot,dm-spl;
+};
+
+&sdmmc_cmd {
+	u-boot,dm-spl;
+};
+
+&sdmmc_det {
+	u-boot,dm-spl;
+};
diff --git a/u-boot/arch/arm/dts/rk3528.dtsi b/u-boot/arch/arm/dts/rk3528.dtsi
new file mode 100644
index 0000000..3177904
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3528.dtsi
@@ -0,0 +1,2184 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#include <dt-bindings/clock/rk3528-cru.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/phy/phy.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/power/rk3528-power.h>
+#include <dt-bindings/soc/rockchip,boot-mode.h>
+#include <dt-bindings/soc/rockchip-system-status.h>
+#include <dt-bindings/suspend/rockchip-rk3528.h>
+#include <dt-bindings/thermal/thermal.h>
+#include <dt-bindings/display/rockchip-tve.h>
+
+/ {
+	compatible = "rockchip,rk3528";
+
+	interrupt-parent = <&gic>;
+	#address-cells = <2>;
+	#size-cells = <2>;
+
+	aliases {
+		ethernet0 = &gmac0;
+		ethernet1 = &gmac1;
+		gpio0 = &gpio0;
+		gpio1 = &gpio1;
+		gpio2 = &gpio2;
+		gpio3 = &gpio3;
+		gpio4 = &gpio4;
+		i2c0 = &i2c0;
+		i2c1 = &i2c1;
+		i2c2 = &i2c2;
+		i2c3 = &i2c3;
+		i2c4 = &i2c4;
+		i2c5 = &i2c5;
+		i2c6 = &i2c6;
+		i2c7 = &i2c7;
+		serial0 = &uart0;
+		serial1 = &uart1;
+		serial2 = &uart2;
+		serial3 = &uart3;
+		serial4 = &uart4;
+		serial5 = &uart5;
+		serial6 = &uart6;
+		serial7 = &uart7;
+		spi0 = &spi0;
+		spi1 = &spi1;
+		spi2 = &sfc;
+	};
+
+	cpus {
+		#address-cells = <2>;
+		#size-cells = <0>;
+
+		cpu-map {
+			cluster0 {
+				core0 {
+					cpu = <&cpu0>;
+				};
+				core1 {
+					cpu = <&cpu1>;
+				};
+				core2 {
+					cpu = <&cpu2>;
+				};
+				core3 {
+					cpu = <&cpu3>;
+				};
+			};
+		};
+
+		cpu0: cpu@0 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x0>;
+			enable-method = "psci";
+			clocks = <&scmi_clk SCMI_CLK_CPU>;
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP0>;
+		};
+
+		cpu1: cpu@1 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x1>;
+			enable-method = "psci";
+			clocks = <&scmi_clk SCMI_CLK_CPU>;
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP0>;
+		};
+
+		cpu2: cpu@2 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x2>;
+			enable-method = "psci";
+			clocks = <&scmi_clk SCMI_CLK_CPU>;
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP1>;
+		};
+
+		cpu3: cpu@3 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x3>;
+			enable-method = "psci";
+			clocks = <&scmi_clk SCMI_CLK_CPU>;
+			operating-points-v2 = <&cpu0_opp_table>;
+			cpu-idle-states = <&CPU_SLEEP1>;
+		};
+
+		idle-states {
+			entry-method = "psci";
+
+			CPU_SLEEP0: cpu-sleep0 {
+				compatible = "arm,idle-state";
+				local-timer-stop;
+				arm,psci-suspend-param = <0x0010000>;
+				entry-latency-us = <120>;
+				exit-latency-us = <250>;
+				min-residency-us = <900>;
+				status = "disabled";
+			};
+
+			CPU_SLEEP1: cpu-sleep {
+				compatible = "arm,idle-state";
+				local-timer-stop;
+				arm,psci-suspend-param = <0x0010000>;
+				entry-latency-us = <120>;
+				exit-latency-us = <250>;
+				min-residency-us = <900>;
+				status = "okay";
+			};
+		};
+	};
+
+	cpu0_opp_table: cpu0-opp-table {
+		compatible = "operating-points-v2";
+		opp-shared;
+
+		nvmem-cells = <&cpu_leakage>;
+		nvmem-cell-names = "leakage";
+
+		rockchip,pvtm-voltage-sel = <
+			0	1310	0
+			1311	1340	1
+			1341	1370	2
+			1371	1400	3
+			1401	1430	4
+			1431	1460	5
+			1461	9999	6
+		>;
+		rockchip,pvtm-pvtpll;
+		rockchip,pvtm-offset = <0x18>;
+		rockchip,pvtm-sample-time = <1100>;
+		rockchip,pvtm-freq = <1416000>;
+		rockchip,pvtm-volt = <900000>;
+		rockchip,pvtm-ref-temp = <40>;
+		rockchip,pvtm-temp-prop = <0 0>;
+		rockchip,pvtm-thermal-zone = "soc-thermal";
+		rockchip,grf = <&grf>;
+
+		opp-408000000 {
+			opp-hz = /bits/ 64 <408000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			clock-latency-ns = <40000>;
+			opp-suspend;
+		};
+		opp-600000000 {
+			opp-hz = /bits/ 64 <600000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-816000000 {
+			opp-hz = /bits/ 64 <816000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1008000000 {
+			opp-hz = /bits/ 64 <1008000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1200000000 {
+			opp-hz = /bits/ 64 <1200000000>;
+			opp-microvolt = <875000 875000 1100000>;
+			opp-microvolt-L1 = <862500 862500 1100000>;
+			opp-microvolt-L2 = <850000 850000 1100000>;
+			opp-microvolt-L3 = <837500 837500 1100000>;
+			opp-microvolt-L4 = <837500 837500 1100000>;
+			opp-microvolt-L5 = <837500 837500 1100000>;
+			opp-microvolt-L6 = <825000 825000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1416000000 {
+			opp-hz = /bits/ 64 <1416000000>;
+			opp-microvolt = <937500 937500 1100000>;
+			opp-microvolt-L1 = <925000 925000 1100000>;
+			opp-microvolt-L2 = <912500 912500 1100000>;
+			opp-microvolt-L3 = <900000 900000 1100000>;
+			opp-microvolt-L4 = <900000 900000 1100000>;
+			opp-microvolt-L5 = <900000 900000 1100000>;
+			opp-microvolt-L6 = <887500 887500 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1608000000 {
+			opp-hz = /bits/ 64 <1608000000>;
+			opp-microvolt = <1012500 1012500 1100000>;
+			opp-microvolt-L1 = <1000000 1000000 1100000>;
+			opp-microvolt-L2 = <987500 987500 1100000>;
+			opp-microvolt-L3 = <975000 975000 1100000>;
+			opp-microvolt-L4 = <962500 962500 1100000>;
+			opp-microvolt-L5 = <950000 950000 1100000>;
+			opp-microvolt-L6 = <937500 937500 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1800000000 {
+			opp-hz = /bits/ 64 <1800000000>;
+			opp-microvolt = <1062500 1062500 1100000>;
+			opp-microvolt-L1 = <1050000 1050000 1100000>;
+			opp-microvolt-L2 = <1037500 1037500 1100000>;
+			opp-microvolt-L3 = <1025000 1025000 1100000>;
+			opp-microvolt-L4 = <1012500 1012500 1100000>;
+			opp-microvolt-L5 = <1000000 1000000 1100000>;
+			opp-microvolt-L6 = <987500 987500 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-2016000000 {
+			opp-hz = /bits/ 64 <2016000000>;
+			opp-microvolt = <1100000 1100000 1100000>;
+			opp-microvolt-L1 = <1087500 1087500 1100000>;
+			opp-microvolt-L2 = <1075000 1075000 1100000>;
+			opp-microvolt-L3 = <1062500 1062500 1100000>;
+			opp-microvolt-L4 = <1050000 1050000 1100000>;
+			opp-microvolt-L5 = <1037500 1037500 1100000>;
+			opp-microvolt-L6 = <1025000 1025000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+	};
+
+	arm-pmu {
+		compatible = "arm,cortex-a53-pmu";
+		interrupts = <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
+	};
+
+	cpuinfo {
+		compatible = "rockchip,cpuinfo";
+		nvmem-cells = <&otp_id>, <&otp_cpu_version>, <&cpu_code>;
+		nvmem-cell-names = "id", "cpu-version", "cpu-code";
+	};
+
+	display_subsystem: display-subsystem {
+		compatible = "rockchip,display-subsystem";
+		ports = <&vop_out>;
+		status = "disabled";
+	};
+
+	firmware: firmware {
+		scmi: scmi {
+			compatible = "arm,scmi-smc";
+			shmem = <&scmi_shmem>;
+			arm,smc-id = <0x82000010>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			scmi_clk: protocol@14 {
+				reg = <0x14>;
+				#clock-cells = <1>;
+			};
+		};
+	};
+
+	mpp_srv: mpp-srv {
+		compatible = "rockchip,mpp-service";
+		rockchip,taskqueue-count = <5>;
+		rockchip,resetgroup-count = <5>;
+		status = "disabled";
+	};
+
+	psci: psci {
+		compatible = "arm,psci-1.0";
+		method = "smc";
+	};
+
+	rockchip_suspend: rockchip-suspend {
+		compatible = "rockchip,pm-rk3528";
+		status = "disabled";
+		rockchip,sleep-debug-en = <0>;
+		rockchip,sleep-mode-config = <
+			(0
+			| RKPM_SLP_ARMPD
+			)
+		>;
+		rockchip,wakeup-config = <
+			(0
+			| RKPM_CPU0_WKUP_EN
+			| RKPM_GPIO_WKUP_EN
+			)
+		>;
+	};
+
+	rockchip_system_monitor: rockchip-system-monitor {
+		compatible = "rockchip,system-monitor";
+
+		rockchip,thermal-zone = "soc-thermal";
+	};
+
+	thermal_zones: thermal-zones {
+		soc_thermal: soc-thermal {
+			polling-delay-passive = <20>; /* milliseconds */
+			polling-delay = <1000>; /* milliseconds */
+
+			thermal-sensors = <&tsadc 0>;
+			trips {
+				soc_crit: soc-crit {
+					/* millicelsius */
+					temperature = <115000>;
+					/* millicelsius */
+					hysteresis = <2000>;
+					type = "critical";
+				};
+			};
+		};
+	};
+
+	timer {
+		compatible = "arm,armv8-timer";
+		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+	};
+
+	xin24m: xin24m {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <24000000>;
+		clock-output-names = "xin24m";
+	};
+
+	scmi_shmem: scmi-shmem@10f000 {
+		compatible = "arm,scmi-shmem";
+		reg = <0x0 0x0010f000 0x0 0x100>;
+	};
+
+	pcie2x1: pcie@fe4f0000 {
+		compatible = "rockchip,rk3528-pcie", "snps,dw-pcie";
+		#address-cells = <3>;
+		#size-cells = <2>;
+		bus-range = <0x0 0xff>;
+		clocks = <&cru ACLK_PCIE>, <&cru HCLK_PCIE_SLV>,
+			 <&cru HCLK_PCIE_DBI>, <&cru PCLK_CRU_PCIE>,
+			 <&cru CLK_PCIE_AUX>, <&cru PCLK_PCIE>,
+			 <&cru PCLK_PCIE_PHY>;
+		clock-names = "aclk", "hclk_slv",
+			      "hclk_dbi", "pclk_cru",
+			      "aux", "pclk",
+			      "pipe";
+		device_type = "pci";
+		interrupts = <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "msi", "pmc", "sys", "legacy", "msg", "err";
+		#interrupt-cells = <1>;
+		interrupt-map-mask = <0 0 0 7>;
+		interrupt-map = <0 0 0 1 &pcie2x1_intc 0>,
+				<0 0 0 2 &pcie2x1_intc 1>,
+				<0 0 0 3 &pcie2x1_intc 2>,
+				<0 0 0 4 &pcie2x1_intc 3>;
+		linux,pci-domain = <0>;
+		num-ib-windows = <8>;
+		num-ob-windows = <8>;
+		num-viewport = <4>;
+		max-link-speed = <2>;
+		num-lanes = <1>;
+		phys = <&combphy_pu PHY_TYPE_PCIE>;
+		phy-names = "pcie-phy";
+		ranges = <0x00000800 0x0 0xfc000000 0x0 0xfc000000 0x0 0x100000
+			  0x81000000 0x0 0xfc100000 0x0 0xfc100000 0x0 0x100000
+			  0x82000000 0x0 0xfc200000 0x0 0xfc200000 0x0 0x1e00000
+			  0xc3000000 0x1 0x00000000 0x1 0x00000000 0x0 0x40000000>;
+		reg = <0x0 0xfe4f0000 0x0 0x10000>,
+		      <0x1 0x40000000 0x0 0x400000>;
+		reg-names = "pcie-apb", "pcie-dbi";
+		resets = <&cru SRST_RESETN_PCIE_POWER_UP>, <&cru SRST_PRESETN_PCIE>,
+			 <&cru SRST_PRESETN_CRU_PCIE>;
+		reset-names = "pcie", "periph", "preset_cru";
+		status = "disabled";
+
+		pcie2x1_intc: legacy-interrupt-controller {
+			interrupt-controller;
+			#address-cells = <0>;
+			#interrupt-cells = <1>;
+			interrupt-parent = <&gic>;
+			interrupts = <GIC_SPI 155 IRQ_TYPE_EDGE_RISING>;
+		};
+	};
+
+	usbdrd30: usbdrd {
+		compatible = "rockchip,rk3528-dwc3", "rockchip,rk3399-dwc3";
+		clocks = <&cru CLK_REF_USB3OTG>, <&cru CLK_SUSPEND_USB3OTG>,
+			 <&cru ACLK_USB3OTG>;
+		clock-names = "ref_clk", "suspend_clk",
+			      "bus_clk";
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+		status = "disabled";
+
+		usbdrd_dwc3: dwc3@fe500000 {
+			compatible = "snps,dwc3";
+			reg = <0x0 0xfe500000 0x0 0x400000>;
+			interrupts = <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>;
+			dr_mode = "otg";
+			phys = <&u2phy_otg>, <&combphy_pu PHY_TYPE_USB3>;
+			phy-names = "usb2-phy", "usb3-phy";
+			phy_type = "utmi_wide";
+			resets = <&cru SRST_ARESETN_USB3OTG>;
+			reset-names = "usb3-otg";
+			snps,dis_enblslpm_quirk;
+			snps,dis-u1u2-quirk;
+			snps,dis-u2-freeclk-exists-quirk;
+			snps,dis-del-phy-power-chg-quirk;
+			snps,dis-tx-ipgap-linecheck-quirk;
+			snps,xhci-trb-ent-quirk;
+			snps,dis_rxdet_inp3_quirk;
+			quirk-skip-phy-init;
+			status = "disabled";
+		};
+	};
+
+	gic: interrupt-controller@fed01000 {
+		compatible = "arm,gic-400";
+		#interrupt-cells = <3>;
+		#address-cells = <0>;
+		interrupt-controller;
+		reg = <0x0 0xfed01000 0 0x1000>,
+		      <0x0 0xfed02000 0 0x2000>,
+		      <0x0 0xfed04000 0 0x2000>,
+		      <0x0 0xfed06000 0 0x2000>;
+		interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+	};
+
+	usb_host0_ehci: usb@ff100000 {
+		compatible = "generic-ehci";
+		reg = <0x0 0xff100000 0x0 0x40000>;
+		interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru HCLK_USBHOST>,
+			 <&cru HCLK_USBHOST_ARB>,
+			 <&usb2phy>;
+		clock-names = "usbhost", "arbiter", "utmi";
+		phys = <&u2phy_host>;
+		phy-names = "usb2-phy";
+		status = "disabled";
+	};
+
+	usb_host0_ohci: usb@ff140000 {
+		compatible = "generic-ohci";
+		reg = <0x0 0xff140000 0x0 0x40000>;
+		interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru HCLK_USBHOST>,
+			 <&cru HCLK_USBHOST_ARB>,
+			 <&usb2phy>;
+		clock-names = "usbhost", "arbiter", "utmi";
+		phys = <&u2phy_host>;
+		phy-names = "usb2-phy";
+		status = "disabled";
+	};
+
+	debug: debug@ff190000 {
+		compatible = "rockchip,debug";
+		reg = <0x0 0xff190000 0x0 0x1000>,
+		      <0x0 0xff192000 0x0 0x1000>,
+		      <0x0 0xff194000 0x0 0x1000>,
+		      <0x0 0xff196000 0x0 0x1000>;
+	};
+
+	qos_crypto_a: qos@ff200000 {
+		compatible = "syscon";
+		reg = <0x0 0xff200000 0x0 0x20>;
+	};
+
+	qos_crypto_p: qos@ff200080 {
+		compatible = "syscon";
+		reg = <0x0 0xff200080 0x0 0x20>;
+	};
+
+	qos_dcf: qos@ff200100 {
+		compatible = "syscon";
+		reg = <0x0 0xff200100 0x0 0x20>;
+	};
+
+	qos_dft2apb: qos@ff200200 {
+		compatible = "syscon";
+		reg = <0x0 0xff200200 0x0 0x20>;
+	};
+
+	qos_dma2ddr: qos@ff200280 {
+		compatible = "syscon";
+		reg = <0x0 0xff200280 0x0 0x20>;
+	};
+
+	qos_dmac: qos@ff200300 {
+		compatible = "syscon";
+		reg = <0x0 0xff200300 0x0 0x20>;
+	};
+
+	qos_keyreader: qos@ff200380 {
+		compatible = "syscon";
+		reg = <0x0 0xff200380 0x0 0x20>;
+	};
+
+	qos_cpu: qos@ff210000 {
+		compatible = "syscon";
+		reg = <0x0 0xff210000 0x0 0x20>;
+	};
+
+	qos_debug: qos@ff210080 {
+		compatible = "syscon";
+		reg = <0x0 0xff210080 0x0 0x20>;
+	};
+
+	qos_gpu_m0: qos@ff220000 {
+		compatible = "syscon";
+		reg = <0x0 0xff220000 0x0 0x20>;
+	};
+
+	qos_gpu_m1: qos@ff220080 {
+		compatible = "syscon";
+		reg = <0x0 0xff220080 0x0 0x20>;
+	};
+
+	qos_pmu_mcu: qos@ff240000 {
+		compatible = "syscon";
+		reg = <0x0 0xff240000 0x0 0x20>;
+	};
+
+	qos_rkvdec: qos@ff250000 {
+		compatible = "syscon";
+		reg = <0x0 0xff250000 0x0 0x20>;
+	};
+
+	qos_rkvenc: qos@ff260000 {
+		compatible = "syscon";
+		reg = <0x0 0xff260000 0x0 0x20>;
+	};
+
+	qos_gmac0: qos@ff270000 {
+		compatible = "syscon";
+		reg = <0x0 0xff270000 0x0 0x20>;
+	};
+
+	qos_hdcp: qos@ff270080 {
+		compatible = "syscon";
+		reg = <0x0 0xff270080 0x0 0x20>;
+	};
+
+	qos_jpegdec: qos@ff270100 {
+		compatible = "syscon";
+		reg = <0x0 0xff270100 0x0 0x20>;
+	};
+
+	qos_rga2_m0ro: qos@ff270200 {
+		compatible = "syscon";
+		reg = <0x0 0xff270200 0x0 0x20>;
+	};
+
+	qos_rga2_m0wo: qos@ff270280 {
+		compatible = "syscon";
+		reg = <0x0 0xff270280 0x0 0x20>;
+	};
+
+	qos_sdmmc0: qos@ff270300 {
+		compatible = "syscon";
+		reg = <0x0 0xff270300 0x0 0x20>;
+	};
+
+	qos_usb2host: qos@ff270380 {
+		compatible = "syscon";
+		reg = <0x0 0xff270380 0x0 0x20>;
+	};
+
+	qos_vdpp: qos@ff270480 {
+		compatible = "syscon";
+		reg = <0x0 0xff270480 0x0 0x20>;
+	};
+
+	qos_vop: qos@ff270500 {
+		compatible = "syscon";
+		reg = <0x0 0xff270500 0x0 0x20>;
+	};
+
+	qos_emmc: qos@ff280000 {
+		compatible = "syscon";
+		reg = <0x0 0xff280000 0x0 0x20>;
+	};
+
+	qos_fspi: qos@ff280080 {
+		compatible = "syscon";
+		reg = <0x0 0xff280080 0x0 0x20>;
+	};
+
+	qos_gmac1: qos@ff280100 {
+		compatible = "syscon";
+		reg = <0x0 0xff280100 0x0 0x20>;
+	};
+
+	qos_pcie: qos@ff280180 {
+		compatible = "syscon";
+		reg = <0x0 0xff280180 0x0 0x20>;
+	};
+
+	qos_sdio0: qos@ff280200 {
+		compatible = "syscon";
+		reg = <0x0 0xff280200 0x0 0x20>;
+	};
+
+	qos_sdio1: qos@ff280280 {
+		compatible = "syscon";
+		reg = <0x0 0xff280280 0x0 0x20>;
+	};
+
+	qos_tsp: qos@ff280300 {
+		compatible = "syscon";
+		reg = <0x0 0xff280300 0x0 0x20>;
+	};
+
+	qos_usb3otg: qos@ff280380 {
+		compatible = "syscon";
+		reg = <0x0 0xff280380 0x0 0x20>;
+	};
+
+	qos_vpu: qos@ff280400 {
+		compatible = "syscon";
+		reg = <0x0 0xff280400 0x0 0x20>;
+	};
+
+	/*
+	 * Merge all GRF, each independent GRF offset is shown as bellow:
+	 * CORE_GRF:		0xff300000
+	 * GPU_GRF:		0xff310000
+	 * RKVENC_GRF:		0xff320000
+	 * DDR_GRF:		0xff330000
+	 * VPU_GRF:		0xff340000
+	 * COMBO_PIPE_PHY_GRF:	0xff348000
+	 * RKVDEC_GRF:		0xff350000
+	 * VO_GRF:		0xff360000
+	 * PMU_GRF:		0xff370000
+	 * SYS_GRF:		0xff380000
+	 */
+	grf: syscon@ff300000 {
+		compatible = "rockchip,rk3528-grf", "syscon", "simple-mfd";
+		reg = <0x0 0xff300000 0x0 0x90000>;
+
+		grf_cru: grf-clock-controller {
+			compatible = "rockchip,rk3528-grf-cru";
+			#clock-cells = <1>;
+		};
+
+		reboot_mode: reboot-mode {
+			compatible = "syscon-reboot-mode";
+			offset = <0x70200>;
+			mode-bootloader = <BOOT_BL_DOWNLOAD>;
+			mode-charge = <BOOT_CHARGING>;
+			mode-fastboot = <BOOT_FASTBOOT>;
+			mode-loader = <BOOT_BL_DOWNLOAD>;
+			mode-normal = <BOOT_NORMAL>;
+			mode-recovery = <BOOT_RECOVERY>;
+			mode-ums = <BOOT_UMS>;
+			mode-panic = <BOOT_PANIC>;
+			mode-watchdog = <BOOT_WATCHDOG>;
+		};
+	};
+
+	cru: clock-controller@ff4a0000 {
+		compatible = "rockchip,rk3528-cru";
+		reg = <0x0 0xff4a0000 0x0 0x30000>;
+		rockchip,grf = <&grf>;
+		#clock-cells = <1>;
+		#reset-cells = <1>;
+
+		assigned-clocks =
+			<&cru XIN_OSC0_DIV>,
+			<&cru PLL_GPLL>,
+			<&cru PLL_PPLL>,
+			<&cru PLL_CPLL>,
+			<&cru ARMCLK>,
+			<&cru CLK_MATRIX_250M_SRC>,
+			<&cru CLK_MATRIX_500M_SRC>,
+			<&cru CLK_MATRIX_50M_SRC>,
+			<&cru CLK_MATRIX_100M_SRC>,
+			<&cru CLK_MATRIX_150M_SRC>,
+			<&cru CLK_MATRIX_200M_SRC>,
+			<&cru CLK_MATRIX_300M_SRC>,
+			<&cru CLK_MATRIX_339M_SRC>,
+			<&cru CLK_MATRIX_400M_SRC>,
+			<&cru CLK_MATRIX_600M_SRC>,
+			<&cru CLK_PPLL_50M_MATRIX>,
+			<&cru CLK_PPLL_100M_MATRIX>,
+			<&cru CLK_PPLL_125M_MATRIX>,
+			<&cru ACLK_BUS_VOPGL_ROOT>;
+
+		assigned-clock-rates =
+			<32768>,
+			<1188000000>,
+			<1000000000>,
+			<996000000>,
+			<408000000>,
+			<250000000>,
+			<500000000>,
+			<50000000>,
+			<100000000>,
+			<150000000>,
+			<200000000>,
+			<300000000>,
+			<340000000>,
+			<400000000>,
+			<600000000>,
+			<50000000>,
+			<100000000>,
+			<125000000>,
+			<500000000>;
+	};
+
+	ioc_grf: syscon@ff540000 {
+		compatible = "rockchip,rk3528-ioc-grf", "syscon";
+		reg = <0x0 0xff540000 0x0 0x40000>;
+	};
+
+	pmu: power-management@ff600000 {
+		compatible = "rockchip,rk3528-pmu", "syscon", "simple-mfd";
+		reg = <0x0 0xff600000 0x0 0x2000>;
+
+		power: power-controller {
+			compatible = "rockchip,rk3528-power-controller";
+			#power-domain-cells = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+			status = "okay";
+
+			/* These power domains are grouped by VD_GPU */
+			pd_gpu@RK3528_PD_GPU {
+				reg = <RK3528_PD_GPU>;
+				clocks = <&cru ACLK_GPU_MALI>,
+					 <&cru PCLK_GPU_ROOT>;
+				pm_qos = <&qos_gpu_m0>,
+					 <&qos_gpu_m1>;
+			};
+			/* These power domains are grouped by VD_LOGIC */
+			pd_rkvdec@RK3528_PD_RKVDEC {
+				reg = <RK3528_PD_RKVDEC>;
+			};
+			pd_rkvenc@RK3528_PD_RKVENC {
+				reg = <RK3528_PD_RKVENC>;
+			};
+			pd_vo@RK3528_PD_VO {
+				reg = <RK3528_PD_VO>;
+			};
+			pd_vpu@RK3528_PD_VPU {
+				reg = <RK3528_PD_VPU>;
+			};
+		};
+	};
+
+	mailbox: mailbox@ff630000 {
+		compatible = "rockchip,rk3528-mailbox",
+			     "rockchip,rk3368-mailbox";
+		reg = <0x0 0xff630000 0x0 0x200>;
+		interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru PCLK_PMU_MAILBOX>;
+		clock-names = "pclk_mailbox";
+		#mbox-cells = <1>;
+		status = "disabled";
+	};
+
+	gpu: gpu@ff700000 {
+		compatible = "arm,mali-450";
+		reg = <0x0 0xff700000 0x0 0x40000>;
+
+		interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "Mali_GP_IRQ",
+				  "Mali_GP_MMU_IRQ",
+				  "IRQPP",
+				  "Mali_PP0_IRQ",
+				  "Mali_PP0_MMU_IRQ",
+				  "Mali_PP1_IRQ",
+				  "Mali_PP1_MMU_IRQ";
+		clocks = <&scmi_clk SCMI_CLK_GPU>, <&cru ACLK_GPU_MALI>,
+			 <&cru PCLK_GPU_ROOT>;
+		clock-names = "clk_mali", "aclk_gpu_mali", "pclk_gpu";
+		assigned-clocks = <&scmi_clk SCMI_CLK_GPU>;
+		assigned-clock-rates = <300000000>;
+		power-domains = <&power RK3528_PD_GPU>;
+		operating-points-v2 = <&gpu_opp_table>;
+		status = "disabled";
+
+		gpu_power_model: power_model {
+			compatible = "arm,mali-simple-power-model";
+			voltage = <900>;
+			frequency = <500>;
+			static-power = <300>;
+			dynamic-power = <396>;
+			ts = <32000 4700 (-80) 2>;
+			thermal-zone = "soc-thermal";
+		};
+	};
+
+	gpu_opp_table: gpu-opp-table {
+		compatible = "operating-points-v2";
+
+		nvmem-cells = <&gpu_leakage>;
+		nvmem-cell-names = "leakage";
+
+		rockchip,pvtm-voltage-sel = <
+			0	820	0
+			821	840	1
+			841	860	2
+			861	880	3
+			881	900	4
+			901	9999	5
+		>;
+		rockchip,pvtm-pvtpll;
+		rockchip,pvtm-offset = <0x10018>;
+		rockchip,pvtm-sample-time = <1100>;
+		rockchip,pvtm-freq = <700000>;
+		rockchip,pvtm-volt = <900000>;
+		rockchip,pvtm-ref-temp = <40>;
+		rockchip,pvtm-temp-prop = <0 0>;
+		rockchip,pvtm-thermal-zone = "soc-thermal";
+		rockchip,grf = <&grf>;
+
+		opp-300000000 {
+			opp-hz = /bits/ 64 <300000000>;
+			opp-microvolt = <825000 825000 1000000>;
+		};
+		opp-500000000 {
+			opp-hz = /bits/ 64 <500000000>;
+			opp-microvolt = <825000 825000 1000000>;
+		};
+		opp-600000000 {
+			opp-hz = /bits/ 64 <600000000>;
+			opp-microvolt = <825000 825000 1000000>;
+		};
+		opp-700000000 {
+			opp-hz = /bits/ 64 <700000000>;
+			opp-microvolt = <825000 825000 1000000>;
+			opp-microvolt-L0 = <850000 850000 1000000>;
+			opp-microvolt-L1 = <837500 837500 1000000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-800000000 {
+			opp-hz = /bits/ 64 <800000000>;
+			opp-microvolt = <900000 900000 1000000>;
+			opp-microvolt-L1 = <887500 887500 1000000>;
+			opp-microvolt-L2 = <875000 875000 1000000>;
+			opp-microvolt-L3 = <862500 862500 1000000>;
+			opp-microvolt-L4 = <850000 850000 1000000>;
+			opp-microvolt-L5 = <837500 837500 1000000>;
+			clock-latency-ns = <40000>;
+		};
+	};
+
+	rkvdec: rkvdec@ff740100 {
+		compatible = "rockchip,rkv-decoder-v2";
+		reg = <0x0 0xff740100 0x0 0x400>, <0x0 0xff740000 0x0 0x100>;
+		reg-names = "regs", "link";
+		interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "irq_dec";
+		clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, <&cru CLK_HEVC_CA_RKVDEC>;
+		clock-names = "aclk_vcodec", "hclk_vcodec","clk_hevc_cabac";
+		rockchip,normal-rates = <340000000>, <0>, <600000000>;
+		assigned-clocks = <&cru ACLK_RKVDEC>, <&cru CLK_HEVC_CA_RKVDEC>;
+		assigned-clock-rates = <340000000>, <600000000>;
+		resets = <&cru SRST_ARESETN_RKVDEC>, <&cru SRST_HRESETN_RKVDEC>,
+			 <&cru SRST_RESETN_HEVC_CA_RKVDEC>;
+		reset-names = "video_a", "video_h", "video_hevc_cabac";
+		power-domains = <&power RK3528_PD_RKVDEC>;
+		iommus = <&rkvdec_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <0>;
+		rockchip,resetgroup-node = <0>;
+		rockchip,task-capacity = <16>;
+		status = "disabled";
+	};
+
+	rkvdec_mmu: iommu@ff740800 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff740800 0x0 0x40>, <0x0 0xff740900 0x0 0x40>;
+		interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rkvdec_mmu";
+		clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, <&cru CLK_HEVC_CA_RKVDEC>;
+		clock-names = "aclk", "iface", "clk_hevc_cabac";
+		power-domains = <&power RK3528_PD_RKVDEC>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	rkvenc: rkvenc@ff780000 {
+		compatible = "rockchip,rkv-encoder-v2";
+		reg = <0x0 0xff780000 0x0 0x6000>;
+		interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "irq_rkvenc";
+		clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>, <&cru CLK_CORE_RKVENC>;
+		clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core";
+		rockchip,normal-rates = <300000000>, <0>, <300000000>;
+		resets = <&cru SRST_ARESETN_RKVENC>, <&cru SRST_HRESETN_RKVENC>,
+			 <&cru SRST_RESETN_CORE_RKVENC>;
+		reset-names = "video_a", "video_h", "video_core";
+		assigned-clocks = <&cru ACLK_RKVENC>, <&cru CLK_CORE_RKVENC>;
+		assigned-clock-rates = <300000000>, <300000000>;
+		power-domains = <&power RK3528_PD_RKVENC>;
+		iommus = <&rkvenc_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <1>;
+		rockchip,resetgroup-node = <1>;
+		status = "disabled";
+	};
+
+	rkvenc_mmu: iommu@ff78f000 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff78f000 0x0 0x40>;
+		interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rkvenc_mmu";
+		clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>;
+		clock-names = "aclk", "iface";
+		power-domains = <&power RK3528_PD_RKVENC>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	vdpu: vdpu@ff7c0400 {
+		compatible = "rockchip,vpu-decoder-v2";
+		reg = <0x0 0xff7c0400 0x0 0x400>;
+		interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "irq_dec";
+		clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>;
+		clock-names = "aclk_vcodec", "hclk_vcodec";
+		resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>;
+		reset-names = "shared_video_a", "shared_video_h";
+		power-domains = <&power RK3528_PD_VPU>;
+		iommus = <&vdpu_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <2>;
+		rockchip,resetgroup-node = <2>;
+		status = "disabled";
+	};
+
+	vdpu_mmu: iommu@ff7c0800 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff7c0800 0x0 0x40>;
+		interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "vdpu_mmu";
+		clock-names = "aclk", "iface";
+		clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>;
+		power-domains = <&power RK3528_PD_VPU>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	avsd: avsd_plus@ff7c1000 {
+		compatible = "rockchip,avs-plus-decoder";
+		reg = <0x0 0xff7c1000 0x0 0x200>;
+		interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "irq_dec";
+		clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>;
+		clock-names = "aclk_vcodec", "hclk_vcodec";
+		resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>;
+		reset-names = "shared_video_a", "shared_video_h";
+		iommus = <&vdpu_mmu>;
+		power-domains = <&power RK3528_PD_VPU>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <2>;
+		rockchip,resetgroup-node = <2>;
+		status = "disabled";
+	};
+
+	vop: vop@ff840000 {
+		compatible = "rockchip,rk3528-vop";
+		reg = <0x0 0xff840000 0x0 0x3000>,
+		      <0x0 0xff845000 0x0 0x1000>,
+		      <0x0 0xff846400 0x0 0x800>;
+		reg-names = "regs",
+			    "gamma_lut",
+			    "acm_regs";
+		interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_VOP>,
+			 <&cru HCLK_VOP>,
+			 <&cru DCLK_VOP0>,
+			 <&cru DCLK_VOP1>;
+		clock-names = "aclk_vop",
+			      "hclk_vop",
+			      "dclk_vp0",
+			      "dclk_vp1";
+		assigned-clocks = <&cru DCLK_VOP0>;
+		assigned-clock-parents = <&hdmiphy>;
+		iommus = <&vop_mmu>;
+		rockchip,grf = <&grf>;
+		status = "disabled";
+
+		vop_out: ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				reg = <0>;
+
+				vp0_out_hdmi: endpoint@0 {
+					reg = <0>;
+					remote-endpoint = <&hdmi_in_vp0>;
+				};
+			};
+
+			port@1 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				reg = <1>;
+
+				vp1_out_tve: endpoint@0 {
+					reg = <0>;
+					remote-endpoint = <&tve_in_vp1>;
+				};
+			};
+		};
+	};
+
+	vop_mmu: iommu@ff847e00 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff847e00 0x0 0x100>;
+		interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "vop_mmu";
+		clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>;
+		clock-names = "aclk", "iface";
+		#iommu-cells = <0>;
+		rockchip,disable-device-link-resume;
+		rockchip,shootdown-entire;
+		status = "disabled";
+	};
+
+	rga2: rga@ff850000 {
+		compatible = "rockchip,rga2_core0";
+		reg = <0x0 0xff850000 0x0 0x1000>;
+		interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rga2_irq";
+		clocks = <&cru ACLK_RGA2E>, <&cru HCLK_RGA2E>, <&cru CLK_CORE_RGA2E>;
+		clock-names = "aclk_rga2", "hclk_rga2", "clk_rga2";
+		iommus = <&rga2_mmu>;
+		status = "disabled";
+	};
+
+	rga2_mmu: iommu@ff850f00 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff850f00 0x0 0x100>;
+		interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rga2_mmu";
+		clocks = <&cru ACLK_RGA2E>, <&cru HCLK_RGA2E>;
+		clock-names = "aclk", "iface";
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	iep: iep@ff860000 {
+		compatible = "rockchip,iep-v2";
+		reg = <0x0 0xff860000 0x0 0x500>;
+		interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_VDPP>, <&cru HCLK_VDPP>, <&cru CLK_CORE_VDPP>;
+		clock-names = "aclk", "hclk", "sclk";
+		rockchip,normal-rates = <340000000>, <0>, <340000000>;
+		assigned-clocks = <&cru ACLK_VDPP>, <&cru CLK_CORE_VDPP>;
+		assigned-clock-rates = <340000000>, <340000000>;
+		resets = <&cru SRST_ARESETN_VDPP>, <&cru SRST_HRESETN_VDPP>,
+			 <&cru SRST_RESETN_CORE_VDPP>;
+		reset-names = "shared_rst_a", "shared_rst_h", "shared_rst_s";
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <3>;
+		rockchip,resetgroup-node = <3>;
+		power-domains = <&power RK3528_PD_VO>;
+		iommus = <&iep_mmu>;
+		status = "disabled";
+	};
+
+	iep_mmu: iommu@ff860800 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff860800 0x0 0x100>;
+		interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "iep_mmu";
+		clocks = <&cru ACLK_VDPP>, <&cru HCLK_VDPP>;
+		clock-names = "aclk", "iface";
+		#iommu-cells = <0>;
+		power-domains = <&power RK3528_PD_VO>;
+		status = "disabled";
+	};
+
+	vdpp: vdpp@ff861000 {
+		compatible = "rockchip,vdpp-v1";
+		reg = <0x0 0xff861000 0x0 0x100>,  <0x0 0xff862000 0x0 0x900>;
+		reg-names = "vdpp_regs", "zme_regs";
+		interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_VDPP>, <&cru HCLK_VDPP>, <&cru CLK_CORE_VDPP>;
+		clock-names = "aclk", "hclk", "sclk";
+		rockchip,normal-rates = <340000000>, <0>, <340000000>;
+		assigned-clocks = <&cru ACLK_VDPP>, <&cru CLK_CORE_VDPP>;
+		assigned-clock-rates = <340000000>, <340000000>;
+		resets = <&cru SRST_ARESETN_VDPP>, <&cru SRST_HRESETN_VDPP>,
+			 <&cru SRST_RESETN_CORE_VDPP>;
+		reset-names = "shared_rst_a", "shared_rst_h", "shared_rst_s";
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <3>;
+		rockchip,resetgroup-node = <3>;
+		power-domains = <&power RK3528_PD_VO>;
+		iommus = <&iep_mmu>;
+		status = "disabled";
+	};
+
+	jpegd: jpegd@ff870000 {
+		compatible = "rockchip,rkv-jpeg-decoder-v1";
+		reg = <0x0 0xff870000 0x0 0x400>;
+		interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_JPEG_DECODER>, <&cru HCLK_JPEG_DECODER>;
+		clock-names = "aclk_vcodec", "hclk_vcodec";
+		rockchip,disable-auto-freq;
+		resets = <&cru SRST_ARESETN_JPEG_DECODER>, <&cru SRST_HRESETN_JPEG_DECODER>;
+		reset-names = "video_a", "video_h";
+		power-domains = <&power RK3528_PD_VO>;
+		iommus = <&jpegd_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <4>;
+		rockchip,resetgroup-node = <4>;
+		status = "disabled";
+	};
+
+	jpegd_mmu: iommu@ff870480 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff870480 0x0 0x40>;
+		interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "jpegd_mmu";
+		clock-names = "aclk", "iface";
+		clocks = <&cru ACLK_JPEG_DECODER>, <&cru HCLK_JPEG_DECODER>;
+		power-domains = <&power RK3528_PD_VO>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	tve: tve@ff880000 {
+		compatible = "rockchip,rk3528-tve";
+		reg = <0x0 0xff880000 0x0 0x4000>,
+		      <0x0 0xffde0000 0x0 0x300>;
+		interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru HCLK_CVBS>,
+			 <&cru PCLK_VCDCPHY>,
+			 <&cru DCLK_CVBS>,
+			 <&cru DCLK_4X_CVBS>;
+		clock-names = "hclk",
+			      "pclk_vdac",
+			      "dclk",
+			      "dclk_4x";
+		rockchip,lumafilter0 = <0x000a0ffa>;
+		rockchip,lumafilter1 = <0x0ff4001a>;
+		rockchip,lumafilter2 = <0x00110fd2>;
+		rockchip,lumafilter3 = <0x0fe80051>;
+		rockchip,lumafilter4 = <0x001a0f74>;
+		rockchip,lumafilter5 = <0x0fe600ec>;
+		rockchip,lumafilter6 = <0x0ffa0e43>;
+		rockchip,lumafilter7 = <0x08200527>;
+		rockchip,tve-upsample = <DCLK_UPSAMPLEx4>;
+		rockchip,grf = <&grf>;
+		status = "disabled";
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				reg = <0>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				tve_in_vp1: endpoint@0 {
+					reg = <0>;
+					remote-endpoint = <&vp1_out_tve>;
+					status = "disabled";
+				};
+			};
+		};
+	};
+
+	hdcp2: hdcp2@ff8c0000 {
+		compatible = "rockchip,rk3528-hdmi-hdcp2";
+		reg = <0x0 0xff8c0000 0x0 0x2000>;
+		interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_HDCP>, <&cru PCLK_HDCP>,
+			 <&cru HCLK_HDCP>;
+		clock-names ="aclk_hdcp2", "pclk_hdcp2", "hdcp2_clk_hdmi";
+		status = "disabled";
+	};
+
+	hdmi: hdmi@ff8d0000 {
+		compatible = "rockchip,rk3528-dw-hdmi";
+		reg = <0x0 0xff8d0000 0x0 0x20000>,
+		      <0x0 0xff610000 0x0 0x200>;
+		interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru PCLK_HDMI>,
+			 <&cru CLK_SFR_HDMI>,
+			 <&cru CLK_CEC_HDMI>;
+		clock-names = "iahb", "isfr", "cec";
+		reg-io-width = <4>;
+		rockchip,grf = <&grf>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&hdmi_pins>;
+		phys = <&hdmiphy>;
+		phy-names = "hdmi";
+		#sound-dai-cells = <0>;
+		hpd-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
+		status = "disabled";
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				reg = <0>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				hdmi_in_vp0: endpoint@0 {
+					reg = <0>;
+					remote-endpoint = <&vp0_out_hdmi>;
+					status = "disabled";
+				};
+			};
+		};
+	};
+
+	can0: can@ff960000 {
+		compatible = "rockchip,rk3528-can";
+		reg = <0x0 0xff960000 0x0 0x100>;
+		interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+		assigned-clocks = <&cru CLK_CAN0>;
+		assigned-clock-rates = <198000000>;
+		clocks = <&cru CLK_CAN0>, <&cru PCLK_CAN0>;
+		clock-names = "baudclk", "apb_pclk";
+		resets = <&cru SRST_RESETN_CAN0>, <&cru SRST_PRESETN_CAN0>;
+		reset-names = "can", "can-apb";
+		status = "disabled";
+	};
+
+	can1: can@ff970000 {
+		compatible = "rockchip,rk3528-can";
+		reg = <0x0 0xff970000 0x0 0x100>;
+		interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
+		assigned-clocks = <&cru CLK_CAN1>;
+		assigned-clock-rates = <198000000>;
+		clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>;
+		clock-names = "baudclk", "apb_pclk";
+		resets = <&cru SRST_RESETN_CAN1>, <&cru SRST_PRESETN_CAN1>;
+		reset-names = "can", "can-apb";
+		status = "disabled";
+	};
+
+	can2: can@ff980000 {
+		compatible = "rockchip,rk3528-can";
+		reg = <0x0 0xff980000 0x0 0x100>;
+		interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+		assigned-clocks = <&cru CLK_CAN2>;
+		assigned-clock-rates = <198000000>;
+		clocks = <&cru CLK_CAN2>, <&cru PCLK_CAN2>;
+		clock-names = "baudclk", "apb_pclk";
+		resets = <&cru SRST_RESETN_CAN2>, <&cru SRST_PRESETN_CAN2>;
+		reset-names = "can", "can-apb";
+		status = "disabled";
+	};
+
+	can3: can@ff990000 {
+		compatible = "rockchip,rk3528-can";
+		reg = <0x0 0xff990000 0x0 0x100>;
+		interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+		assigned-clocks = <&cru CLK_CAN3>;
+		assigned-clock-rates = <198000000>;
+		clocks = <&cru CLK_CAN3>, <&cru PCLK_CAN3>;
+		clock-names = "baudclk", "apb_pclk";
+		resets = <&cru SRST_RESETN_CAN3>, <&cru SRST_PRESETN_CAN3>;
+		reset-names = "can", "can-apb";
+		status = "disabled";
+	};
+
+	spi0: spi@ff9c0000 {
+		compatible = "rockchip,rk3066-spi";
+		reg = <0x0 0xff9c0000 0x0 0x1000>;
+		interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru CLK_SPI0>, <&cru PCLK_SPI0>;
+		clock-names = "spiclk", "apb_pclk";
+		dmas = <&dmac 25>, <&dmac 24>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&spi0_csn0 &spi0_csn1 &spi0_pins>;
+		status = "disabled";
+	};
+
+	spi1: spi@ff9d0000 {
+		compatible = "rockchip,rk3066-spi";
+		reg = <0x0 0xff9d0000 0x0 0x1000>;
+		interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru CLK_SPI1>, <&cru PCLK_SPI1>;
+		clock-names = "spiclk", "apb_pclk";
+		dmas = <&dmac 31>, <&dmac 30>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&spi1_csn0 &spi1_csn1 &spi1_pins>;
+		status = "disabled";
+	};
+
+	uart0: serial@ff9f0000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff9f0000 0x0 0x100>;
+		interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 9>, <&dmac 8>;
+		status = "disabled";
+	};
+
+	uart1: serial@ff9f8000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff9f8000 0x0 0x100>;
+		interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 11>, <&dmac 10>;
+		status = "disabled";
+	};
+
+	uart2: serial@ffa00000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xffa00000 0x0 0x100>;
+		interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 13>, <&dmac 12>;
+		status = "disabled";
+	};
+
+	uart3: serial@ffa08000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xffa08000 0x0 0x100>;
+		interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 15>, <&dmac 14>;
+		status = "disabled";
+	};
+
+	uart4: serial@ffa10000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xffa10000 0x0 0x100>;
+		interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 17>, <&dmac 16>;
+		status = "disabled";
+	};
+
+	uart5: serial@ffa18000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xffa18000 0x0 0x100>;
+		interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 19>, <&dmac 18>;
+		status = "disabled";
+	};
+
+	uart6: serial@ffa20000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xffa20000 0x0 0x100>;
+		interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART6>, <&cru PCLK_UART6>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 21>, <&dmac 20>;
+		status = "disabled";
+	};
+
+	uart7: serial@ffa28000 {
+		compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xffa28000 0x0 0x100>;
+		interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART7>, <&cru PCLK_UART7>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 23>, <&dmac 22>;
+		status = "disabled";
+	};
+
+	i2c0: i2c@ffa50000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa50000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C0>, <&cru PCLK_I2C0>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c0m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c1: i2c@ffa58000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa58000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c1m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c2: i2c@ffa60000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa60000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C2>, <&cru PCLK_I2C2>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c2m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c3: i2c@ffa68000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa68000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c3m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c4: i2c@ffa70000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa70000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c4_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c5: i2c@ffa78000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa78000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c5m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c6: i2c@ffa80000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa80000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C6>, <&cru PCLK_I2C6>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c6m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c7: i2c@ffa88000 {
+		compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa88000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C7>, <&cru PCLK_I2C7>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c7_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	pwm0: pwm@ffa90000 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa90000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm0m0_pins>;
+		clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm1: pwm@ffa90010 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa90010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm1m0_pins>;
+		clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm2: pwm@ffa90020 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa90020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm2m0_pins>;
+		clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm3: pwm@ffa90030 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa90030 0x0 0x10>;
+		interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm3m0_pins>;
+		clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm4: pwm@ffa98000 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa98000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm4m0_pins>;
+		clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm5: pwm@ffa98010 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa98010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm5m0_pins>;
+		clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm6: pwm@ffa98020 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa98020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm6m0_pins>;
+		clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm7: pwm@ffa98030 {
+		compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xffa98030 0x0 0x10>;
+		interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm7m0_pins>;
+		clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	rktimer: timer@ffab0000 {
+		compatible = "rockchip,rk3528-timer", "rockchip,rk3288-timer";
+		reg = <0x0 0xffab0000 0x0 0x20>;
+		interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru PCLK_TIMER>, <&cru CLK_TIMER0>;
+		clock-names = "pclk", "timer";
+	};
+
+	wdt: watchdog@ffac0000 {
+		compatible = "snps,dw-wdt";
+		reg = <0x0 0xffac0000 0x0 0x100>;
+		clocks = <&cru TCLK_WDT_NS>, <&cru PCLK_WDT_NS>;
+		clock-names = "tclk", "pclk";
+		interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+		status = "disabled";
+	};
+
+	tsadc: tsadc@ffad0000 {
+		compatible = "rockchip,rk3528-tsadc";
+		reg = <0x0 0xffad0000 0x0 0x400>;
+		rockchip,grf = <&grf>;
+		interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>, <&cru PCLK_TSADC>;
+		clock-names = "tsadc", "tsadc_tsen", "apb_pclk";
+		assigned-clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>;
+		assigned-clock-rates = <1200000>, <12000000>;
+		resets = <&cru SRST_RESETN_TSADC>, <&cru SRST_PRESETN_TSADC>;
+		reset-names = "tsadc", "tsadc-apb";
+		#thermal-sensor-cells = <1>;
+		rockchip,hw-tshut-temp = <120000>;
+		rockchip,hw-tshut-mode = <0>; /* tshut mode 0:CRU 1:GPIO */
+		rockchip,hw-tshut-polarity = <0>; /* tshut polarity 0:LOW 1:HIGH */
+		status = "disabled";
+	};
+
+	saradc: saradc@ffae0000 {
+		compatible = "rockchip,rk3528-saradc";
+		reg = <0x0 0xffae0000 0x0 0x10000>;
+		interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
+		#io-channel-cells = <1>;
+		clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;
+		clock-names = "saradc", "apb_pclk";
+		resets = <&cru SRST_PRESETN_SARADC>;
+		reset-names = "saradc-apb";
+		status = "disabled";
+	};
+
+	sai3: sai@ffb70000 {
+		compatible = "rockchip,rk3528-sai", "rockchip,sai-v1";
+		reg = <0x0 0xffb70000 0x0 0x1000>;
+		interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru MCLK_SAI_I2S3>, <&cru HCLK_SAI_I2S3>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac 5>;
+		dma-names = "tx";
+		resets = <&cru SRST_MRESETN_SAI_I2S3>, <&cru SRST_HRESETN_SAI_I2S3>;
+		reset-names = "m", "h";
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	sai0: sai@ffb80000 {
+		compatible = "rockchip,rk3528-sai", "rockchip,sai-v1";
+		reg = <0x0 0xffb80000 0x0 0x1000>;
+		interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru MCLK_SAI_I2S0>, <&cru HCLK_SAI_I2S0>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac 1>, <&dmac 0>;
+		dma-names = "tx", "rx";
+		resets = <&cru SRST_MRESETN_SAI_I2S0>, <&cru SRST_HRESETN_SAI_I2S0>;
+		reset-names = "m", "h";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s0m0_pins>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	sai2: sai@ffb90000 {
+		compatible = "rockchip,rk3528-sai", "rockchip,sai-v1";
+		reg = <0x0 0xffb90000 0x0 0x1000>;
+		interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru MCLK_SAI_I2S2>, <&cru HCLK_SAI_I2S2>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac 4>;
+		dma-names = "tx";
+		resets = <&cru SRST_MRESETN_SAI_I2S2>, <&cru SRST_HRESETN_SAI_I2S2>;
+		reset-names = "m", "h";
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	sai1: sai@ffba0000 {
+		compatible = "rockchip,rk3528-sai", "rockchip,sai-v1";
+		reg = <0x0 0xffba0000 0x0 0x1000>;
+		interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru MCLK_SAI_I2S1>, <&cru HCLK_SAI_I2S1>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac 3>, <&dmac 2>;
+		dma-names = "tx", "rx";
+		resets = <&cru SRST_MRESETN_SAI_I2S1>, <&cru SRST_HRESETN_SAI_I2S1>;
+		reset-names = "m", "h";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s1_pins>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	pdm: pdm@ffbb0000 {
+		compatible = "rockchip,rk3528-pdm", "rockchip,rk3568-pdm";
+		reg = <0x0 0xffbb0000 0x0 0x1000>;
+		clocks = <&cru MCLK_PDM>, <&cru HCLK_PDM>;
+		clock-names = "pdm_clk", "pdm_hclk";
+		dmas = <&dmac 6>;
+		dma-names = "rx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&pdm_clk0
+			     &pdm_clk1
+			     &pdm_sdi0
+			     &pdm_sdi1
+			     &pdm_sdi2
+			     &pdm_sdi3>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	spdif_8ch: spdif@ffbc0000 {
+		compatible = "rockchip,rk3528-spdif", "rockchip,rk3568-spdif";
+		reg = <0x0 0xffbc0000 0x0 0x1000>;
+		interrupts = <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>;
+		dmas = <&dmac 7>;
+		dma-names = "tx";
+		clock-names = "mclk", "hclk";
+		clocks = <&cru MCLK_SPDIF>, <&cru HCLK_SPDIF>;
+		#sound-dai-cells = <0>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&spdifm0_pins>;
+		status = "disabled";
+	};
+
+	gmac0: ethernet@ffbd0000 {
+		compatible = "rockchip,rk3528-gmac", "snps,dwmac-4.20a";
+		reg = <0x0 0xffbd0000 0x0 0x10000>;
+		interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "macirq", "eth_wake_irq";
+		rockchip,grf = <&grf>;
+		clocks = <&cru CLK_GMAC0_SRC>, <&cru CLK_GMAC0_RMII_50M>,
+			 <&cru CLK_GMAC0_RX>, <&cru CLK_GMAC0_TX>,
+			 <&cru PCLK_MAC_VO>, <&cru ACLK_MAC_VO>;
+		clock-names = "stmmaceth", "clk_mac_ref",
+			      "mac_clk_rx", "mac_clk_tx",
+			      "pclk_mac", "aclk_mac";
+		resets = <&cru SRST_ARESETN_MAC_VO>;
+		reset-names = "stmmaceth";
+
+		snps,mixed-burst;
+		snps,tso;
+
+		snps,axi-config = <&gmac0_stmmac_axi_setup>;
+		snps,mtl-rx-config = <&gmac0_mtl_rx_setup>;
+		snps,mtl-tx-config = <&gmac0_mtl_tx_setup>;
+
+		phy-mode = "rmii";
+		clock_in_out = "input";
+		phy-handle = <&rmii0_phy>;
+
+		nvmem-cells = <&macphy_bgs>;
+		nvmem-cell-names = "bgs";
+		status = "disabled";
+
+		mdio0: mdio {
+			compatible = "snps,dwmac-mdio";
+			#address-cells = <0x1>;
+			#size-cells = <0x0>;
+			rmii0_phy: ethernet-phy@2 {
+				compatible = "ethernet-phy-id0044.1400", "ethernet-phy-ieee802.3-c22";
+				reg = <2>;
+				clocks = <&cru CLK_MACPHY>;
+				resets = <&cru SRST_RESETN_MACPHY>;
+				phy-is-integrated;
+				pinctrl-names = "default";
+				pinctrl-0 = <&fephym0_led_link &fephym0_led_spd>;
+				nvmem-cells = <&macphy_txlevel>;
+				nvmem-cell-names = "txlevel";
+			};
+		};
+
+		gmac0_stmmac_axi_setup: stmmac-axi-config {
+			snps,wr_osr_lmt = <4>;
+			snps,rd_osr_lmt = <8>;
+			snps,blen = <0 0 0 0 16 8 4>;
+		};
+
+		gmac0_mtl_rx_setup: rx-queues-config {
+			snps,rx-queues-to-use = <1>;
+			queue0 {};
+		};
+
+		gmac0_mtl_tx_setup: tx-queues-config {
+			snps,tx-queues-to-use = <1>;
+			queue0 {};
+		};
+	};
+
+	gmac1: ethernet@ffbe0000 {
+		compatible = "rockchip,rk3528-gmac", "snps,dwmac-4.20a";
+		reg = <0x0 0xffbe0000 0x0 0x10000>;
+		interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "macirq", "eth_wake_irq";
+		rockchip,grf = <&grf>;
+		clocks = <&cru CLK_GMAC1_SRC_VPU>, <&cru CLK_GMAC1_RMII_VPU>,
+			 <&cru PCLK_MAC_VPU>, <&cru ACLK_MAC_VPU>;
+		clock-names = "stmmaceth", "clk_mac_ref",
+			      "pclk_mac", "aclk_mac";
+		resets = <&cru SRST_ARESETN_MAC>;
+		reset-names = "stmmaceth";
+
+		snps,mixed-burst;
+		snps,tso;
+
+		snps,axi-config = <&gmac1_stmmac_axi_setup>;
+		snps,mtl-rx-config = <&gmac1_mtl_rx_setup>;
+		snps,mtl-tx-config = <&gmac1_mtl_tx_setup>;
+
+		status = "disabled";
+
+		mdio1: mdio {
+			compatible = "snps,dwmac-mdio";
+			#address-cells = <0x1>;
+			#size-cells = <0x0>;
+		};
+
+		gmac1_stmmac_axi_setup: stmmac-axi-config {
+			snps,wr_osr_lmt = <4>;
+			snps,rd_osr_lmt = <8>;
+			snps,blen = <0 0 0 0 16 8 4>;
+		};
+
+		gmac1_mtl_rx_setup: rx-queues-config {
+			snps,rx-queues-to-use = <1>;
+			queue0 {};
+		};
+
+		gmac1_mtl_tx_setup: tx-queues-config {
+			snps,tx-queues-to-use = <1>;
+			queue0 {};
+		};
+	};
+
+	sdhci: mmc@ffbf0000 {
+		compatible = "rockchip,rk3528-dwcmshc";
+		reg = <0x0 0xffbf0000 0x0 0x10000>;
+		interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
+		assigned-clocks = <&cru BCLK_EMMC>, <&cru TCLK_EMMC>, <&cru CCLK_SRC_EMMC>;
+		assigned-clock-rates = <200000000>, <24000000>, <200000000>;
+		clocks = <&cru CCLK_SRC_EMMC>, <&cru HCLK_EMMC>,
+			 <&cru ACLK_EMMC>, <&cru BCLK_EMMC>,
+			 <&cru TCLK_EMMC>;
+		clock-names = "core", "bus", "axi", "block", "timer";
+		resets = <&cru SRST_CRESETN_EMMC>, <&cru SRST_HRESETN_EMMC>,
+			 <&cru SRST_ARESETN_EMMC>, <&cru SRST_BRESETN_EMMC>,
+			 <&cru SRST_TRESETN_EMMC>;
+		reset-names = "core", "bus", "axi", "block", "timer";
+		max-frequency = <200000000>;
+		status = "disabled";
+	};
+
+	sfc: spi@ffc00000 {
+		compatible = "rockchip,sfc";
+		reg = <0x0 0xffc00000 0x0 0x4000>;
+		interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_SFC>, <&cru HCLK_SFC>;
+		clock-names = "clk_sfc", "hclk_sfc";
+		assigned-clocks = <&cru SCLK_SFC>;
+		assigned-clock-rates = <100000000>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	sdio0: mmc@ffc10000 {
+		compatible = "rockchip,rk3528-dw-mshc",
+			     "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xffc10000 0x0 0x4000>;
+		interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
+		max-frequency = <150000000>;
+		clocks = <&cru HCLK_SDIO0>, <&cru CCLK_SRC_SDIO0>,
+			 <&grf_cru SCLK_SDIO0_DRV>, <&grf_cru SCLK_SDIO0_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
+		fifo-depth = <0x100>;
+		resets = <&cru SRST_HRESETN_SDIO0>;
+		reset-names = "reset";
+		rockchip,use-v2-tuning;
+		status = "disabled";
+	};
+
+	sdio1: mmc@ffc20000 {
+		compatible = "rockchip,rk3528-dw-mshc",
+			     "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xffc20000 0x0 0x4000>;
+		interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
+		max-frequency = <150000000>;
+		clocks = <&cru HCLK_SDIO1>, <&cru CCLK_SRC_SDIO1>,
+			 <&grf_cru SCLK_SDIO1_DRV>, <&grf_cru SCLK_SDIO1_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
+		fifo-depth = <0x100>;
+		resets = <&cru SRST_HRESETN_SDIO1>;
+		reset-names = "reset";
+		rockchip,use-v2-tuning;
+		status = "disabled";
+	};
+
+	sdmmc: mmc@ffc30000 {
+		compatible = "rockchip,rk3528-dw-mshc",
+			     "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xffc30000 0x0 0x4000>;
+		interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
+		max-frequency = <150000000>;
+		clocks = <&cru HCLK_SDMMC0>, <&cru CCLK_SRC_SDMMC0>,
+			 <&grf_cru SCLK_SDMMC_DRV>, <&grf_cru SCLK_SDMMC_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
+		fifo-depth = <0x100>;
+		resets = <&cru SRST_HRESETN_SDMMC0>;
+		reset-names = "reset";
+		rockchip,use-v2-tuning;
+		pinctrl-names = "default";
+		pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>;
+		status = "disabled";
+	};
+
+	crypto: crypto@ffc40000 {
+		compatible = "rockchip,crypto-v4";
+		reg = <0x0 0xffc40000 0x0 0x2000>;
+		interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&scmi_clk SCMI_ACLK_CRYPTO>, <&scmi_clk SCMI_HCLK_CRYPTO>,
+			 <&scmi_clk SCMI_CORE_CRYPTO>, <&scmi_clk SCMI_PKA_CRYPTO>;
+		clock-names = "aclk", "hclk", "sclk", "pka";
+		assigned-clocks = <&scmi_clk SCMI_CORE_CRYPTO>, <&scmi_clk SCMI_PKA_CRYPTO>;
+		assigned-clock-rates = <300000000>, <300000000>;
+		resets = <&cru SRST_RESETN_CORE_CRYPTO>;
+		reset-names = "crypto-rst";
+		status = "disabled";
+	};
+
+	rng: rng@ffc50000 {
+		compatible = "rockchip,rkrng";
+		reg = <0x0 0xffc50000 0x0 0x200>;
+		interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&scmi_clk SCMI_HCLK_TRNG>;
+		clock-names = "hclk_trng";
+		resets = <&cru SRST_HRESETN_TRNG_NS>;
+		reset-names = "reset";
+		status = "disabled";
+	};
+
+	otp: otp@ffce0000 {
+		compatible = "rockchip,rk3528-otp";
+		reg = <0x0 0xffce0000 0x0 0x4000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		clocks = <&cru CLK_USER_OTPC_NS>, <&cru CLK_SBPI_OTPC_NS>,
+			 <&cru PCLK_OTPC_NS>;
+		clock-names = "usr", "sbpi", "apb";
+		resets = <&cru SRST_RESETN_USER_OTPC_NS>,
+			 <&cru SRST_RESETN_SBPI_OTPC_NS>,
+			 <&cru SRST_PRESETN_OTPC_NS>;
+		reset-names = "usr", "sbpi", "apb";
+
+		/* Data cells */
+		cpu_code: cpu-code@2 {
+			reg = <0x02 0x2>;
+		};
+		otp_cpu_version: cpu-version@8 {
+			reg = <0x08 0x1>;
+			bits = <3 3>;
+		};
+		otp_id: id@a {
+			reg = <0x0a 0x10>;
+		};
+		cpu_leakage: cpu-leakage@1a {
+			reg = <0x1a 0x1>;
+		};
+		log_leakage: log-leakage@1b {
+			reg = <0x1b 0x1>;
+		};
+		gpu_leakage: gpu-leakage@1c {
+			reg = <0x1c 0x1>;
+		};
+		macphy_bgs: macphy-bgs@2d {
+			reg = <0x2d 0x1>;
+		};
+		macphy_txlevel: macphy-txlevel@2e {
+			reg = <0x2e 0x2>;
+		};
+	};
+
+	dmac: dma-controller@ffd60000 {
+		compatible = "arm,pl330", "arm,primecell";
+		reg = <0x0 0xffd60000 0x0 0x4000>;
+		interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_DMAC>;
+		clock-names = "apb_pclk";
+		#dma-cells = <1>;
+		arm,pl330-periph-burst;
+	};
+
+	hwlock: hwspinlock@ffd70000 {
+		compatible = "rockchip,hwspinlock";
+		reg = <0x0 0xffd70000 0x0 0x100>;
+		#hwlock-cells = <1>;
+		status = "disabled";
+	};
+
+	combphy_pu: phy@ffdc0000 {
+		compatible = "rockchip,rk3528-naneng-combphy";
+		reg = <0x0 0xffdc0000 0x0 0x10000>;
+		#phy-cells = <1>;
+		clocks = <&cru CLK_REF_PCIE_INNER_PHY>, <&cru PCLK_PCIE_PHY>, <&cru PCLK_PIPE_GRF>;
+		clock-names = "refclk", "apbclk", "pipe_clk";
+		assigned-clocks = <&cru CLK_REF_PCIE_INNER_PHY>;
+		assigned-clock-rates = <100000000>;
+		resets = <&cru SRST_PRESETN_PCIE_PHY>, <&cru SRST_RESETN_PCIE_PIPE_PHY>;
+		reset-names = "combphy-apb", "combphy";
+		rockchip,pipe-grf = <&grf>;
+		rockchip,pipe-phy-grf = <&grf>;
+		status = "disabled";
+	};
+
+	usb2phy: usb2-phy@ffdf0000 {
+		compatible = "rockchip,rk3528-usb2phy";
+		reg = <0x0 0xffdf0000 0x0 0x10000>;
+		clocks = <&cru CLK_REF_USBPHY>, <&cru PCLK_USBPHY>;
+		clock-names = "phyclk", "apb_pclk";
+		#clock-cells = <0>;
+		rockchip,usbgrf = <&grf>;
+		status = "disabled";
+
+		u2phy_otg: otg-port {
+			#phy-cells = <0>;
+			interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "otg-bvalid",
+					  "otg-id",
+					  "linestate";
+			status = "disabled";
+		};
+
+		u2phy_host: host-port {
+			#phy-cells = <0>;
+			interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "linestate";
+			status = "disabled";
+		};
+	};
+
+	hdmiphy: hdmiphy@ffe00000 {
+		compatible = "rockchip,rk3528-hdmi-phy";
+		reg = <0x0 0xffe00000 0x0 0x10000>;
+		interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
+		#phy-cells = <0>;
+		clocks = <&cru PCLK_HDMIPHY>, <&xin24m>;
+		clock-names = "sysclk", "refclk";
+		#clock-cells = <0>;
+		clock-output-names = "clk_hdmiphy_pixel_io";
+		status = "disabled";
+	};
+
+	acodec: acodec@ffe10000 {
+		compatible = "rockchip,rk3528-codec";
+		reg = <0x0 0xffe10000 0x0 0x1000>;
+		#sound-dai-cells = <0>;
+		clocks = <&cru PCLK_ACODEC>, <&cru MCLK_ACODEC_TX>;
+		clock-names = "pclk", "mclk";
+		resets = <&cru SRST_PRESETN_ACODEC>;
+		reset-names = "acodec";
+		status = "disabled";
+	};
+
+	pinctrl: pinctrl {
+		compatible = "rockchip,rk3528-pinctrl";
+		rockchip,grf = <&ioc_grf>;
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		gpio0: gpio@ff610000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff610000 0x0 0x200>;
+			interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO0>, <&cru DBCLK_GPIO0>;
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 0 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio1: gpio@ffaf0000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xffaf0000 0x0 0x200>;
+			interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>;
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 32 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio2: gpio@ffb00000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xffb00000 0x0 0x200>;
+			interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO2>, <&cru DBCLK_GPIO2>;
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 64 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio3: gpio@ffb10000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xffb10000 0x0 0x200>;
+			interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>;
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 96 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio4: gpio@ffb20000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xffb20000 0x0 0x200>;
+			interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO4>, <&cru DBCLK_GPIO4>;
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 128 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+	};
+};
+
+#include "rk3528-pinctrl.dtsi"
diff --git a/u-boot/arch/arm/dts/rk3562-evb.dts b/u-boot/arch/arm/dts/rk3562-evb.dts
new file mode 100644
index 0000000..070e7d8
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3562-evb.dts
@@ -0,0 +1,31 @@
+/*
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ */
+
+/dts-v1/;
+#include "rk3562.dtsi"
+#include "rk3562-u-boot.dtsi"
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "Rockchip RK3562 Evaluation Board";
+	compatible = "rockchip,rk3562-evb", "rockchip,rk3562";
+
+	adc-keys {
+		compatible = "adc-keys";
+		io-channels = <&saradc0 1>;
+		io-channel-names = "buttons";
+		keyup-threshold-microvolt = <1800000>;
+		u-boot,dm-pre-reloc;
+		status = "okay";
+
+		volumeup-key {
+			u-boot,dm-pre-reloc;
+			linux,code = <KEY_VOLUMEUP>;
+			label = "volume up";
+			press-threshold-microvolt = <9>;
+		};
+	};
+};
diff --git a/u-boot/arch/arm/dts/rk3562-pinctrl.dtsi b/u-boot/arch/arm/dts/rk3562-pinctrl.dtsi
new file mode 100644
index 0000000..d92da5c
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3562-pinctrl.dtsi
@@ -0,0 +1,1872 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#include <dt-bindings/pinctrl/rockchip.h>
+#include "rockchip-pinconf.dtsi"
+
+/*
+ * This file is auto generated by pin2dts tool, please keep these code
+ * by adding changes at end of this file.
+ */
+&pinctrl {
+	cam {
+		camm0_pins: camm0-pins {
+			rockchip,pins =
+				/* cam_clk0_out_m0 */
+				<3 RK_PB2 2 &pcfg_pull_none>,
+				/* cam_clk1_out_m0 */
+				<3 RK_PB3 2 &pcfg_pull_none>;
+		};
+
+		camm1_pins: camm1-pins {
+			rockchip,pins =
+				/* cam_clk0_out_m1 */
+				<4 RK_PB1 3 &pcfg_pull_none>,
+				/* cam_clk1_out_m1 */
+				<4 RK_PB7 3 &pcfg_pull_none>;
+		};
+
+		cam_clk2_out: cam-clk2-out {
+			rockchip,pins =
+				/* cam_clk2_out */
+				<3 RK_PB4 2 &pcfg_pull_none>;
+		};
+		cam_clk3_out: cam-clk3-out {
+			rockchip,pins =
+				/* cam_clk3_out */
+				<3 RK_PB5 2 &pcfg_pull_none>;
+		};
+	};
+
+	can0 {
+		can0m0_pins: can0m0-pins {
+			rockchip,pins =
+				/* can0_rx_m0 */
+				<3 RK_PA1 4 &pcfg_pull_none>,
+				/* can0_tx_m0 */
+				<3 RK_PA0 4 &pcfg_pull_none>;
+		};
+
+		can0m1_pins: can0m1-pins {
+			rockchip,pins =
+				/* can0_rx_m1 */
+				<3 RK_PB7 6 &pcfg_pull_none>,
+				/* can0_tx_m1 */
+				<3 RK_PB6 6 &pcfg_pull_none>;
+		};
+
+		can0m2_pins: can0m2-pins {
+			rockchip,pins =
+				/* can0_rx_m2 */
+				<0 RK_PC7 2 &pcfg_pull_none>,
+				/* can0_tx_m2 */
+				<0 RK_PC6 2 &pcfg_pull_none>;
+		};
+	};
+
+	can1 {
+		can1m0_pins: can1m0-pins {
+			rockchip,pins =
+				/* can1_rx_m0 */
+				<1 RK_PB7 4 &pcfg_pull_none>,
+				/* can1_tx_m0 */
+				<1 RK_PC0 5 &pcfg_pull_none>;
+		};
+
+		can1m1_pins: can1m1-pins {
+			rockchip,pins =
+				/* can1_rx_m1 */
+				<0 RK_PC1 4 &pcfg_pull_none>,
+				/* can1_tx_m1 */
+				<0 RK_PC0 4 &pcfg_pull_none>;
+		};
+	};
+
+	clk {
+		clk_32k_in: clk-32k-in {
+			rockchip,pins =
+				/* clk_32k_in */
+				<0 RK_PB0 1 &pcfg_pull_none>;
+		};
+	};
+
+	clk0 {
+		clk0_32k_out: clk0-32k-out {
+			rockchip,pins =
+				/* clk0_32k_out */
+				<0 RK_PB0 2 &pcfg_pull_none>;
+		};
+	};
+
+	clk1 {
+		clk1_32k_out: clk1-32k-out {
+			rockchip,pins =
+				/* clk1_32k_out */
+				<2 RK_PA1 3 &pcfg_pull_none>;
+		};
+	};
+
+	cpu {
+		cpu_pins: cpu-pins {
+			rockchip,pins =
+				/* cpu_avs */
+				<0 RK_PB7 3 &pcfg_pull_none>;
+		};
+	};
+
+	dsm {
+		dsm_pins: dsm-pins {
+			rockchip,pins =
+				/* dsm_aud_ln */
+				<1 RK_PB4 5 &pcfg_pull_none>,
+				/* dsm_aud_lp */
+				<1 RK_PB3 5 &pcfg_pull_none>,
+				/* dsm_aud_rn */
+				<1 RK_PB6 6 &pcfg_pull_none>,
+				/* dsm_aud_rp */
+				<1 RK_PB5 6 &pcfg_pull_none>;
+		};
+	};
+
+	emmc {
+		emmc_bus8: emmc-bus8 {
+			rockchip,pins =
+				/* emmc_d0 */
+				<1 RK_PA0 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d1 */
+				<1 RK_PA1 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d2 */
+				<1 RK_PA2 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d3 */
+				<1 RK_PA3 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d4 */
+				<1 RK_PA4 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d5 */
+				<1 RK_PA5 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d6 */
+				<1 RK_PA6 1 &pcfg_pull_up_drv_level_2>,
+				/* emmc_d7 */
+				<1 RK_PA7 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		emmc_clk: emmc-clk {
+			rockchip,pins =
+				/* emmc_clk */
+				<1 RK_PB1 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		emmc_cmd: emmc-cmd {
+			rockchip,pins =
+				/* emmc_cmd */
+				<1 RK_PB0 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		emmc_strb: emmc-strb {
+			rockchip,pins =
+				/* emmc_strb */
+				<1 RK_PB2 1 &pcfg_pull_none>;
+		};
+	};
+
+	eth {
+		ethm0_pins: ethm0-pins {
+			rockchip,pins =
+				/* eth_clk_25m_out_m0 */
+				<4 RK_PB1 2 &pcfg_pull_none>;
+		};
+
+		ethm1_pins: ethm1-pins {
+			rockchip,pins =
+				/* eth_clk_25m_out_m1 */
+				<2 RK_PA1 2 &pcfg_pull_none>;
+		};
+	};
+
+	fspi {
+		fspi_pins: fspi-pins {
+			rockchip,pins =
+				/* fspi_clk */
+				<1 RK_PB1 2 &pcfg_pull_none>,
+				/* fspi_d0 */
+				<1 RK_PA0 2 &pcfg_pull_none>,
+				/* fspi_d1 */
+				<1 RK_PA1 2 &pcfg_pull_none>,
+				/* fspi_d2 */
+				<1 RK_PA2 2 &pcfg_pull_none>,
+				/* fspi_d3 */
+				<1 RK_PA3 2 &pcfg_pull_none>;
+		};
+
+		fspi_csn0: fspi-csn0 {
+			rockchip,pins =
+				/* fspi_csn0 */
+				<1 RK_PB0 2 &pcfg_pull_none>;
+		};
+		fspi_csn1: fspi-csn1 {
+			rockchip,pins =
+				/* fspi_csn1 */
+				<1 RK_PB2 2 &pcfg_pull_none>;
+		};
+	};
+
+	gpu {
+		gpu_pins: gpu-pins {
+			rockchip,pins =
+				/* gpu_avs */
+				<0 RK_PC0 3 &pcfg_pull_none>;
+		};
+	};
+
+	i2c0 {
+		i2c0_xfer: i2c0-xfer {
+			rockchip,pins =
+				/* i2c0_scl */
+				<0 RK_PB1 1 &pcfg_pull_none_smt>,
+				/* i2c0_sda */
+				<0 RK_PB2 1 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c1 {
+		i2c1m0_xfer: i2c1m0-xfer {
+			rockchip,pins =
+				/* i2c1_scl_m0 */
+				<0 RK_PB3 1 &pcfg_pull_none_smt>,
+				/* i2c1_sda_m0 */
+				<0 RK_PB4 1 &pcfg_pull_none_smt>;
+		};
+
+		i2c1m1_xfer: i2c1m1-xfer {
+			rockchip,pins =
+				/* i2c1_scl_m1 */
+				<4 RK_PB4 5 &pcfg_pull_none_smt>,
+				/* i2c1_sda_m1 */
+				<4 RK_PB5 5 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c2 {
+		i2c2m0_xfer: i2c2m0-xfer {
+			rockchip,pins =
+				/* i2c2_scl_m0 */
+				<0 RK_PB5 1 &pcfg_pull_none_smt>,
+				/* i2c2_sda_m0 */
+				<0 RK_PB6 1 &pcfg_pull_none_smt>;
+		};
+
+		i2c2m1_xfer: i2c2m1-xfer {
+			rockchip,pins =
+				/* i2c2_scl_m1 */
+				<3 RK_PD2 5 &pcfg_pull_none_smt>,
+				/* i2c2_sda_m1 */
+				<3 RK_PD3 5 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c3 {
+		i2c3m0_xfer: i2c3m0-xfer {
+			rockchip,pins =
+				/* i2c3_scl_m0 */
+				<3 RK_PA0 1 &pcfg_pull_none_smt>,
+				/* i2c3_sda_m0 */
+				<3 RK_PA1 1 &pcfg_pull_none_smt>;
+		};
+
+		i2c3m1_xfer: i2c3m1-xfer {
+			rockchip,pins =
+				/* i2c3_scl_m1 */
+				<4 RK_PA5 5 &pcfg_pull_none_smt>,
+				/* i2c3_sda_m1 */
+				<4 RK_PA6 5 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c4 {
+		i2c4m0_xfer: i2c4m0-xfer {
+			rockchip,pins =
+				/* i2c4_scl_m0 */
+				<3 RK_PB6 5 &pcfg_pull_none_smt>,
+				/* i2c4_sda_m0 */
+				<3 RK_PB7 5 &pcfg_pull_none_smt>;
+		};
+
+		i2c4m1_xfer: i2c4m1-xfer {
+			rockchip,pins =
+				/* i2c4_scl_m1 */
+				<0 RK_PA5 2 &pcfg_pull_none_smt>,
+				/* i2c4_sda_m1 */
+				<0 RK_PA4 2 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2c5 {
+		i2c5m0_xfer: i2c5m0-xfer {
+			rockchip,pins =
+				/* i2c5_scl_m0 */
+				<3 RK_PC2 1 &pcfg_pull_none_smt>,
+				/* i2c5_sda_m0 */
+				<3 RK_PC3 1 &pcfg_pull_none_smt>;
+		};
+
+		i2c5m1_xfer: i2c5m1-xfer {
+			rockchip,pins =
+				/* i2c5_scl_m1 */
+				<1 RK_PC7 4 &pcfg_pull_none_smt>,
+				/* i2c5_sda_m1 */
+				<1 RK_PD0 4 &pcfg_pull_none_smt>;
+		};
+	};
+
+	i2s0 {
+		i2s0m0_lrck: i2s0m0-lrck {
+			rockchip,pins =
+				/* i2s0_lrck_m0 */
+				<3 RK_PA4 1 &pcfg_pull_none>;
+		};
+
+		i2s0m0_mclk: i2s0m0-mclk {
+			rockchip,pins =
+				/* i2s0_mclk_m0 */
+				<3 RK_PA2 1 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sclk: i2s0m0-sclk {
+			rockchip,pins =
+				/* i2s0_sclk_m0 */
+				<3 RK_PA3 1 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdi0: i2s0m0-sdi0 {
+			rockchip,pins =
+				/* i2s0_sdi0_m0 */
+				<3 RK_PB1 1 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdi1: i2s0m0-sdi1 {
+			rockchip,pins =
+				/* i2s0_sdi1_m0 */
+				<3 RK_PB0 2 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdi2: i2s0m0-sdi2 {
+			rockchip,pins =
+				/* i2s0_sdi2_m0 */
+				<3 RK_PA7 2 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdi3: i2s0m0-sdi3 {
+			rockchip,pins =
+				/* i2s0_sdi3_m0 */
+				<3 RK_PA6 2 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdo0: i2s0m0-sdo0 {
+			rockchip,pins =
+				/* i2s0_sdo0_m0 */
+				<3 RK_PA5 1 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdo1: i2s0m0-sdo1 {
+			rockchip,pins =
+				/* i2s0_sdo1_m0 */
+				<3 RK_PA6 1 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdo2: i2s0m0-sdo2 {
+			rockchip,pins =
+				/* i2s0_sdo2_m0 */
+				<3 RK_PA7 1 &pcfg_pull_none>;
+		};
+
+		i2s0m0_sdo3: i2s0m0-sdo3 {
+			rockchip,pins =
+				/* i2s0_sdo3_m0 */
+				<3 RK_PB0 1 &pcfg_pull_none>;
+		};
+
+		i2s0m1_lrck: i2s0m1-lrck {
+			rockchip,pins =
+				/* i2s0_lrck_m1 */
+				<1 RK_PC4 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_mclk: i2s0m1-mclk {
+			rockchip,pins =
+				/* i2s0_mclk_m1 */
+				<1 RK_PC6 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sclk: i2s0m1-sclk {
+			rockchip,pins =
+				/* i2s0_sclk_m1 */
+				<1 RK_PC5 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdi0: i2s0m1-sdi0 {
+			rockchip,pins =
+				/* i2s0_sdi0_m1 */
+				<1 RK_PC1 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdi1: i2s0m1-sdi1 {
+			rockchip,pins =
+				/* i2s0_sdi1_m1 */
+				<1 RK_PC2 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdi2: i2s0m1-sdi2 {
+			rockchip,pins =
+				/* i2s0_sdi2_m1 */
+				<1 RK_PD3 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdi3: i2s0m1-sdi3 {
+			rockchip,pins =
+				/* i2s0_sdi3_m1 */
+				<1 RK_PD4 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdo0: i2s0m1-sdo0 {
+			rockchip,pins =
+				/* i2s0_sdo0_m1 */
+				<1 RK_PC3 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdo1: i2s0m1-sdo1 {
+			rockchip,pins =
+				/* i2s0_sdo1_m1 */
+				<1 RK_PD1 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdo2: i2s0m1-sdo2 {
+			rockchip,pins =
+				/* i2s0_sdo2_m1 */
+				<1 RK_PD2 3 &pcfg_pull_none>;
+		};
+
+		i2s0m1_sdo3: i2s0m1-sdo3 {
+			rockchip,pins =
+				/* i2s0_sdo3_m1 */
+				<2 RK_PA1 5 &pcfg_pull_none>;
+		};
+	};
+
+	i2s1 {
+		i2s1m0_lrck: i2s1m0-lrck {
+			rockchip,pins =
+				/* i2s1_lrck_m0 */
+				<3 RK_PC6 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_mclk: i2s1m0-mclk {
+			rockchip,pins =
+				/* i2s1_mclk_m0 */
+				<3 RK_PC4 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sclk: i2s1m0-sclk {
+			rockchip,pins =
+				/* i2s1_sclk_m0 */
+				<3 RK_PC5 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdi0: i2s1m0-sdi0 {
+			rockchip,pins =
+				/* i2s1_sdi0_m0 */
+				<3 RK_PD0 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdi1: i2s1m0-sdi1 {
+			rockchip,pins =
+				/* i2s1_sdi1_m0 */
+				<3 RK_PD1 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdi2: i2s1m0-sdi2 {
+			rockchip,pins =
+				/* i2s1_sdi2_m0 */
+				<3 RK_PD2 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdi3: i2s1m0-sdi3 {
+			rockchip,pins =
+				/* i2s1_sdi3_m0 */
+				<3 RK_PD3 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdo0: i2s1m0-sdo0 {
+			rockchip,pins =
+				/* i2s1_sdo0_m0 */
+				<3 RK_PC7 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdo1: i2s1m0-sdo1 {
+			rockchip,pins =
+				/* i2s1_sdo1_m0 */
+				<4 RK_PB4 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdo2: i2s1m0-sdo2 {
+			rockchip,pins =
+				/* i2s1_sdo2_m0 */
+				<4 RK_PB5 2 &pcfg_pull_none>;
+		};
+
+		i2s1m0_sdo3: i2s1m0-sdo3 {
+			rockchip,pins =
+				/* i2s1_sdo3_m0 */
+				<4 RK_PB6 2 &pcfg_pull_none>;
+		};
+
+		i2s1m1_lrck: i2s1m1-lrck {
+			rockchip,pins =
+				/* i2s1_lrck_m1 */
+				<3 RK_PB4 1 &pcfg_pull_none>;
+		};
+
+		i2s1m1_mclk: i2s1m1-mclk {
+			rockchip,pins =
+				/* i2s1_mclk_m1 */
+				<3 RK_PB2 1 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sclk: i2s1m1-sclk {
+			rockchip,pins =
+				/* i2s1_sclk_m1 */
+				<3 RK_PB3 1 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdi0: i2s1m1-sdi0 {
+			rockchip,pins =
+				/* i2s1_sdi0_m1 */
+				<3 RK_PC1 1 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdi1: i2s1m1-sdi1 {
+			rockchip,pins =
+				/* i2s1_sdi1_m1 */
+				<3 RK_PC0 2 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdi2: i2s1m1-sdi2 {
+			rockchip,pins =
+				/* i2s1_sdi2_m1 */
+				<3 RK_PB7 2 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdi3: i2s1m1-sdi3 {
+			rockchip,pins =
+				/* i2s1_sdi3_m1 */
+				<3 RK_PB6 2 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdo0: i2s1m1-sdo0 {
+			rockchip,pins =
+				/* i2s1_sdo0_m1 */
+				<3 RK_PB5 1 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdo1: i2s1m1-sdo1 {
+			rockchip,pins =
+				/* i2s1_sdo1_m1 */
+				<3 RK_PB6 1 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdo2: i2s1m1-sdo2 {
+			rockchip,pins =
+				/* i2s1_sdo2_m1 */
+				<3 RK_PB7 1 &pcfg_pull_none>;
+		};
+
+		i2s1m1_sdo3: i2s1m1-sdo3 {
+			rockchip,pins =
+				/* i2s1_sdo3_m1 */
+				<3 RK_PC0 1 &pcfg_pull_none>;
+		};
+	};
+
+	i2s2 {
+		i2s2m0_lrck: i2s2m0-lrck {
+			rockchip,pins =
+				/* i2s2_lrck_m0 */
+				<1 RK_PD6 1 &pcfg_pull_none>;
+		};
+
+		i2s2m0_mclk: i2s2m0-mclk {
+			rockchip,pins =
+				/* i2s2_mclk_m0 */
+				<2 RK_PA1 1 &pcfg_pull_none>;
+		};
+
+		i2s2m0_sclk: i2s2m0-sclk {
+			rockchip,pins =
+				/* i2s2_sclk_m0 */
+				<1 RK_PD5 1 &pcfg_pull_none>;
+		};
+
+		i2s2m0_sdi: i2s2m0-sdi {
+			rockchip,pins =
+				/* i2s2_sdi_m0 */
+				<2 RK_PA0 1 &pcfg_pull_none>;
+		};
+
+		i2s2m0_sdo: i2s2m0-sdo {
+			rockchip,pins =
+				/* i2s2_sdo_m0 */
+				<1 RK_PD7 1 &pcfg_pull_none>;
+		};
+
+		i2s2m1_lrck: i2s2m1-lrck {
+			rockchip,pins =
+				/* i2s2_lrck_m1 */
+				<4 RK_PA1 3 &pcfg_pull_none>;
+		};
+
+		i2s2m1_mclk: i2s2m1-mclk {
+			rockchip,pins =
+				/* i2s2_mclk_m1 */
+				<3 RK_PD6 3 &pcfg_pull_none>;
+		};
+
+		i2s2m1_sclk: i2s2m1-sclk {
+			rockchip,pins =
+				/* i2s2_sclk_m1 */
+				<4 RK_PB1 4 &pcfg_pull_none>;
+		};
+
+		i2s2m1_sdi: i2s2m1-sdi {
+			rockchip,pins =
+				/* i2s2_sdi_m1 */
+				<3 RK_PD4 4 &pcfg_pull_none>;
+		};
+
+		i2s2m1_sdo: i2s2m1-sdo {
+			rockchip,pins =
+				/* i2s2_sdo_m1 */
+				<3 RK_PD5 4 &pcfg_pull_none>;
+		};
+	};
+
+	isp {
+		isp_pins: isp-pins {
+			rockchip,pins =
+				/* isp_flash_trigin */
+				<3 RK_PC1 2 &pcfg_pull_none>,
+				/* isp_flash_trigout */
+				<3 RK_PC3 2 &pcfg_pull_none>,
+				/* isp_prelight_trigout */
+				<3 RK_PC2 2 &pcfg_pull_none>;
+		};
+	};
+
+	jtag {
+		jtagm0_pins: jtagm0-pins {
+			rockchip,pins =
+				/* jtag_cpu_mcu_tck_m0 */
+				<0 RK_PD1 2 &pcfg_pull_none>,
+				/* jtag_cpu_mcu_tms_m0 */
+				<0 RK_PD0 2 &pcfg_pull_none>;
+		};
+
+		jtagm1_pins: jtagm1-pins {
+			rockchip,pins =
+				/* jtag_cpu_mcu_tck_m1 */
+				<1 RK_PB5 2 &pcfg_pull_none>,
+				/* jtag_cpu_mcu_tms_m1 */
+				<1 RK_PB6 2 &pcfg_pull_none>;
+		};
+	};
+
+	npu {
+		npu_pins: npu-pins {
+			rockchip,pins =
+				/* npu_avs */
+				<0 RK_PC1 3 &pcfg_pull_none>;
+		};
+	};
+
+	pcie20 {
+		pcie20m0_pins: pcie20m0-pins {
+			rockchip,pins =
+				/* pcie20_clkreqn_m0 */
+				<0 RK_PA6 1 &pcfg_pull_none>,
+				/* pcie20_perstn_m0 */
+				<0 RK_PB5 2 &pcfg_pull_none>,
+				/* pcie20_waken_m0 */
+				<0 RK_PB6 2 &pcfg_pull_none>;
+		};
+
+		pcie20m1_pins: pcie20m1-pins {
+			rockchip,pins =
+				/* pcie20_clkreqn_m1 */
+				<3 RK_PA6 4 &pcfg_pull_none>,
+				/* pcie20_perstn_m1 */
+				<3 RK_PB0 4 &pcfg_pull_none>,
+				/* pcie20_waken_m1 */
+				<3 RK_PA7 4 &pcfg_pull_none>;
+		};
+
+		pcie20_buttonrstn: pcie20-buttonrstn {
+			rockchip,pins =
+				/* pcie20_buttonrstn */
+				<0 RK_PB0 3 &pcfg_pull_none>;
+		};
+	};
+
+	pdm {
+		pdmm0_clk0: pdmm0-clk0 {
+			rockchip,pins =
+				/* pdm_clk0_m0 */
+				<3 RK_PA6 3 &pcfg_pull_none>;
+		};
+
+		pdmm0_clk1: pdmm0-clk1 {
+			rockchip,pins =
+				/* pdm_clk1_m0 */
+				<3 RK_PA2 3 &pcfg_pull_none>;
+		};
+
+		pdmm0_sdi0: pdmm0-sdi0 {
+			rockchip,pins =
+				/* pdm_sdi0_m0 */
+				<3 RK_PB1 2 &pcfg_pull_none>;
+		};
+
+		pdmm0_sdi1: pdmm0-sdi1 {
+			rockchip,pins =
+				/* pdm_sdi1_m0 */
+				<3 RK_PB0 3 &pcfg_pull_none>;
+		};
+
+		pdmm0_sdi2: pdmm0-sdi2 {
+			rockchip,pins =
+				/* pdm_sdi2_m0 */
+				<3 RK_PA7 3 &pcfg_pull_none>;
+		};
+
+		pdmm0_sdi3: pdmm0-sdi3 {
+			rockchip,pins =
+				/* pdm_sdi3_m0 */
+				<3 RK_PA0 3 &pcfg_pull_none>;
+		};
+
+		pdmm1_clk0: pdmm1-clk0 {
+			rockchip,pins =
+				/* pdm_clk0_m1 */
+				<4 RK_PB7 4 &pcfg_pull_none>;
+		};
+
+		pdmm1_clk1: pdmm1-clk1 {
+			rockchip,pins =
+				/* pdm_clk1_m1 */
+				<4 RK_PB1 5 &pcfg_pull_none>;
+		};
+
+		pdmm1_sdi0: pdmm1-sdi0 {
+			rockchip,pins =
+				/* pdm_sdi0_m1 */
+				<4 RK_PA7 4 &pcfg_pull_none>;
+		};
+
+		pdmm1_sdi1: pdmm1-sdi1 {
+			rockchip,pins =
+				/* pdm_sdi1_m1 */
+				<4 RK_PB0 4 &pcfg_pull_none>;
+		};
+
+		pdmm1_sdi2: pdmm1-sdi2 {
+			rockchip,pins =
+				/* pdm_sdi2_m1 */
+				<4 RK_PA5 4 &pcfg_pull_none>;
+		};
+
+		pdmm1_sdi3: pdmm1-sdi3 {
+			rockchip,pins =
+				/* pdm_sdi3_m1 */
+				<4 RK_PA6 4 &pcfg_pull_none>;
+		};
+	};
+
+	pmic {
+		pmic_int: pmic-int {
+			rockchip,pins =
+				<0 RK_PA3 0 &pcfg_pull_up>;
+		};
+
+		soc_slppin_gpio: soc-slppin-gpio {
+			rockchip,pins =
+				<0 RK_PA2 0 &pcfg_output_low>;
+		};
+
+		soc_slppin_slp: soc-slppin-slp {
+			rockchip,pins =
+				<0 RK_PA2 1 &pcfg_pull_none>;
+		};
+	};
+
+	pmu {
+		pmu_pins: pmu-pins {
+			rockchip,pins =
+				/* pmu_debug */
+				<0 RK_PA5 3 &pcfg_pull_none>;
+		};
+	};
+
+	pwm0 {
+		pwm0m0_pins: pwm0m0-pins {
+			rockchip,pins =
+				/* pwm0_m0 */
+				<0 RK_PC3 2 &pcfg_pull_none>;
+		};
+
+		pwm0m1_pins: pwm0m1-pins {
+			rockchip,pins =
+				/* pwm0_m1 */
+				<1 RK_PC5 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm1 {
+		pwm1m0_pins: pwm1m0-pins {
+			rockchip,pins =
+				/* pwm1_m0 */
+				<0 RK_PC4 2 &pcfg_pull_none>;
+		};
+
+		pwm1m1_pins: pwm1m1-pins {
+			rockchip,pins =
+				/* pwm1_m1 */
+				<1 RK_PC6 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm2 {
+		pwm2m0_pins: pwm2m0-pins {
+			rockchip,pins =
+				/* pwm2_m0 */
+				<0 RK_PC5 2 &pcfg_pull_none>;
+		};
+
+		pwm2m1_pins: pwm2m1-pins {
+			rockchip,pins =
+				/* pwm2_m1 */
+				<1 RK_PC7 3 &pcfg_pull_none>;
+		};
+	};
+
+	pwm3 {
+		pwm3m0_pins: pwm3m0-pins {
+			rockchip,pins =
+				/* pwm3_m0 */
+				<0 RK_PA7 1 &pcfg_pull_none>;
+		};
+
+		pwm3m1_pins: pwm3m1-pins {
+			rockchip,pins =
+				/* pwm3_m1 */
+				<1 RK_PD0 3 &pcfg_pull_none>;
+		};
+	};
+
+	pwm4 {
+		pwm4m0_pins: pwm4m0-pins {
+			rockchip,pins =
+				/* pwm4_m0 */
+				<0 RK_PB7 2 &pcfg_pull_none>;
+		};
+
+		pwm4m1_pins: pwm4m1-pins {
+			rockchip,pins =
+				/* pwm4_m1 */
+				<1 RK_PD1 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm5 {
+		pwm5m0_pins: pwm5m0-pins {
+			rockchip,pins =
+				/* pwm5_m0 */
+				<0 RK_PC2 2 &pcfg_pull_none>;
+		};
+
+		pwm5m1_pins: pwm5m1-pins {
+			rockchip,pins =
+				/* pwm5_m1 */
+				<1 RK_PD2 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm6 {
+		pwm6m0_pins: pwm6m0-pins {
+			rockchip,pins =
+				/* pwm6_m0 */
+				<0 RK_PC1 2 &pcfg_pull_none>;
+		};
+
+		pwm6m1_pins: pwm6m1-pins {
+			rockchip,pins =
+				/* pwm6_m1 */
+				<1 RK_PD3 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm7 {
+		pwm7m0_pins: pwm7m0-pins {
+			rockchip,pins =
+				/* pwm7_m0 */
+				<0 RK_PC0 2 &pcfg_pull_none>;
+		};
+
+		pwm7m1_pins: pwm7m1-pins {
+			rockchip,pins =
+				/* pwm7_m1 */
+				<1 RK_PD4 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm8 {
+		pwm8m0_pins: pwm8m0-pins {
+			rockchip,pins =
+				/* pwm8_m0 */
+				<3 RK_PA4 2 &pcfg_pull_none>;
+		};
+
+		pwm8m1_pins: pwm8m1-pins {
+			rockchip,pins =
+				/* pwm8_m1 */
+				<1 RK_PC1 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm9 {
+		pwm9m0_pins: pwm9m0-pins {
+			rockchip,pins =
+				/* pwm9_m0 */
+				<3 RK_PA5 2 &pcfg_pull_none>;
+		};
+
+		pwm9m1_pins: pwm9m1-pins {
+			rockchip,pins =
+				/* pwm9_m1 */
+				<1 RK_PC2 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm10 {
+		pwm10m0_pins: pwm10m0-pins {
+			rockchip,pins =
+				/* pwm10_m0 */
+				<1 RK_PB5 5 &pcfg_pull_none>;
+		};
+
+		pwm10m1_pins: pwm10m1-pins {
+			rockchip,pins =
+				/* pwm10_m1 */
+				<1 RK_PC3 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm11 {
+		pwm11m0_pins: pwm11m0-pins {
+			rockchip,pins =
+				/* pwm11_m0 */
+				<1 RK_PB6 5 &pcfg_pull_none>;
+		};
+
+		pwm11m1_pins: pwm11m1-pins {
+			rockchip,pins =
+				/* pwm11_m1 */
+				<1 RK_PC4 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm12 {
+		pwm12m0_pins: pwm12m0-pins {
+			rockchip,pins =
+				/* pwm12_m0 */
+				<4 RK_PA1 4 &pcfg_pull_none>;
+		};
+
+		pwm12m1_pins: pwm12m1-pins {
+			rockchip,pins =
+				/* pwm12_m1 */
+				<3 RK_PB4 5 &pcfg_pull_none>;
+		};
+	};
+
+	pwm13 {
+		pwm13m0_pins: pwm13m0-pins {
+			rockchip,pins =
+				/* pwm13_m0 */
+				<4 RK_PA4 3 &pcfg_pull_none>;
+		};
+
+		pwm13m1_pins: pwm13m1-pins {
+			rockchip,pins =
+				/* pwm13_m1 */
+				<3 RK_PB5 5 &pcfg_pull_none>;
+		};
+	};
+
+	pwm14 {
+		pwm14m0_pins: pwm14m0-pins {
+			rockchip,pins =
+				/* pwm14_m0 */
+				<3 RK_PC5 4 &pcfg_pull_none>;
+		};
+
+		pwm14m1_pins: pwm14m1-pins {
+			rockchip,pins =
+				/* pwm14_m1 */
+				<1 RK_PD7 5 &pcfg_pull_none>;
+		};
+	};
+
+	pwm15 {
+		pwm15m0_pins: pwm15m0-pins {
+			rockchip,pins =
+				/* pwm15_m0 */
+				<3 RK_PC6 4 &pcfg_pull_none>;
+		};
+
+		pwm15m1_pins: pwm15m1-pins {
+			rockchip,pins =
+				/* pwm15_m1 */
+				<2 RK_PA0 5 &pcfg_pull_none>;
+		};
+	};
+
+	pwr {
+		pwr_pins: pwr-pins {
+			rockchip,pins =
+				/* pwr_ctrl0 */
+				<0 RK_PA2 1 &pcfg_pull_none>,
+				/* pwr_ctrl1 */
+				<0 RK_PA3 1 &pcfg_pull_none>;
+		};
+	};
+
+	ref {
+		ref_pins: ref-pins {
+			rockchip,pins =
+				/* ref_clk_out */
+				<0 RK_PA0 1 &pcfg_pull_none>;
+		};
+	};
+
+	rgmii {
+		rgmiim0_miim: rgmiim0-miim {
+			rockchip,pins =
+				/* rgmii_mdc_m0 */
+				<4 RK_PB2 2 &pcfg_pull_none>,
+				/* rgmii_mdio_m0 */
+				<4 RK_PB3 2 &pcfg_pull_none>;
+		};
+
+		rgmiim0_rx_er: rgmiim0-rx_er {
+			rockchip,pins =
+				/* rgmii_rxer_m0 */
+				<4 RK_PB0 2 &pcfg_pull_none>;
+		};
+
+		rgmiim0_rx_bus2: rgmiim0-rx_bus2 {
+			rockchip,pins =
+				/* rgmii_rxd0_m0 */
+				<4 RK_PA5 2 &pcfg_pull_none>,
+				/* rgmii_rxd1_m0 */
+				<4 RK_PA6 2 &pcfg_pull_none>,
+				/* rgmii_rxdv_m0 */
+				<4 RK_PA7 2 &pcfg_pull_none>;
+		};
+
+		rgmiim0_tx_bus2: rgmiim0-tx_bus2 {
+			rockchip,pins =
+				/* rgmii_txd0_m0 */
+				<4 RK_PA2 2 &pcfg_pull_none>,
+				/* rgmii_txd1_m0 */
+				<4 RK_PA3 2 &pcfg_pull_none>,
+				/* rgmii_txen_m0 */
+				<4 RK_PA4 2 &pcfg_pull_none>;
+		};
+
+		rgmiim0_rgmii_clk: rgmiim0-rgmii_clk {
+			rockchip,pins =
+				/* rgmii_rxclk_m0 */
+				<4 RK_PA1 2 &pcfg_pull_none>,
+				/* rgmii_txclk_m0 */
+				<3 RK_PD6 2 &pcfg_pull_none>;
+		};
+
+		rgmiim0_rgmii_bus: rgmiim0-rgmii_bus {
+			rockchip,pins =
+				/* rgmii_rxd2_m0 */
+				<3 RK_PD7 2 &pcfg_pull_none>,
+				/* rgmii_rxd3_m0 */
+				<4 RK_PA0 2 &pcfg_pull_none>,
+				/* rgmii_txd2_m0 */
+				<3 RK_PD4 2 &pcfg_pull_none>,
+				/* rgmii_txd3_m0 */
+				<3 RK_PD5 2 &pcfg_pull_none>;
+		};
+
+		rgmiim0_clk: rgmiim0-clk {
+			rockchip,pins =
+				/* rgmiim0_clk */
+				<4 RK_PB7 2 &pcfg_pull_none>;
+		};
+
+		rgmiim1_miim: rgmiim1-miim {
+			rockchip,pins =
+				/* rgmii_mdc_m1 */
+				<1 RK_PC7 2 &pcfg_pull_none>,
+				/* rgmii_mdio_m1 */
+				<1 RK_PD0 2 &pcfg_pull_none>;
+		};
+
+		rgmiim1_rx_er: rgmiim1-rx_er {
+			rockchip,pins =
+				/* rgmii_rxer_m1 */
+				<2 RK_PA0 2 &pcfg_pull_none>;
+		};
+
+		rgmiim1_rx_bus2: rgmiim1-rx_bus2 {
+			rockchip,pins =
+				/* rgmii_rxd0_m1 */
+				<1 RK_PD4 2 &pcfg_pull_none>,
+				/* rgmii_rxd1_m1 */
+				<1 RK_PD7 2 &pcfg_pull_none>,
+				/* rgmii_rxdv_m1 */
+				<1 RK_PD6 2 &pcfg_pull_none>;
+		};
+
+		rgmiim1_tx_bus2: rgmiim1-tx_bus2 {
+			rockchip,pins =
+				/* rgmii_txd0_m1 */
+				<1 RK_PD1 2 &pcfg_pull_none>,
+				/* rgmii_txd1_m1 */
+				<1 RK_PD2 2 &pcfg_pull_none>,
+				/* rgmii_txen_m1 */
+				<1 RK_PD3 2 &pcfg_pull_none>;
+		};
+
+		rgmiim1_rgmii_clk: rgmiim1-rgmii_clk {
+			rockchip,pins =
+				/* rgmii_rxclk_m1 */
+				<1 RK_PC6 2 &pcfg_pull_none>,
+				/* rgmii_txclk_m1 */
+				<1 RK_PC3 2 &pcfg_pull_none>;
+		};
+
+		rgmiim1_rgmii_bus: rgmiim1-rgmii_bus {
+			rockchip,pins =
+				/* rgmii_rxd2_m1 */
+				<1 RK_PC4 2 &pcfg_pull_none>,
+				/* rgmii_rxd3_m1 */
+				<1 RK_PC5 2 &pcfg_pull_none>,
+				/* rgmii_txd2_m1 */
+				<1 RK_PC1 2 &pcfg_pull_none>,
+				/* rgmii_txd3_m1 */
+				<1 RK_PC2 2 &pcfg_pull_none>;
+		};
+
+		rgmiim1_clk: rgmiim1-clk {
+			rockchip,pins =
+				/* rgmiim1_clk */
+				<1 RK_PD5 2 &pcfg_pull_none>;
+		};
+	};
+
+	rmii {
+		rmii_pins: rmii-pins {
+			rockchip,pins =
+				/* rmii_clk */
+				<1 RK_PD5 5 &pcfg_pull_none>,
+				/* rmii_mdc */
+				<1 RK_PC7 5 &pcfg_pull_none>,
+				/* rmii_mdio */
+				<1 RK_PD0 5 &pcfg_pull_none>,
+				/* rmii_rxd0 */
+				<1 RK_PD4 5 &pcfg_pull_none>,
+				/* rmii_rxd1 */
+				<1 RK_PD7 6 &pcfg_pull_none>,
+				/* rmii_rxdv_crs */
+				<1 RK_PD6 5 &pcfg_pull_none>,
+				/* rmii_rxer */
+				<2 RK_PA0 6 &pcfg_pull_none>,
+				/* rmii_txd0 */
+				<1 RK_PD1 5 &pcfg_pull_none>,
+				/* rmii_txd1 */
+				<1 RK_PD2 5 &pcfg_pull_none>,
+				/* rmii_txen */
+				<1 RK_PD3 5 &pcfg_pull_none>;
+		};
+	};
+
+	sdmmc0_pins: sdmmc0-pins {
+		sdmmc0_bus4: sdmmc0-bus4 {
+			rockchip,pins =
+				/* sdmmc0_d0 */
+				<1 RK_PB3 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc0_d1 */
+				<1 RK_PB4 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc0_d2 */
+				<1 RK_PB5 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc0_d3 */
+				<1 RK_PB6 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc0_clk: sdmmc0-clk {
+			rockchip,pins =
+				/* sdmmc0_clk */
+				<1 RK_PC0 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc0_cmd: sdmmc0-cmd {
+			rockchip,pins =
+				/* sdmmc0_cmd */
+				<1 RK_PB7 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc0_det: sdmmc0-det {
+			rockchip,pins =
+				/* sdmmc0_detn */
+				<0 RK_PA4 1 &pcfg_pull_up>;
+		};
+
+		sdmmc0_pwren: sdmmc0-pwren {
+			rockchip,pins =
+				/* sdmmc0_pwren */
+				<0 RK_PA5 1 &pcfg_pull_none>;
+		};
+	};
+
+	sdmmc1 {
+		sdmmc1_bus4: sdmmc1-bus4 {
+			rockchip,pins =
+				/* sdmmc1_d0 */
+				<1 RK_PC1 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc1_d1 */
+				<1 RK_PC2 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc1_d2 */
+				<1 RK_PC3 1 &pcfg_pull_up_drv_level_2>,
+				/* sdmmc1_d3 */
+				<1 RK_PC4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc1_clk: sdmmc1-clk {
+			rockchip,pins =
+				/* sdmmc1_clk */
+				<1 RK_PC6 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc1_cmd: sdmmc1-cmd {
+			rockchip,pins =
+				/* sdmmc1_cmd */
+				<1 RK_PC5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		sdmmc1_det: sdmmc1-det {
+			rockchip,pins =
+				/* sdmmc1_detn */
+				<1 RK_PD0 1 &pcfg_pull_up>;
+		};
+
+		sdmmc1_pwren: sdmmc1-pwren {
+			rockchip,pins =
+				/* sdmmc1_pwren */
+				<1 RK_PC7 1 &pcfg_pull_none>;
+		};
+	};
+
+	spdif {
+		spdifm0_pins: spdifm0-pins {
+			rockchip,pins =
+				/* spdif_tx_m0 */
+				<3 RK_PA1 3 &pcfg_pull_none>;
+		};
+
+		spdifm1_pins: spdifm1-pins {
+			rockchip,pins =
+				/* spdif_tx_m1 */
+				<0 RK_PB7 4 &pcfg_pull_none>;
+		};
+
+		spdifm2_pins: spdifm2-pins {
+			rockchip,pins =
+				/* spdif_tx_m2 */
+				<1 RK_PB7 2 &pcfg_pull_none>;
+		};
+	};
+
+	spi0 {
+		spi0m0_pins: spi0m0-pins {
+			rockchip,pins =
+				/* spi0_clk_m0 */
+				<0 RK_PC3 3 &pcfg_pull_none>,
+				/* spi0_miso_m0 */
+				<0 RK_PC5 3 &pcfg_pull_none>,
+				/* spi0_mosi_m0 */
+				<0 RK_PC4 3 &pcfg_pull_none>;
+		};
+
+		spi0m0_csn0: spi0m0-csn0 {
+			rockchip,pins =
+				/* spi0m0_csn0 */
+				<0 RK_PC2 3 &pcfg_pull_none>;
+		};
+		spi0m0_csn1: spi0m0-csn1 {
+			rockchip,pins =
+				/* spi0m0_csn1 */
+				<0 RK_PB7 1 &pcfg_pull_none>;
+		};
+
+		spi0m1_pins: spi0m1-pins {
+			rockchip,pins =
+				/* spi0_clk_m1 */
+				<3 RK_PB5 4 &pcfg_pull_none>,
+				/* spi0_miso_m1 */
+				<3 RK_PC0 4 &pcfg_pull_none>,
+				/* spi0_mosi_m1 */
+				<3 RK_PB4 4 &pcfg_pull_none>;
+		};
+
+		spi0m1_csn0: spi0m1-csn0 {
+			rockchip,pins =
+				/* spi0m1_csn0 */
+				<3 RK_PB7 4 &pcfg_pull_none>;
+		};
+		spi0m1_csn1: spi0m1-csn1 {
+			rockchip,pins =
+				/* spi0m1_csn1 */
+				<3 RK_PB6 4 &pcfg_pull_none>;
+		};
+	};
+
+	spi1 {
+		spi1m0_pins: spi1m0-pins {
+			rockchip,pins =
+				/* spi1_clk_m0 */
+				<3 RK_PD6 4 &pcfg_pull_none>,
+				/* spi1_miso_m0 */
+				<4 RK_PA3 4 &pcfg_pull_none>,
+				/* spi1_mosi_m0 */
+				<4 RK_PA2 4 &pcfg_pull_none>;
+		};
+
+		spi1m0_csn0: spi1m0-csn0 {
+			rockchip,pins =
+				/* spi1m0_csn0 */
+				<3 RK_PD7 4 &pcfg_pull_none>;
+		};
+		spi1m0_csn1: spi1m0-csn1 {
+			rockchip,pins =
+				/* spi1m0_csn1 */
+				<4 RK_PA0 4 &pcfg_pull_none>;
+		};
+
+		spi1m1_pins: spi1m1-pins {
+			rockchip,pins =
+				/* spi1_clk_m1 */
+				<1 RK_PC0 4 &pcfg_pull_none>,
+				/* spi1_miso_m1 */
+				<1 RK_PB4 4 &pcfg_pull_none>,
+				/* spi1_mosi_m1 */
+				<1 RK_PB3 4 &pcfg_pull_none>;
+		};
+
+		spi1m1_csn0: spi1m1-csn0 {
+			rockchip,pins =
+				/* spi1m1_csn0 */
+				<1 RK_PB6 4 &pcfg_pull_none>;
+		};
+		spi1m1_csn1: spi1m1-csn1 {
+			rockchip,pins =
+				/* spi1m1_csn1 */
+				<1 RK_PB5 4 &pcfg_pull_none>;
+		};
+	};
+
+	spi2 {
+		spi2m0_pins: spi2m0-pins {
+			rockchip,pins =
+				/* spi2_clk_m0 */
+				<4 RK_PB6 4 &pcfg_pull_none>,
+				/* spi2_miso_m0 */
+				<3 RK_PD2 4 &pcfg_pull_none>,
+				/* spi2_mosi_m0 */
+				<3 RK_PD3 4 &pcfg_pull_none>;
+		};
+
+		spi2m0_csn0: spi2m0-csn0 {
+			rockchip,pins =
+				/* spi2m0_csn0 */
+				<4 RK_PB5 4 &pcfg_pull_none>;
+		};
+		spi2m0_csn1: spi2m0-csn1 {
+			rockchip,pins =
+				/* spi2m0_csn1 */
+				<4 RK_PB4 4 &pcfg_pull_none>;
+		};
+
+		spi2m1_pins: spi2m1-pins {
+			rockchip,pins =
+				/* spi2_clk_m1 */
+				<2 RK_PA1 4 &pcfg_pull_none>,
+				/* spi2_miso_m1 */
+				<2 RK_PA0 4 &pcfg_pull_none>,
+				/* spi2_mosi_m1 */
+				<1 RK_PD7 4 &pcfg_pull_none>;
+		};
+
+		spi2m1_csn0: spi2m1-csn0 {
+			rockchip,pins =
+				/* spi2m1_csn0 */
+				<1 RK_PD6 4 &pcfg_pull_none>;
+		};
+		spi2m1_csn1: spi2m1-csn1 {
+			rockchip,pins =
+				/* spi2m1_csn1 */
+				<1 RK_PD5 4 &pcfg_pull_none>;
+		};
+	};
+
+	tsadc {
+		tsadcm0_pins: tsadcm0-pins {
+			rockchip,pins =
+				/* tsadc_shut_m0 */
+				<0 RK_PA1 1 &pcfg_pull_none>;
+		};
+
+		tsadcm1_pins: tsadcm1-pins {
+			rockchip,pins =
+				/* tsadc_shut_m1 */
+				<0 RK_PA2 2 &pcfg_pull_none>;
+		};
+
+		tsadc_shut_org: tsadc-shut-org {
+			rockchip,pins =
+				/* tsadc_shut_org */
+				<0 RK_PA1 2 &pcfg_pull_none>;
+		};
+	};
+
+	uart0 {
+		uart0m0_xfer: uart0m0-xfer {
+			rockchip,pins =
+				/* uart0_rx_m0 */
+				<0 RK_PD0 1 &pcfg_pull_up>,
+				/* uart0_tx_m0 */
+				<0 RK_PD1 1 &pcfg_pull_up>;
+		};
+
+		uart0m1_xfer: uart0m1-xfer {
+			rockchip,pins =
+				/* uart0_rx_m1 */
+				<1 RK_PB3 2 &pcfg_pull_up>,
+				/* uart0_tx_m1 */
+				<1 RK_PB4 2 &pcfg_pull_up>;
+		};
+	};
+
+	uart1 {
+		uart1m0_xfer: uart1m0-xfer {
+			rockchip,pins =
+				/* uart1_rx_m0 */
+				<1 RK_PD1 1 &pcfg_pull_up>,
+				/* uart1_tx_m0 */
+				<1 RK_PD2 1 &pcfg_pull_up>;
+		};
+
+		uart1m0_ctsn: uart1m0-ctsn {
+			rockchip,pins =
+				/* uart1m0_ctsn */
+				<1 RK_PD4 1 &pcfg_pull_none>;
+		};
+		uart1m0_rtsn: uart1m0-rtsn {
+			rockchip,pins =
+				/* uart1m0_rtsn */
+				<1 RK_PD3 1 &pcfg_pull_none>;
+		};
+
+		uart1m1_xfer: uart1m1-xfer {
+			rockchip,pins =
+				/* uart1_rx_m1 */
+				<4 RK_PA6 3 &pcfg_pull_up>,
+				/* uart1_tx_m1 */
+				<4 RK_PA5 3 &pcfg_pull_up>;
+		};
+
+		uart1m1_ctsn: uart1m1-ctsn {
+			rockchip,pins =
+				/* uart1m1_ctsn */
+				<4 RK_PB0 3 &pcfg_pull_none>;
+		};
+		uart1m1_rtsn: uart1m1-rtsn {
+			rockchip,pins =
+				/* uart1m1_rtsn */
+				<4 RK_PA7 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart2 {
+		uart2m0_xfer: uart2m0-xfer {
+			rockchip,pins =
+				/* uart2_rx_m0 */
+				<0 RK_PC1 1 &pcfg_pull_up>,
+				/* uart2_tx_m0 */
+				<0 RK_PC0 1 &pcfg_pull_up>;
+		};
+
+		uart2m0_ctsn: uart2m0-ctsn {
+			rockchip,pins =
+				/* uart2m0_ctsn */
+				<0 RK_PC2 1 &pcfg_pull_none>;
+		};
+		uart2m0_rtsn: uart2m0-rtsn {
+			rockchip,pins =
+				/* uart2m0_rtsn */
+				<0 RK_PC3 1 &pcfg_pull_none>;
+		};
+
+		uart2m1_xfer: uart2m1-xfer {
+			rockchip,pins =
+				/* uart2_rx_m1 */
+				<3 RK_PA1 2 &pcfg_pull_up>,
+				/* uart2_tx_m1 */
+				<3 RK_PA0 2 &pcfg_pull_up>;
+		};
+
+		uart2m1_ctsn: uart2m1-ctsn {
+			rockchip,pins =
+				/* uart2m1_ctsn */
+				<3 RK_PA2 2 &pcfg_pull_none>;
+		};
+		uart2m1_rtsn: uart2m1-rtsn {
+			rockchip,pins =
+				/* uart2m1_rtsn */
+				<3 RK_PA3 2 &pcfg_pull_none>;
+		};
+	};
+
+	uart3 {
+		uart3m0_xfer: uart3m0-xfer {
+			rockchip,pins =
+				/* uart3_rx_m0 */
+				<4 RK_PB5 6 &pcfg_pull_up>,
+				/* uart3_tx_m0 */
+				<4 RK_PB4 6 &pcfg_pull_up>;
+		};
+
+		uart3m0_ctsn: uart3m0-ctsn {
+			rockchip,pins =
+				/* uart3m0_ctsn */
+				<4 RK_PB6 3 &pcfg_pull_none>;
+		};
+		uart3m0_rtsn: uart3m0-rtsn {
+			rockchip,pins =
+				/* uart3m0_rtsn */
+				<3 RK_PD1 4 &pcfg_pull_none>;
+		};
+
+		uart3m1_xfer: uart3m1-xfer {
+			rockchip,pins =
+				/* uart3_rx_m1 */
+				<3 RK_PC0 3 &pcfg_pull_up>,
+				/* uart3_tx_m1 */
+				<3 RK_PB7 3 &pcfg_pull_up>;
+		};
+
+		uart3m1_ctsn: uart3m1-ctsn {
+			rockchip,pins =
+				/* uart3m1_ctsn */
+				<3 RK_PB6 3 &pcfg_pull_none>;
+		};
+		uart3m1_rtsn: uart3m1-rtsn {
+			rockchip,pins =
+				/* uart3m1_rtsn */
+				<3 RK_PC1 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart4 {
+		uart4m0_xfer: uart4m0-xfer {
+			rockchip,pins =
+				/* uart4_rx_m0 */
+				<3 RK_PD1 3 &pcfg_pull_up>,
+				/* uart4_tx_m0 */
+				<3 RK_PD0 3 &pcfg_pull_up>;
+		};
+
+		uart4m0_ctsn: uart4m0-ctsn {
+			rockchip,pins =
+				/* uart4m0_ctsn */
+				<3 RK_PC5 3 &pcfg_pull_none>;
+		};
+		uart4m0_rtsn: uart4m0-rtsn {
+			rockchip,pins =
+				/* uart4m0_rtsn */
+				<3 RK_PC6 3 &pcfg_pull_none>;
+		};
+
+		uart4m1_xfer: uart4m1-xfer {
+			rockchip,pins =
+				/* uart4_rx_m1 */
+				<1 RK_PD5 3 &pcfg_pull_up>,
+				/* uart4_tx_m1 */
+				<1 RK_PD6 3 &pcfg_pull_up>;
+		};
+
+		uart4m1_ctsn: uart4m1-ctsn {
+			rockchip,pins =
+				/* uart4m1_ctsn */
+				<2 RK_PA0 3 &pcfg_pull_none>;
+		};
+		uart4m1_rtsn: uart4m1-rtsn {
+			rockchip,pins =
+				/* uart4m1_rtsn */
+				<1 RK_PD7 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart5 {
+		uart5m0_xfer: uart5m0-xfer {
+			rockchip,pins =
+				/* uart5_rx_m0 */
+				<1 RK_PB7 3 &pcfg_pull_up>,
+				/* uart5_tx_m0 */
+				<1 RK_PC0 3 &pcfg_pull_up>;
+		};
+
+		uart5m0_ctsn: uart5m0-ctsn {
+			rockchip,pins =
+				/* uart5m0_ctsn */
+				<1 RK_PB5 3 &pcfg_pull_none>;
+		};
+		uart5m0_rtsn: uart5m0-rtsn {
+			rockchip,pins =
+				/* uart5m0_rtsn */
+				<1 RK_PB6 3 &pcfg_pull_none>;
+		};
+
+		uart5m1_xfer: uart5m1-xfer {
+			rockchip,pins =
+				/* uart5_rx_m1 */
+				<3 RK_PA7 5 &pcfg_pull_up>,
+				/* uart5_tx_m1 */
+				<3 RK_PA6 5 &pcfg_pull_up>;
+		};
+
+		uart5m1_ctsn: uart5m1-ctsn {
+			rockchip,pins =
+				/* uart5m1_ctsn */
+				<3 RK_PA0 5 &pcfg_pull_none>;
+		};
+		uart5m1_rtsn: uart5m1-rtsn {
+			rockchip,pins =
+				/* uart5m1_rtsn */
+				<3 RK_PA1 5 &pcfg_pull_none>;
+		};
+	};
+
+	uart6 {
+		uart6m0_xfer: uart6m0-xfer {
+			rockchip,pins =
+				/* uart6_rx_m0 */
+				<0 RK_PC7 1 &pcfg_pull_up>,
+				/* uart6_tx_m0 */
+				<0 RK_PC6 1 &pcfg_pull_up>;
+		};
+
+		uart6m0_ctsn: uart6m0-ctsn {
+			rockchip,pins =
+				/* uart6m0_ctsn */
+				<0 RK_PC4 1 &pcfg_pull_none>;
+		};
+		uart6m0_rtsn: uart6m0-rtsn {
+			rockchip,pins =
+				/* uart6m0_rtsn */
+				<0 RK_PC5 1 &pcfg_pull_none>;
+		};
+
+		uart6m1_xfer: uart6m1-xfer {
+			rockchip,pins =
+				/* uart6_rx_m1 */
+				<4 RK_PB0 5 &pcfg_pull_up>,
+				/* uart6_tx_m1 */
+				<4 RK_PA7 5 &pcfg_pull_up>;
+		};
+
+		uart6m1_ctsn: uart6m1-ctsn {
+			rockchip,pins =
+				/* uart6m1_ctsn */
+				<4 RK_PA2 3 &pcfg_pull_none>;
+		};
+		uart6m1_rtsn: uart6m1-rtsn {
+			rockchip,pins =
+				/* uart6m1_rtsn */
+				<4 RK_PA3 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart7 {
+		uart7m0_xfer: uart7m0-xfer {
+			rockchip,pins =
+				/* uart7_rx_m0 */
+				<3 RK_PC7 3 &pcfg_pull_up>,
+				/* uart7_tx_m0 */
+				<3 RK_PC4 3 &pcfg_pull_up>;
+		};
+
+		uart7m0_ctsn: uart7m0-ctsn {
+			rockchip,pins =
+				/* uart7m0_ctsn */
+				<3 RK_PD2 3 &pcfg_pull_none>;
+		};
+		uart7m0_rtsn: uart7m0-rtsn {
+			rockchip,pins =
+				/* uart7m0_rtsn */
+				<3 RK_PD3 3 &pcfg_pull_none>;
+		};
+
+		uart7m1_xfer: uart7m1-xfer {
+			rockchip,pins =
+				/* uart7_rx_m1 */
+				<1 RK_PB3 3 &pcfg_pull_up>,
+				/* uart7_tx_m1 */
+				<1 RK_PB4 3 &pcfg_pull_up>;
+		};
+	};
+
+	uart8 {
+		uart8m0_xfer: uart8m0-xfer {
+			rockchip,pins =
+				/* uart8_rx_m0 */
+				<3 RK_PB3 3 &pcfg_pull_up>,
+				/* uart8_tx_m0 */
+				<3 RK_PB2 3 &pcfg_pull_up>;
+		};
+
+		uart8m0_ctsn: uart8m0-ctsn {
+			rockchip,pins =
+				/* uart8m0_ctsn */
+				<3 RK_PB4 3 &pcfg_pull_none>;
+		};
+		uart8m0_rtsn: uart8m0-rtsn {
+			rockchip,pins =
+				/* uart8m0_rtsn */
+				<3 RK_PB5 3 &pcfg_pull_none>;
+		};
+
+		uart8m1_xfer: uart8m1-xfer {
+			rockchip,pins =
+				/* uart8_rx_m1 */
+				<3 RK_PD5 3 &pcfg_pull_up>,
+				/* uart8_tx_m1 */
+				<3 RK_PD4 3 &pcfg_pull_up>;
+		};
+
+		uart8m1_ctsn: uart8m1-ctsn {
+			rockchip,pins =
+				/* uart8m1_ctsn */
+				<3 RK_PD7 3 &pcfg_pull_none>;
+		};
+		uart8m1_rtsn: uart8m1-rtsn {
+			rockchip,pins =
+				/* uart8m1_rtsn */
+				<4 RK_PA0 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart9 {
+		uart9m0_xfer: uart9m0-xfer {
+			rockchip,pins =
+				/* uart9_rx_m0 */
+				<4 RK_PB3 3 &pcfg_pull_up>,
+				/* uart9_tx_m0 */
+				<4 RK_PB2 3 &pcfg_pull_up>;
+		};
+
+		uart9m0_ctsn: uart9m0-ctsn {
+			rockchip,pins =
+				/* uart9m0_ctsn */
+				<4 RK_PB4 3 &pcfg_pull_none>;
+		};
+		uart9m0_rtsn: uart9m0-rtsn {
+			rockchip,pins =
+				/* uart9m0_rtsn */
+				<4 RK_PB5 3 &pcfg_pull_none>;
+		};
+
+		uart9m1_xfer: uart9m1-xfer {
+			rockchip,pins =
+				/* uart9_rx_m1 */
+				<3 RK_PC3 3 &pcfg_pull_up>,
+				/* uart9_tx_m1 */
+				<3 RK_PC2 3 &pcfg_pull_up>;
+		};
+	};
+
+	vo {
+		vo_pins: vo-pins {
+			rockchip,pins =
+				/* vo_lcdc_clk */
+				<4 RK_PB7 1 &pcfg_pull_none>,
+				/* vo_lcdc_d0 */
+				<4 RK_PA4 1 &pcfg_pull_none>,
+				/* vo_lcdc_d1 */
+				<4 RK_PA5 1 &pcfg_pull_none>,
+				/* vo_lcdc_d2 */
+				<4 RK_PB2 1 &pcfg_pull_none>,
+				/* vo_lcdc_d3 */
+				<3 RK_PC4 1 &pcfg_pull_none>,
+				/* vo_lcdc_d4 */
+				<3 RK_PC5 1 &pcfg_pull_none>,
+				/* vo_lcdc_d5 */
+				<3 RK_PC6 1 &pcfg_pull_none>,
+				/* vo_lcdc_d6 */
+				<3 RK_PC7 1 &pcfg_pull_none>,
+				/* vo_lcdc_d7 */
+				<3 RK_PD0 1 &pcfg_pull_none>,
+				/* vo_lcdc_d8 */
+				<4 RK_PA6 1 &pcfg_pull_none>,
+				/* vo_lcdc_d9 */
+				<4 RK_PA7 1 &pcfg_pull_none>,
+				/* vo_lcdc_d10 */
+				<3 RK_PD1 1 &pcfg_pull_none>,
+				/* vo_lcdc_d11 */
+				<3 RK_PD2 1 &pcfg_pull_none>,
+				/* vo_lcdc_d12 */
+				<3 RK_PD3 1 &pcfg_pull_none>,
+				/* vo_lcdc_d13 */
+				<3 RK_PD4 1 &pcfg_pull_none>,
+				/* vo_lcdc_d14 */
+				<3 RK_PD5 1 &pcfg_pull_none>,
+				/* vo_lcdc_d15 */
+				<3 RK_PD6 1 &pcfg_pull_none>,
+				/* vo_lcdc_d16 */
+				<4 RK_PB0 1 &pcfg_pull_none>,
+				/* vo_lcdc_d17 */
+				<4 RK_PB1 1 &pcfg_pull_none>,
+				/* vo_lcdc_d18 */
+				<4 RK_PB3 1 &pcfg_pull_none>,
+				/* vo_lcdc_d19 */
+				<3 RK_PD7 1 &pcfg_pull_none>,
+				/* vo_lcdc_d20 */
+				<4 RK_PA0 1 &pcfg_pull_none>,
+				/* vo_lcdc_d21 */
+				<4 RK_PA1 1 &pcfg_pull_none>,
+				/* vo_lcdc_d22 */
+				<4 RK_PA2 1 &pcfg_pull_none>,
+				/* vo_lcdc_d23 */
+				<4 RK_PA3 1 &pcfg_pull_none>,
+				/* vo_lcdc_den */
+				<4 RK_PB6 1 &pcfg_pull_none>,
+				/* vo_lcdc_hsync */
+				<4 RK_PB4 1 &pcfg_pull_none>,
+				/* vo_lcdc_vsync */
+				<4 RK_PB5 1 &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/u-boot/arch/arm/dts/rk3562-u-boot.dtsi b/u-boot/arch/arm/dts/rk3562-u-boot.dtsi
new file mode 100644
index 0000000..98c2e70
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3562-u-boot.dtsi
@@ -0,0 +1,203 @@
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+/ {
+	aliases {
+		mmc0 = &sdhci;
+		mmc1 = &sdmmc0;
+	};
+
+	chosen {
+		stdout-path = &uart2;
+		u-boot,spl-boot-order = &sdmmc0, &sdhci, &spi_nand, &spi_nor;
+	};
+
+	secure-otp@ff920000 {
+		compatible = "rockchip,rk3562-secure-otp";
+		reg = <0x0 0xff920000 0x0 0x4000>;
+		secure_conf = <0xff020034>;
+		mask_addr = <0x0>;
+		cru_rst_addr = <0xff130438>;
+		u-boot,dm-spl;
+		status = "okay";
+	};
+};
+
+&sys_grf {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&ioc_grf {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&pmu_grf {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&usbphy_grf {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&firmware {
+	u-boot,dm-spl;
+};
+
+&scmi {
+	u-boot,dm-spl;
+};
+
+&scmi_clk {
+	u-boot,dm-spl;
+};
+
+&scmi_shmem {
+	u-boot,dm-spl;
+};
+
+&cru {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&crypto {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&rng {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&uart2 {
+	clock-frequency = <24000000>;
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&saradc0 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&psci {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&sdhci {
+	bus-width = <8>;
+	u-boot,dm-spl;
+	/delete-property/ pinctrl-names;
+	/delete-property/ pinctrl-0;
+	mmc-hs400-1_8v;
+	mmc-hs400-enhanced-strobe;
+	fixed-emmc-driver-type = <1>;
+	status = "okay";
+};
+
+&sdmmc0 {
+	u-boot,dm-spl;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>;
+	status = "okay";
+};
+
+&sdmmc0_pins {
+	u-boot,dm-spl;
+};
+
+&sdmmc0_bus4 {
+	u-boot,dm-spl;
+};
+
+&sdmmc0_clk {
+	u-boot,dm-spl;
+};
+
+&sdmmc0_cmd {
+	u-boot,dm-spl;
+};
+
+&sdmmc0_det {
+	u-boot,dm-spl;
+};
+
+&sfc {
+	u-boot,dm-spl;
+	status = "okay";
+
+	#address-cells = <1>;
+	#size-cells = <0>;
+	spi_nand: flash@0 {
+		u-boot,dm-spl;
+		compatible = "spi-nand";
+		reg = <0>;
+		spi-tx-bus-width = <1>;
+		spi-rx-bus-width = <4>;
+		spi-max-frequency = <80000000>;
+	};
+
+	spi_nor: flash@1 {
+		u-boot,dm-spl;
+		compatible = "jedec,spi-nor";
+		label = "sfc_nor";
+		reg = <0>;
+		spi-tx-bus-width = <1>;
+		spi-rx-bus-width = <4>;
+		spi-max-frequency = <80000000>;
+	};
+};
+
+&pinctrl {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&gpio0 {
+	u-boot,dm-pre-reloc;
+};
+
+&gpio1 {
+	u-boot,dm-pre-reloc;
+};
+
+&gpio2 {
+	u-boot,dm-pre-reloc;
+};
+
+&gpio3 {
+	u-boot,dm-pre-reloc;
+};
+
+&gpio4 {
+	u-boot,dm-pre-reloc;
+};
+
+&pcfg_pull_up_drv_level_2 {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&pcfg_pull_up {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
+&u2phy {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&u2phy_otg {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
diff --git a/u-boot/arch/arm/dts/rk3562.dtsi b/u-boot/arch/arm/dts/rk3562.dtsi
new file mode 100644
index 0000000..af9d278
--- /dev/null
+++ b/u-boot/arch/arm/dts/rk3562.dtsi
@@ -0,0 +1,2325 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#include <dt-bindings/clock/rk3562-cru.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/phy/phy.h>
+#include <dt-bindings/power/rk3562-power.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/soc/rockchip,boot-mode.h>
+#include <dt-bindings/soc/rockchip-system-status.h>
+#include <dt-bindings/thermal/thermal.h>
+
+/ {
+	compatible = "rockchip,rk3562";
+
+	interrupt-parent = <&gic>;
+	#address-cells = <2>;
+	#size-cells = <2>;
+
+	aliases {
+		csi2dphy0 = &csi2_dphy0;
+		csi2dphy1 = &csi2_dphy1;
+		csi2dphy2 = &csi2_dphy2;
+		csi2dphy3 = &csi2_dphy3;
+		csi2dphy4 = &csi2_dphy4;
+		csi2dphy5 = &csi2_dphy5;
+		ethernet0 = &gmac0;
+		ethernet1 = &gmac1;
+		gpio0 = &gpio0;
+		gpio1 = &gpio1;
+		gpio2 = &gpio2;
+		gpio3 = &gpio3;
+		gpio4 = &gpio4;
+		i2c0 = &i2c0;
+		i2c1 = &i2c1;
+		i2c2 = &i2c2;
+		i2c3 = &i2c3;
+		i2c4 = &i2c4;
+		i2c5 = &i2c5;
+		rkcif_mipi_lvds0= &rkcif_mipi_lvds;
+		rkcif_mipi_lvds1= &rkcif_mipi_lvds1;
+		rkcif_mipi_lvds2= &rkcif_mipi_lvds2;
+		rkcif_mipi_lvds3= &rkcif_mipi_lvds3;
+		serial0 = &uart0;
+		serial1 = &uart1;
+		serial2 = &uart2;
+		serial3 = &uart3;
+		serial4 = &uart4;
+		serial5 = &uart5;
+		serial6 = &uart6;
+		serial7 = &uart7;
+		serial8 = &uart8;
+		serial9 = &uart9;
+		spi0 = &spi0;
+		spi1 = &spi1;
+		spi2 = &spi2;
+		spi3 = &sfc;
+	};
+
+	clocks {
+		compatible = "simple-bus";
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		xin32k: xin32k {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <32768>;
+			clock-output-names = "xin32k";
+		};
+
+		xin24m: xin24m {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <24000000>;
+			clock-output-names = "xin24m";
+		};
+
+		aclk_vepu: aclk_vepu@ff100324 {
+			compatible = "rockchip,rk3562-clock-gate-link";
+			reg = <0 0xff100324 0 0x10>;
+			clock-names = "link";
+			clocks = <&cru ACLK_ISP>;
+			#power-domain-cells = <1>;
+			#clock-cells = <0>;
+		};
+
+		aclk_vdpu: aclk_vdpu@ff100328 {
+			compatible = "rockchip,rk3562-clock-gate-link";
+			reg = <0 0xff100328 0 0x10>;
+			clock-names = "link";
+			clocks = <&cru ACLK_TOP_VIO>;
+			#power-domain-cells = <1>;
+			#clock-cells = <0>;
+		};
+
+		aclk_vi_isp: aclk_vi_isp@ff10032c {
+			compatible = "rockchip,rk3562-clock-gate-link";
+			reg = <0 0xff10032c 0 0x10>;
+			clock-names = "link";
+			clocks = <&cru ACLK_TOP_VIO>;
+			#power-domain-cells = <1>;
+			#clock-cells = <0>;
+		};
+
+		aclk_vo: aclk_vo@ff100334 {
+			compatible = "rockchip,rk3562-clock-gate-link";
+			reg = <0 0xff100334 0 0x10>;
+			clock-names = "link";
+			clocks = <&cru ACLK_TOP_VIO>;
+			#power-domain-cells = <1>;
+			#clock-cells = <0>;
+		};
+
+		aclk_rga_jdec: aclk_rga_jdec@ff100338 {
+			compatible = "rockchip,rk3562-clock-gate-link";
+			reg = <0 0xff100338 0 0x10>;
+			clock-names = "link";
+			clocks = <&cru ACLK_VOP>;
+			#power-domain-cells = <1>;
+			#clock-cells = <0>;
+		};
+	};
+
+	cpus {
+		#address-cells = <2>;
+		#size-cells = <0>;
+
+		cpu0: cpu@0 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x0>;
+			enable-method = "psci";
+			clocks = <&cru ARMCLK>;
+			operating-points-v2 = <&cpu0_opp_table>;
+		};
+		cpu1: cpu@1 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x1>;
+			enable-method = "psci";
+			clocks = <&cru ARMCLK>;
+			operating-points-v2 = <&cpu0_opp_table>;
+		};
+		cpu2: cpu@2 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x2>;
+			enable-method = "psci";
+			clocks = <&cru ARMCLK>;
+			operating-points-v2 = <&cpu0_opp_table>;
+		};
+		cpu3: cpu@3 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a53";
+			reg = <0x0 0x3>;
+			enable-method = "psci";
+			clocks = <&cru ARMCLK>;
+			operating-points-v2 = <&cpu0_opp_table>;
+		};
+	};
+
+	cpu0_opp_table: cpu0-opp-table {
+		compatible = "operating-points-v2";
+		opp-shared;
+
+		nvmem-cells = <&cpu_leakage>;
+		nvmem-cell-names = "leakage";
+
+		opp-408000000 {
+			opp-hz = /bits/ 64 <408000000>;
+			opp-microvolt = <900000 900000 1100000>;
+			clock-latency-ns = <40000>;
+			opp-suspend;
+		};
+		opp-600000000 {
+			opp-hz = /bits/ 64 <600000000>;
+			opp-microvolt = <900000 900000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-816000000 {
+			opp-hz = /bits/ 64 <816000000>;
+			opp-microvolt = <900000 900000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1008000000 {
+			opp-hz = /bits/ 64 <1008000000>;
+			opp-microvolt = <900000 900000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1200000000 {
+			opp-hz = /bits/ 64 <1200000000>;
+			opp-microvolt = <900000 900000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+	};
+
+	arm-pmu {
+		compatible = "arm,cortex-a53-pmu";
+		interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 229 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 231 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
+	};
+
+	cpuinfo {
+		compatible = "rockchip,cpuinfo";
+		nvmem-cells = <&otp_id>, <&otp_cpu_version>, <&cpu_code>;
+		nvmem-cell-names = "id", "cpu-version", "cpu-code";
+	};
+
+	/* dphy0 full mode */
+	csi2_dphy0: csi2-dphy0 {
+		compatible = "rockchip,rk3562-csi2-dphy";
+		rockchip,hw = <&csi2_dphy0_hw>;
+		status = "disabled";
+	};
+
+	/* dphy0 split mode 01 */
+	csi2_dphy1: csi2-dphy1 {
+		compatible = "rockchip,rk3562-csi2-dphy";
+		rockchip,hw = <&csi2_dphy0_hw>;
+		status = "disabled";
+	};
+
+	/* dphy0 split mode 23 */
+	csi2_dphy2: csi2-dphy2 {
+		compatible = "rockchip,rk3562-csi2-dphy";
+		rockchip,hw = <&csi2_dphy0_hw>;
+		status = "disabled";
+	};
+
+	/* dphy1 full mode */
+	csi2_dphy3: csi2-dphy3 {
+		compatible = "rockchip,rk3562-csi2-dphy";
+		rockchip,hw = <&csi2_dphy1_hw>;
+		status = "disabled";
+	};
+
+	/* dphy1 split mode 01 */
+	csi2_dphy4: csi2-dphy4 {
+		compatible = "rockchip,rk3562-csi2-dphy";
+		rockchip,hw = <&csi2_dphy1_hw>;
+		status = "disabled";
+	};
+
+	/* dphy1 split mode 23 */
+	csi2_dphy5: csi2-dphy5 {
+		compatible = "rockchip,rk3562-csi2-dphy";
+		rockchip,hw = <&csi2_dphy1_hw>;
+		status = "disabled";
+	};
+
+	display_subsystem: display-subsystem {
+		compatible = "rockchip,display-subsystem";
+		ports = <&vop_out>;
+		status = "disabled";
+	};
+
+	firmware: firmware {
+		scmi: scmi {
+			compatible = "arm,scmi-smc";
+			shmem = <&scmi_shmem>;
+			arm,smc-id = <0x82000010>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			scmi_clk: protocol@14 {
+				reg = <0x14>;
+				#clock-cells = <1>;
+			};
+		};
+	};
+
+	mpp_srv: mpp-srv {
+		compatible = "rockchip,mpp-service";
+		rockchip,taskqueue-count = <3>;
+		rockchip,resetgroup-count = <3>;
+		status = "disabled";
+	};
+
+	psci: psci {
+		compatible = "arm,psci-1.0";
+		method = "smc";
+	};
+
+	rkcif_mipi_lvds: rkcif-mipi-lvds {
+		compatible = "rockchip,rkcif-mipi-lvds";
+		rockchip,hw = <&rkcif>;
+		iommus = <&rkcif_mmu>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds_sditf: rkcif-mipi-lvds-sditf {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds_sditf_vir1: rkcif-mipi-lvds-sditf-vir1 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds_sditf_vir2: rkcif-mipi-lvds-sditf-vir2 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds_sditf_vir3: rkcif-mipi-lvds-sditf-vir3 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds1: rkcif-mipi-lvds1 {
+		compatible = "rockchip,rkcif-mipi-lvds";
+		rockchip,hw = <&rkcif>;
+		iommus = <&rkcif_mmu>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds1_sditf: rkcif-mipi-lvds1-sditf {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds1>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds1_sditf_vir1: rkcif-mipi-lvds1-sditf-vir1 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds1>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds1_sditf_vir2: rkcif-mipi-lvds1-sditf-vir2 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds1>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds1_sditf_vir3: rkcif-mipi-lvds1-sditf-vir3 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds1>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds2: rkcif-mipi-lvds2 {
+		compatible = "rockchip,rkcif-mipi-lvds";
+		rockchip,hw = <&rkcif>;
+		iommus = <&rkcif_mmu>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds2_sditf: rkcif-mipi-lvds2-sditf {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds2>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds2_sditf_vir1: rkcif-mipi-lvds2-sditf-vir1 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds2>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds2_sditf_vir2: rkcif-mipi-lvds2-sditf-vir2 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds2>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds2_sditf_vir3: rkcif-mipi-lvds2-sditf-vir3 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds2>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds3: rkcif-mipi-lvds3 {
+		compatible = "rockchip,rkcif-mipi-lvds";
+		rockchip,hw = <&rkcif>;
+		iommus = <&rkcif_mmu>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds3_sditf: rkcif-mipi-lvds3-sditf {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds3>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds3_sditf_vir1: rkcif-mipi-lvds3-sditf-vir1 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds3>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds3_sditf_vir2: rkcif-mipi-lvds3-sditf-vir2 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds3>;
+		status = "disabled";
+	};
+
+	rkcif_mipi_lvds3_sditf_vir3: rkcif-mipi-lvds3-sditf-vir3 {
+		compatible = "rockchip,rkcif-sditf";
+		rockchip,cif = <&rkcif_mipi_lvds3>;
+		status = "disabled";
+	};
+
+	rkisp_vir0: rkisp-vir0 {
+		compatible = "rockchip,rkisp-vir";
+		rockchip,hw = <&rkisp>;
+		status = "disabled";
+	};
+
+	rkisp_vir1: rkisp-vir1 {
+		compatible = "rockchip,rkisp-vir";
+		rockchip,hw = <&rkisp>;
+		status = "disabled";
+	};
+
+	rkisp_vir2: rkisp-vir2 {
+		compatible = "rockchip,rkisp-vir";
+		rockchip,hw = <&rkisp>;
+		status = "disabled";
+	};
+
+	rkisp_vir3: rkisp-vir3 {
+		compatible = "rockchip,rkisp-vir";
+		rockchip,hw = <&rkisp>;
+		status = "disabled";
+	};
+
+	thermal_zones: thermal-zones {
+		soc_thermal: soc-thermal {
+			polling-delay-passive = <20>; /* milliseconds */
+			polling-delay = <1000>; /* milliseconds */
+
+			thermal-sensors = <&tsadc 0>;
+			trips {
+				soc_crit: soc-crit {
+					/* millicelsius */
+					temperature = <115000>;
+					/* millicelsius */
+					hysteresis = <2000>;
+					type = "critical";
+				};
+			};
+		};
+	};
+
+	timer {
+		compatible = "arm,armv8-timer";
+		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+			     <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+	};
+
+	scmi_shmem: scmi-shmem@10f000 {
+		compatible = "arm,scmi-shmem";
+		reg = <0x0 0x0010f000 0x0 0x100>;
+	};
+
+	usbdrd30: usbdrd {
+		compatible = "rockchip,rk3562-dwc3", "rockchip,rk3399-dwc3";
+		clocks = <&cru CLK_USB3OTG_REF>, <&cru CLK_USB3OTG_SUSPEND>,
+			 <&cru ACLK_USB3OTG>, <&cru PCLK_PHP>;
+		clock-names = "ref", "suspend", "bus", "pipe_clk";
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+		status = "disabled";
+
+		usbdrd_dwc3: usb@fe500000 {
+			compatible = "snps,dwc3";
+			reg = <0x0 0xfe500000 0x0 0x400000>;
+			interrupts = <GIC_SPI 149 IRQ_TYPE_LEVEL_HIGH>;
+			dr_mode = "otg";
+			phys = <&u2phy_otg>, <&combphy_pu PHY_TYPE_USB3>;
+			phy-names = "usb2-phy", "usb3-phy";
+			phy_type = "utmi_wide";
+			power-domains = <&power RK3562_PD_PHP>;
+			resets = <&cru SRST_USB3OTG>;
+			reset-names = "usb3-otg";
+			snps,dis_enblslpm_quirk;
+			snps,dis-u1-entry-quirk;
+			snps,dis-u2-entry-quirk;
+			snps,dis-u2-freeclk-exists-quirk;
+			snps,dis-del-phy-power-chg-quirk;
+			snps,dis-tx-ipgap-linecheck-quirk;
+			snps,dis_rxdet_inp3_quirk;
+			quirk-skip-phy-init;
+			status = "disabled";
+		};
+	};
+
+	gic: interrupt-controller@fe901000 {
+		compatible = "arm,gic-400";
+		#interrupt-cells = <3>;
+		#address-cells = <0>;
+		interrupt-controller;
+		reg = <0x0 0xfe901000 0 0x1000>,
+		      <0x0 0xfe902000 0 0x2000>,
+		      <0x0 0xfe904000 0 0x2000>,
+		      <0x0 0xfe906000 0 0x2000>;
+		interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+	};
+
+	usb_host0_ehci: usb@fed00000 {
+		compatible = "generic-ehci";
+		reg = <0x0 0xfed00000 0x0 0x40000>;
+		interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru HCLK_USB2HOST>, <&cru HCLK_USB2HOST_ARB>,
+			 <&u2phy>;
+		clock-names = "usbhost", "arbiter", "utmi";
+		phys = <&u2phy_host>;
+		phy-names = "usb2-phy";
+		status = "disabled";
+	};
+
+	usb_host0_ohci: usb@fed40000 {
+		compatible = "generic-ohci";
+		reg = <0x0 0xfed40000 0x0 0x40000>;
+		interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru HCLK_USB2HOST>, <&cru HCLK_USB2HOST_ARB>,
+			 <&u2phy>;
+		clock-names = "usbhost", "arbiter", "utmi";
+		phys = <&u2phy_host>;
+		phy-names = "usb2-phy";
+		status = "disabled";
+	};
+
+	qos_dma2ddr: qos@fee03800 {
+		compatible = "syscon";
+		reg = <0x0 0xfee03800 0x0 0x20>;
+	};
+
+	qos_mcu: qos@fee10000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee10000 0x0 0x20>;
+	};
+
+	qos_dft_apb: qos@fee10100 {
+		compatible = "syscon";
+		reg = <0x0 0xfee10100 0x0 0x20>;
+	};
+
+	qos_gmac: qos@fee10200 {
+		compatible = "syscon";
+		reg = <0x0 0xfee10200 0x0 0x20>;
+	};
+
+	qos_mac100: qos@fee10300 {
+		compatible = "syscon";
+		reg = <0x0 0xfee10300 0x0 0x20>;
+	};
+
+	qos_dcf: qos@fee10400 {
+		compatible = "syscon";
+		reg = <0x0 0xfee10400 0x0 0x20>;
+	};
+
+	qos_cpu: qos@fee20000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee20000 0x0 0x20>;
+	};
+
+	qos_daplite_apb: qos@fee20100 {
+		compatible = "syscon";
+		reg = <0x0 0xfee20100 0x0 0x20>;
+	};
+
+	qos_gpu: qos@fee30000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee30000 0x0 0x20>;
+	};
+
+	qos_npu: qos@fee40000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee40000 0x0 0x20>;
+	};
+
+	qos_rkvdec: qos@fee50000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee50000 0x0 0x20>;
+	};
+
+	qos_vepu: qos@fee60000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee60000 0x0 0x20>;
+	};
+
+	qos_isp: qos@fee70000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee70000 0x0 0x20>;
+	};
+
+	qos_vicap: qos@fee70100 {
+		compatible = "syscon";
+		reg = <0x0 0xfee70100 0x0 0x20>;
+	};
+
+	qos_vop: qos@fee80000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee80000 0x0 0x20>;
+	};
+
+	qos_jpeg: qos@fee90000 {
+		compatible = "syscon";
+		reg = <0x0 0xfee90000 0x0 0x20>;
+	};
+
+	qos_rga_rd: qos@fee90100 {
+		compatible = "syscon";
+		reg = <0x0 0xfee90100 0x0 0x20>;
+	};
+
+	qos_rga_wr: qos@fee90200 {
+		compatible = "syscon";
+		reg = <0x0 0xfee90200 0x0 0x20>;
+	};
+
+	qos_pcie: qos@feea0000 {
+		compatible = "syscon";
+		reg = <0x0 0xfeea0000 0x0 0x20>;
+	};
+
+	qos_usb3: qos@feea0100 {
+		compatible = "syscon";
+		reg = <0x0 0xfeea0100 0x0 0x20>;
+	};
+
+	qos_crypto_apb: qos@feeb0000 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0000 0x0 0x20>;
+	};
+
+	qos_crypto: qos@feeb0100 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0100 0x0 0x20>;
+	};
+
+	qos_dmac: qos@feeb0200 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0200 0x0 0x20>;
+	};
+
+	qos_emmc: qos@feeb0300 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0300 0x0 0x20>;
+	};
+
+	qos_fspi: qos@feeb0400 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0400 0x0 0x20>;
+	};
+
+	qos_rkdma: qos@feeb0500 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0500 0x0 0x20>;
+	};
+
+	qos_sdmmc0: qos@feeb0600 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0600 0x0 0x20>;
+	};
+
+	qos_sdmmc1: qos@feeb0700 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0700 0x0 0x20>;
+	};
+
+	qos_usb2: qos@feeb0800 {
+		compatible = "syscon";
+		reg = <0x0 0xfeeb0800 0x0 0x20>;
+	};
+
+	pmu_grf: syscon@ff010000 {
+		compatible = "rockchip,rk3562-pmu-grf", "syscon", "simple-mfd";
+		reg = <0x0 0xff010000 0x0 0x10000>;
+
+		reboot_mode: reboot-mode {
+			compatible = "syscon-reboot-mode";
+			offset = <0x200>;
+			mode-bootloader = <BOOT_BL_DOWNLOAD>;
+			mode-charge = <BOOT_CHARGING>;
+			mode-fastboot = <BOOT_FASTBOOT>;
+			mode-loader = <BOOT_BL_DOWNLOAD>;
+			mode-normal = <BOOT_NORMAL>;
+			mode-recovery = <BOOT_RECOVERY>;
+			mode-ums = <BOOT_UMS>;
+			mode-panic = <BOOT_PANIC>;
+			mode-watchdog = <BOOT_WATCHDOG>;
+		};
+	};
+
+	sys_grf: syscon@ff030000 {
+		compatible = "rockchip,rk3562-sys-grf", "syscon", "simple-mfd";
+		reg = <0x0 0xff030000 0x0 0x10000>;
+
+		lvds: lvds {
+			compatible = "rockchip,rk3562-lvds";
+			phys = <&video_phy>;
+			phy-names = "phy";
+			status = "disabled";
+
+			ports {
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				port@0 {
+					reg = <0>;
+					#address-cells = <1>;
+					#size-cells = <0>;
+
+					lvds_in_vp0: endpoint@0 {
+						reg = <0>;
+						remote-endpoint = <&vp0_out_lvds>;
+						status = "disabled";
+					};
+
+					lvds_in_vp1: endpoint@1 {
+						reg = <1>;
+						remote-endpoint = <&vp1_out_lvds>;
+						status = "disabled";
+					};
+				};
+			};
+		};
+
+		rgb: rgb {
+			compatible = "rockchip,rk3562-rgb";
+			pinctrl-names = "default";
+			pinctrl-0 = <&vo_pins>;
+			status = "disabled";
+
+			ports {
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				port@0 {
+					reg = <0>;
+					#address-cells = <1>;
+					#size-cells = <0>;
+
+					rgb_in_vp0: endpoint@0 {
+						reg = <0>;
+						remote-endpoint = <&vp0_out_rgb>;
+						status = "disabled";
+					};
+
+					rgb_in_vp1: endpoint@1 {
+						reg = <1>;
+						remote-endpoint = <&vp1_out_rgb>;
+						status = "disabled";
+					};
+				};
+			};
+		};
+	};
+
+	peri_grf: syscon@ff040000 {
+		compatible = "rockchip,rk3562-peri-grf", "syscon";
+		reg = <0x0 0xff040000 0x0 0x10000>;
+	};
+
+	ioc_grf: syscon@ff060000 {
+		compatible = "rockchip,rk3562-ioc-grf", "syscon";
+		reg = <0x0 0xff060000 0x0 0x30000>;
+	};
+
+	usbphy_grf: syscon@ff090000 {
+		compatible = "rockchip,rk3562-usbphy-grf", "syscon";
+		reg = <0x0 0xff090000 0x0 0x8000>;
+	};
+
+	pipephy_grf: syscon@ff098000 {
+		compatible = "rockchip,rk3562-pipephy-grf", "syscon";
+		reg = <0x0 0xff098000 0x0 0x8000>;
+	};
+
+	cru: clock-controller@ff100000 {
+		compatible = "rockchip,rk3562-cru";
+		reg = <0x0 0xff100000 0x0 0x40000>;
+		rockchip,grf = <&sys_grf>;
+		#clock-cells = <1>;
+		#reset-cells = <1>;
+
+		assigned-clocks =
+			<&cru PLL_GPLL>, <&cru PLL_CPLL>,
+			<&cru ARMCLK>;
+		assigned-clock-rates =
+			<1188000000>, <1000000000>,
+			<600000000>;
+	};
+
+	i2c0: i2c@ff200000 {
+		compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xff200000 0x0 0x1000>;
+		clocks = <&cru CLK_PMU0_I2C0>, <&cru PCLK_PMU0_I2C0>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	uart0: serial@ff210000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff210000 0x0 0x100>;
+		interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_PMU1_UART0>, <&cru PCLK_PMU1_UART0>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 0>;
+		status = "disabled";
+	};
+
+	spi0: spi@ff220000 {
+		compatible = "rockchip,rk3066-spi";
+		reg = <0x0 0xff220000 0x0 0x1000>;
+		interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru CLK_PMU1_SPI0>, <&cru PCLK_PMU1_SPI0>, <&cru PCLK_PMU1_SPI0>;
+		clock-names = "spiclk", "apb_pclk", "sclk_in";
+		dmas = <&dmac 13>, <&dmac 12>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&spi0m0_csn0 &spi0m0_csn1 &spi0m0_pins>;
+		num-cs = <2>;
+		status = "disabled";
+	};
+
+	pwm0: pwm@ff230000 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff230000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm0m0_pins>;
+		clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm1: pwm@ff230010 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff230010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm1m0_pins>;
+		clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm2: pwm@ff230020 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff230020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm2m0_pins>;
+		clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm3: pwm@ff230030 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff230030 0x0 0x10>;
+		interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm3m0_pins>;
+		clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pmu: power-management@ff258000 {
+		compatible = "rockchip,rk3562-pmu", "syscon", "simple-mfd";
+		reg = <0x0 0xff258000 0x0 0x1000>;
+
+		power: power-controller {
+			compatible = "rockchip,rk3562-power-controller";
+			#power-domain-cells = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+			status = "okay";
+
+			/* These power domains are grouped by VD_GPU */
+			pd_gpu@RK3562_PD_GPU {
+				reg = <RK3562_PD_GPU>;
+				pm_qos = <&qos_gpu>;
+			};
+			/* These power domains are grouped by VD_NPU */
+			pd_npu@RK3562_PD_NPU {
+				reg = <RK3562_PD_NPU>;
+				pm_qos = <&qos_npu>;
+			};
+			/* These power domains are grouped by VD_LOGIC */
+			pd_vdpu@RK3562_PD_VDPU {
+				reg = <RK3562_PD_VDPU>;
+				pm_qos = <&qos_rkvdec>;
+			};
+			pd_vi@RK3562_PD_VI {
+				reg = <RK3562_PD_VI>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+				pm_qos = <&qos_isp>,
+					 <&qos_vicap>;
+
+				pd_vepu@RK3562_PD_VEPU {
+					reg = <RK3562_PD_VEPU>;
+					pm_qos = <&qos_vepu>;
+				};
+			};
+			pd_vo@RK3562_PD_VO {
+				reg = <RK3562_PD_VO>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+				pm_qos = <&qos_vop>;
+
+				pd_rga@RK3562_PD_RGA {
+					reg = <RK3562_PD_RGA>;
+					pm_qos = <&qos_rga_rd>,
+						 <&qos_rga_wr>,
+						 <&qos_jpeg>;
+				};
+			};
+			pd_php@RK3562_PD_PHP {
+				reg = <RK3562_PD_PHP>;
+				pm_qos = <&qos_pcie>,
+					 <&qos_usb3>;
+			};
+		};
+	};
+
+	pmu_mailbox: mailbox@ff290000 {
+		compatible = "rockchip,rk3562-mailbox",
+			     "rockchip,rk3368-mailbox";
+		reg = <0x0 0xff290000 0x0 0x200>;
+		interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru PCLK_PMU1_MAILBOX>;
+		clock-names = "pclk_mailbox";
+		#mbox-cells = <1>;
+		status = "disabled";
+	};
+
+	rknpu: npu@ff300000 {
+		compatible = "rockchip,rk3562-rknpu";
+		reg = <0x0 0xff300000 0x0 0x10000>;
+		interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_RKNN>, <&cru HCLK_RKNN>;
+		clock-names = "aclk", "hclk";
+		assigned-clocks = <&cru ACLK_RKNN>;
+		assigned-clock-rates = <600000000>;
+		resets = <&cru SRST_A_RKNN>, <&cru SRST_H_RKNN>;
+		reset-names = "srst_a", "srst_h";
+		power-domains = <&power RK3562_PD_NPU>;
+		iommus = <&rknpu_mmu>;
+		status = "disabled";
+	};
+
+	rknpu_mmu: iommu@ff30b000 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff30b000 0x0 0x40>;
+		interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rknpu_mmu";
+		clocks = <&cru ACLK_RKNN>, <&cru HCLK_RKNN>;
+		clock-names = "aclk", "iface";
+		power-domains = <&power RK3562_PD_NPU>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	gpu: gpu@ff320000 {
+		compatible = "arm,mali-bifrost";
+		reg = <0x0 0xff320000 0x0 0x4000>;
+
+		interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "GPU", "MMU", "JOB";
+
+		upthreshold = <40>;
+		downdifferential = <10>;
+
+		clocks = <&cru CLK_GPU>, <&cru CLK_GPU_BRG>;
+		clock-names = "clk_gpu", "clk_gpu_brg";
+		power-domains = <&power RK3562_PD_GPU>;
+		operating-points-v2 = <&gpu_opp_table>;
+		#cooling-cells = <2>;
+
+		status = "disabled";
+	};
+
+	gpu_opp_table: gpu-opp-table {
+		compatible = "operating-points-v2";
+
+		nvmem-cells = <&gpu_leakage>;
+		nvmem-cell-names = "leakage";
+
+		opp-300000000 {
+			opp-hz = /bits/ 64 <300000000>;
+			opp-microvolt = <900000 900000 1000000>;
+		};
+		opp-400000000 {
+			opp-hz = /bits/ 64 <400000000>;
+			opp-microvolt = <900000 900000 1000000>;
+		};
+	};
+
+	rkvdec: rkvdec@ff340100 {
+		compatible = "rockchip,rkv-decoder-vdpu382", "rockchip,rkv-decoder-v2";
+		reg = <0x0 0xff340100 0x0 0x400>, <0x0 0xff340000 0x0 0x100>;
+		reg-names = "regs", "link";
+		interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "irq_dec";
+		clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, <&cru CLK_RKVDEC_HEVC_CA>;
+		clock-names = "aclk_vcodec", "hclk_vcodec","clk_hevc_cabac";
+		rockchip,normal-rates = <198000000>, <0>, <396000000>;
+		assigned-clocks = <&cru ACLK_RKVDEC>, <&cru CLK_RKVDEC_HEVC_CA>;
+		assigned-clock-rates = <198000000>, <396000000>;
+		resets = <&cru SRST_A_RKVDEC>, <&cru SRST_H_RKVDEC>,
+			 <&cru SRST_RKVDEC_HEVC_CA>;
+		reset-names = "video_a", "video_h", "video_hevc_cabac";
+		power-domains = <&power RK3562_PD_VDPU>;
+		iommus = <&rkvdec_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <0>;
+		rockchip,resetgroup-node = <0>;
+		rockchip,task-capacity = <16>;
+		status = "disabled";
+	};
+
+	rkvdec_mmu: iommu@ff340800 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff340800 0x0 0x40>, <0x0 0xff340900 0x0 0x40>;
+		interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rkvdec_mmu";
+		clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>;
+		clock-names = "aclk", "iface";
+		power-domains = <&power RK3562_PD_VDPU>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	rkvenc: rkvenc@ff360000 {
+		compatible = "rockchip,rkv-encoder-vepu540c", "rockchip,rkv-encoder-v2";
+		reg = <0x0 0xff360000 0x0 0x6000>;
+		interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "irq_rkvenc";
+		clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>, <&cru CLK_RKVENC_CORE>;
+		clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core";
+		rockchip,normal-rates = <297000000>, <0>, <297000000>;
+		resets = <&cru SRST_A_RKVENC>, <&cru SRST_H_RKVENC>,
+			 <&cru SRST_RKVENC_CORE>;
+		reset-names = "video_a", "video_h", "video_core";
+		assigned-clocks = <&cru ACLK_RKVENC>, <&cru CLK_RKVENC_CORE>;
+		assigned-clock-rates = <297000000>, <297000000>;
+		power-domains = <&power RK3562_PD_VEPU>;
+		iommus = <&rkvenc_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <1>;
+		rockchip,resetgroup-node = <1>;
+		status = "disabled";
+	};
+
+	rkvenc_mmu: iommu@ff36f000 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff36f000 0x0 0x40>;
+		interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rkvenc_mmu";
+		clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>;
+		clock-names = "aclk", "iface";
+		power-domains = <&power RK3562_PD_VEPU>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	mipi0_csi2: mipi0-csi2@ff380000 {
+		compatible = "rockchip,rk3562-mipi-csi2";
+		reg = <0x0 0xff380000 0x0 0x10000>;
+		reg-names = "csihost_regs";
+		interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "csi-intr1", "csi-intr2";
+		clocks = <&cru PCLK_CSIHOST0>;
+		clock-names = "pclk_csi2host";
+		resets = <&cru SRST_P_CSIHOST0>;
+		reset-names = "srst_csihost_p";
+		status = "disabled";
+	};
+
+	mipi1_csi2: mipi1-csi2@ff390000 {
+		compatible = "rockchip,rk3562-mipi-csi2";
+		reg = <0x0 0xff390000 0x0 0x10000>;
+		reg-names = "csihost_regs";
+		interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "csi-intr1", "csi-intr2";
+		clocks = <&cru PCLK_CSIHOST1>;
+		clock-names = "pclk_csi2host";
+		resets = <&cru SRST_P_CSIHOST1>;
+		reset-names = "srst_csihost_p";
+		status = "disabled";
+	};
+
+	mipi2_csi2: mipi2-csi2@ff3a0000 {
+		compatible = "rockchip,rk3562-mipi-csi2";
+		reg = <0x0 0xff3a0000 0x0 0x10000>;
+		reg-names = "csihost_regs";
+		interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "csi-intr1", "csi-intr2";
+		clocks = <&cru PCLK_CSIHOST2>;
+		clock-names = "pclk_csi2host";
+		resets = <&cru SRST_P_CSIHOST2>;
+		reset-names = "srst_csihost_p";
+		status = "disabled";
+	};
+
+	mipi3_csi2: mipi3-csi2@ff3b0000 {
+		compatible = "rockchip,rk3562-mipi-csi2";
+		reg = <0x0 0xff3b0000 0x0 0x10000>;
+		reg-names = "csihost_regs";
+		interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "csi-intr1", "csi-intr2";
+		clocks = <&cru PCLK_CSIHOST3>;
+		clock-names = "pclk_csi2host";
+		resets = <&cru SRST_P_CSIHOST3>;
+		reset-names = "srst_csihost_p";
+		status = "disabled";
+	};
+
+	csi2_dphy0_hw: csi2-dphy0-hw@ff3c0000 {
+		compatible = "rockchip,rk3562-csi2-dphy-hw";
+		reg = <0x0 0xff3c0000 0x0 0x10000>;
+		clocks = <&cru PCLK_CSIPHY0>;
+		clock-names = "pclk";
+		resets = <&cru SRST_P_CSIPHY0>;
+		reset-names = "srst_p_csiphy0";
+		rockchip,grf = <&sys_grf>;
+		status = "disabled";
+	};
+
+	csi2_dphy1_hw: csi2-dphy1-hw@ff3d0000 {
+		compatible = "rockchip,rk3562-csi2-dphy-hw";
+		reg = <0x0 0xff3d0000 0x0 0x10000>;
+		clocks = <&cru PCLK_CSIPHY1>;
+		clock-names = "pclk";
+		resets = <&cru SRST_P_CSIPHY1>;
+		reset-names = "srst_p_csiphy1";
+		rockchip,grf = <&sys_grf>;
+		status = "disabled";
+	};
+
+	rkcif: rkcif@ff3e0000 {
+		compatible = "rockchip,rk3562-cif";
+		reg = <0x0 0xff3e0000 0x0 0x800>;
+		reg-names = "cif_regs";
+		interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "cif-intr";
+		clocks = <&cru ACLK_VICAP>, <&cru HCLK_VICAP>, <&cru DCLK_VICAP>;
+		clock-names = "aclk_cif", "hclk_cif", "dclk_cif";
+		resets = <&cru SRST_A_VICAP>, <&cru SRST_H_VICAP>, <&cru SRST_D_VICAP>,
+			 <&cru SRST_I0_VICAP>, <&cru SRST_I1_VICAP>, <&cru SRST_I2_VICAP>,
+			 <&cru SRST_I3_VICAP>;
+		reset-names = "rst_cif_a", "rst_cif_h", "rst_cif_d",
+			      "rst_cif_i0", "rst_cif_i1", "rst_cif_i2",
+			      "rst_cif_i3";
+		power-domains = <&power RK3562_PD_VI>;
+		rockchip,grf = <&sys_grf>;
+		iommus = <&rkcif_mmu>;
+		status = "disabled";
+	};
+
+	rkcif_mmu: iommu@ff3e0800 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff3e0800 0x0 0x100>;
+		interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "cif_mmu";
+		clocks = <&cru ACLK_VICAP>, <&cru HCLK_VICAP>;
+		clock-names = "aclk", "iface";
+		power-domains = <&power RK3562_PD_VI>;
+		rockchip,disable-mmu-reset;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	rkisp: isp@ff3f0000 {
+		compatible = "rockchip,rk3562-rkisp";
+		reg = <0x0 0xff3f0000 0x0 0x7f00>;
+		interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "mipi_irq", "mi_irq", "isp_irq";
+		clocks = <&cru ACLK_ISP>, <&cru HCLK_ISP>, <&cru CLK_ISP>;
+		clock-names = "aclk_isp", "hclk_isp", "clk_isp_core";
+		power-domains = <&power RK3562_PD_VI>;
+		iommus = <&rkisp_mmu>;
+		status = "disabled";
+	};
+
+	rkisp_mmu: iommu@ff3f7f00 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff3f7f00 0x0 0x100>;
+		interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "isp_mmu";
+		clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>;
+		clock-names = "aclk", "iface";
+		rockchip,disable-mmu-reset;
+		#iommu-cells = <0>;
+		power-domains = <&power RK3562_PD_VI>;
+		status = "disabled";
+	};
+
+	vop: vop@ff400000 {
+		compatible = "rockchip,rk3562-vop";
+		reg = <0x0 0xff400000 0x0 0x2000>, <0x0 0xff405000 0x0 0x1000>;
+		reg-names = "regs", "gamma_lut";
+		interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_VOP>,
+			 <&cru HCLK_VOP>,
+			 <&cru DCLK_VOP>,
+			 <&cru DCLK_VOP1>;
+		clock-names = "aclk_vop",
+			      "hclk_vop",
+			      "dclk_vp0",
+			      "dclk_vp1";
+		resets = <&cru SRST_A_VOP>,
+			 <&cru SRST_H_VOP>,
+			 <&cru SRST_D_VOP>,
+			 <&cru SRST_D_VOP1>;
+		reset-names = "axi",
+			      "ahb",
+			      "dclk_vp0",
+			      "dclk_vp1";
+		iommus = <&vop_mmu>;
+		power-domains = <&power RK3562_PD_VO>;
+		rockchip,grf = <&sys_grf>;
+		status = "disabled";
+
+		vop_out: ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				reg = <0>;
+
+				vp0_out_rgb: endpoint@0 {
+					reg = <0>;
+					remote-endpoint = <&rgb_in_vp0>;
+				};
+
+				vp0_out_dsi: endpoint@1 {
+					reg = <1>;
+					remote-endpoint = <&dsi_in_vp0>;
+				};
+
+				vp0_out_lvds: endpoint@2 {
+					reg = <2>;
+					remote-endpoint = <&lvds_in_vp0>;
+				};
+			};
+
+			port@1 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				reg = <1>;
+
+				vp1_out_rgb: endpoint@0 {
+					reg = <0>;
+					remote-endpoint = <&rgb_in_vp1>;
+				};
+
+				vp1_out_dsi: endpoint@1 {
+					reg = <1>;
+					remote-endpoint = <&dsi_in_vp1>;
+				};
+
+				vp1_out_lvds: endpoint@2 {
+					reg = <2>;
+					remote-endpoint = <&lvds_in_vp1>;
+				};
+			};
+		};
+	};
+
+	vop_mmu: iommu@ff407e00 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff407e00 0x0 0x100>;
+		interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "vop_mmu";
+		clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>;
+		clock-names = "aclk", "iface";
+		#iommu-cells = <0>;
+		rockchip,disable-device-link-resume;
+		rockchip,shootdown-entire;
+		status = "disabled";
+	};
+
+	rga2: rga@ff440000 {
+		compatible = "rockchip,rga2_core0";
+		reg = <0x0 0xff440000 0x0 0x1000>;
+		interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rga2_irq";
+		clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>, <&cru CLK_RGA_CORE>;
+		clock-names = "aclk_rga2", "hclk_rga2", "clk_rga2";
+		iommus = <&rga2_mmu>;
+		power-domains = <&power RK3562_PD_RGA>;
+		status = "disabled";
+	};
+
+	rga2_mmu: iommu@ff440f00 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff440f00 0x0 0x100>;
+		interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "rga2_mmu";
+		clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>;
+		clock-names = "aclk", "iface";
+		#iommu-cells = <0>;
+		power-domains = <&power RK3562_PD_RGA>;
+		status = "disabled";
+	};
+
+	jpegd: jpegd@ff450000 {
+		compatible = "rockchip,rkv-jpeg-decoder-v1";
+		reg = <0x0 0xff450000 0x0 0x400>;
+		interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_JDEC>, <&cru HCLK_JDEC>;
+		clock-names = "aclk_vcodec", "hclk_vcodec";
+		rockchip,disable-auto-freq;
+		resets = <&cru SRST_A_JDEC>, <&cru SRST_H_JDEC>;
+		reset-names = "video_a", "video_h";
+		power-domains = <&power RK3562_PD_RGA>;
+		iommus = <&jpegd_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <2>;
+		rockchip,resetgroup-node = <2>;
+		status = "disabled";
+	};
+
+	jpegd_mmu: iommu@ff450480 {
+		compatible = "rockchip,iommu-v2";
+		reg = <0x0 0xff450480 0x0 0x40>;
+		interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "jpegd_mmu";
+		clock-names = "aclk", "iface";
+		clocks = <&cru ACLK_JDEC>, <&cru HCLK_JDEC>;
+		power-domains = <&power RK3562_PD_RGA>;
+		#iommu-cells = <0>;
+		status = "disabled";
+	};
+
+	pcie2x1: pcie@ff500000 {
+		compatible = "rockchip,rk3562-pcie", "snps,dw-pcie";
+		#address-cells = <3>;
+		#size-cells = <2>;
+		bus-range = <0x0 0xff>;
+		clocks = <&cru ACLK_PCIE20_MST>, <&cru ACLK_PCIE20_SLV>,
+			 <&cru ACLK_PCIE20_DBI>, <&cru PCLK_PCIE20>,
+			 <&cru CLK_PCIE20_AUX>;
+		clock-names = "aclk_mst", "aclk_slv",
+			      "aclk_dbi", "pclk", "aux";
+		device_type = "pci";
+		interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "msi", "pmc", "sys", "legacy", "msg", "err";
+		#interrupt-cells = <1>;
+		interrupt-map-mask = <0 0 0 7>;
+		interrupt-map = <0 0 0 1 &pcie2x1_intc 0>,
+				<0 0 0 2 &pcie2x1_intc 1>,
+				<0 0 0 3 &pcie2x1_intc 2>,
+				<0 0 0 4 &pcie2x1_intc 3>;
+		linux,pci-domain = <0>;
+		num-ib-windows = <8>;
+		num-viewport = <8>;
+		num-ob-windows = <2>;
+		max-link-speed = <2>;
+		num-lanes = <1>;
+		phys = <&combphy_pu PHY_TYPE_PCIE>;
+		phy-names = "pcie-phy";
+		ranges = <0x00000800 0x0 0xfc000000 0x0 0xfc000000 0x0 0x100000
+			  0x81000000 0x0 0xfc100000 0x0 0xfc100000 0x0 0x100000
+			  0x82000000 0x0 0xfc200000 0x0 0xfc200000 0x0 0x1e00000
+			  0xc3000000 0x3 0x00000000 0x3 0x00000000 0x0 0x40000000>;
+		reg = <0x0 0xfe000000 0x0 0x400000>,
+		      <0x0 0xff500000 0x0 0x10000>;
+		reg-names = "pcie-dbi", "pcie-apb";
+		resets = <&cru SRST_PCIE20_POWERUP>;
+		reset-names = "pipe";
+		status = "disabled";
+
+		pcie2x1_intc: legacy-interrupt-controller {
+			interrupt-controller;
+			#address-cells = <0>;
+			#interrupt-cells = <1>;
+			interrupt-parent = <&gic>;
+		};
+	};
+
+	spi1: spi@ff640000 {
+		compatible = "rockchip,rk3066-spi";
+		reg = <0x0 0xff640000 0x0 0x1000>;
+		interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru CLK_SPI1>, <&cru PCLK_SPI1>;
+		clock-names = "spiclk", "apb_pclk";
+		dmas = <&dmac 15>, <&dmac 14>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&spi1m0_csn0 &spi1m0_csn1 &spi1m0_pins>;
+		num-cs = <2>;
+		status = "disabled";
+	};
+
+	spi2: spi@ff650000 {
+		compatible = "rockchip,rk3066-spi";
+		reg = <0x0 0xff650000 0x0 0x1000>;
+		interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		clocks = <&cru CLK_SPI2>, <&cru PCLK_SPI2>;
+		clock-names = "spiclk", "apb_pclk";
+		dmas = <&dmac 17>, <&dmac 16>;
+		dma-names = "tx", "rx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&spi2m0_csn0 &spi2m0_csn1 &spi2m0_pins>;
+		num-cs = <2>;
+		status = "disabled";
+	};
+
+	uart1: serial@ff670000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff670000 0x0 0x100>;
+		interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 1>, <&dmac 10>;
+		status = "disabled";
+	};
+
+	uart2: serial@ff680000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff680000 0x0 0x100>;
+		interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 2>;
+		status = "disabled";
+	};
+
+	uart3: serial@ff690000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff690000 0x0 0x100>;
+		interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 3>;
+		status = "disabled";
+	};
+
+	uart4: serial@ff6a0000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff6a0000 0x0 0x100>;
+		interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 4>;
+		status = "disabled";
+	};
+
+	uart5: serial@ff6b0000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff6b0000 0x0 0x100>;
+		interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 5>, <&dmac 11>;
+		status = "disabled";
+	};
+
+	uart6: serial@ff6c0000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff6c0000 0x0 0x100>;
+		interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART6>, <&cru PCLK_UART6>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 6>;
+		status = "disabled";
+	};
+
+	uart7: serial@ff6d0000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff6d0000 0x0 0x100>;
+		interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART7>, <&cru PCLK_UART7>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 7>;
+		status = "disabled";
+	};
+
+	uart8: serial@ff6e0000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff6e0000 0x0 0x100>;
+		interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART8>, <&cru PCLK_UART8>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 8>;
+		status = "disabled";
+	};
+
+	uart9: serial@ff6f0000 {
+		compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart";
+		reg = <0x0 0xff6f0000 0x0 0x100>;
+		interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_UART9>, <&cru PCLK_UART9>;
+		clock-names = "baudclk", "apb_pclk";
+		reg-shift = <2>;
+		reg-io-width = <4>;
+		dmas = <&dmac 9>;
+		status = "disabled";
+	};
+
+	pwm4: pwm@ff700000 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff700000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm4m0_pins>;
+		clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm5: pwm@ff700010 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff700010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm5m0_pins>;
+		clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm6: pwm@ff700020 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff700020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm6m0_pins>;
+		clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm7: pwm@ff700030 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff700030 0x0 0x10>;
+		interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm7m0_pins>;
+		clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm8: pwm@ff710000 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff710000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm8m0_pins>;
+		clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm9: pwm@ff710010 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff710010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm9m0_pins>;
+		clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm10: pwm@ff710020 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff710020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm10m0_pins>;
+		clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm11: pwm@ff710030 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff710030 0x0 0x10>;
+		interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm11m0_pins>;
+		clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm12: pwm@ff720000 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff720000 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm12m0_pins>;
+		clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm13: pwm@ff720010 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff720010 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm13m0_pins>;
+		clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm14: pwm@ff720020 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff720020 0x0 0x10>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm14m0_pins>;
+		clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	pwm15: pwm@ff720030 {
+		compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
+		reg = <0x0 0xff720030 0x0 0x10>;
+		interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+		#pwm-cells = <3>;
+		pinctrl-names = "active";
+		pinctrl-0 = <&pwm15m0_pins>;
+		clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>;
+		clock-names = "pwm", "pclk";
+		status = "disabled";
+	};
+
+	saradc0: saradc@ff730000 {
+		compatible = "rockchip,rk3562-saradc";
+		reg = <0x0 0xff730000 0x0 0x100>;
+		interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+		#io-channel-cells = <1>;
+		clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;
+		clock-names = "saradc", "apb_pclk";
+		resets = <&cru SRST_P_SARADC>;
+		reset-names = "saradc-apb";
+		status = "disabled";
+	};
+
+	u2phy: usb2-phy@ff740000 {
+		compatible = "rockchip,rk3562-usb2phy";
+		reg = <0x0 0xff740000 0x0 0x10000>;
+		clocks = <&cru CLK_USB2PHY_REF>, <&cru PCLK_USB2PHY>;
+		clock-names = "phyclk", "pclk";
+		#clock-cells = <0>;
+		clock-output-names = "usb480m_phy";
+		rockchip,usbgrf = <&usbphy_grf>;
+		status = "disabled";
+
+		u2phy_otg: otg-port {
+			#phy-cells = <0>;
+			interrupts = <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "otg-bvalid", "otg-id", "linestate";
+			status = "disabled";
+		};
+
+		u2phy_host: host-port {
+			#phy-cells = <0>;
+			interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "linestate";
+			status = "disabled";
+		};
+	};
+
+	combphy_pu: phy@ff750000 {
+		compatible = "rockchip,rk3562-naneng-combphy";
+		reg = <0x0 0xff750000 0x0 0x100>;
+		#phy-cells = <1>;
+		clocks = <&cru CLK_PIPEPHY_REF>, <&cru PCLK_PIPEPHY>,
+			 <&cru PCLK_PHP>;
+		clock-names = "refclk", "apbclk", "pipe_clk";
+		assigned-clocks = <&cru CLK_PIPEPHY_REF>;
+		assigned-clock-rates = <100000000>;
+		resets = <&cru SRST_P_PIPEPHY>, <&cru SRST_PIPEPHY>;
+		reset-names = "combphy-apb", "combphy";
+		rockchip,pipe-grf = <&peri_grf>;
+		rockchip,pipe-phy-grf = <&pipephy_grf>;
+		status = "disabled";
+	};
+
+	sai0: sai@ff800000 {
+		compatible = "rockchip,rk3562-sai", "rockchip,sai-v1";
+		reg = <0x0 0xff800000 0x0 0x1000>;
+		interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru MCLK_SAI0>, <&cru HCLK_SAI0>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac 19>, <&dmac 18>;
+		dma-names = "tx", "rx";
+		resets = <&cru SRST_M_SAI0_8CH>, <&cru SRST_H_SAI0_8CH>;
+		reset-names = "m", "h";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s0m0_lrck
+			     &i2s0m0_sclk
+			     &i2s0m0_sdi0
+			     &i2s0m0_sdo0
+			     &i2s0m0_sdo1
+			     &i2s0m0_sdo2
+			     &i2s0m0_sdo3>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	sai1: sai@ff810000 {
+		compatible = "rockchip,rk3562-sai", "rockchip,sai-v1";
+		reg = <0x0 0xff810000 0x0 0x1000>;
+		interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru MCLK_SAI1>, <&cru HCLK_SAI1>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac 21>, <&dmac 20>;
+		dma-names = "tx", "rx";
+		resets = <&cru SRST_M_SAI1_8CH>, <&cru SRST_H_SAI1_8CH>;
+		reset-names = "m", "h";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s1m0_lrck
+			     &i2s1m0_sclk
+			     &i2s1m0_sdi0
+			     &i2s1m0_sdi1
+			     &i2s1m0_sdi2
+			     &i2s1m0_sdi3
+			     &i2s1m0_sdo0
+			     &i2s1m0_sdo1
+			     &i2s1m0_sdo2
+			     &i2s1m0_sdo3>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	sai2: sai@ff820000 {
+		compatible = "rockchip,rk3562-sai", "rockchip,sai-v1";
+		reg = <0x0 0xff820000 0x0 0x1000>;
+		interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru MCLK_SAI2>, <&cru HCLK_SAI2>;
+		clock-names = "mclk", "hclk";
+		dmas = <&dmac 23>, <&dmac 22>;
+		dma-names = "tx", "rx";
+		resets = <&cru SRST_M_SAI2_2CH>, <&cru SRST_H_SAI2_2CH>;
+		reset-names = "m", "h";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s2m0_lrck
+			     &i2s2m0_sclk
+			     &i2s2m0_sdi
+			     &i2s2m0_sdo>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	pdm: pdm@ff830000 {
+		compatible = "rockchip,rk3562-pdm", "rockchip,pdm";
+		reg = <0x0 0xff830000 0x0 0x1000>;
+		clocks = <&cru MCLK_PDM>, <&cru HCLK_PDM>;
+		clock-names = "pdm_clk", "pdm_hclk";
+		dmas = <&dmac 31>;
+		dma-names = "rx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&pdmm0_clk0
+			     &pdmm0_clk1
+			     &pdmm0_sdi0
+			     &pdmm0_sdi1
+			     &pdmm0_sdi2
+			     &pdmm0_sdi3>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	spdif_8ch: spdif@ff840000 {
+		compatible = "rockchip,rk3562-spdif", "rockchip,rk3568-spdif";
+		reg = <0x0 0xff840000 0x0 0x1000>;
+		interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
+		dmas = <&dmac 30>;
+		dma-names = "tx";
+		clock-names = "mclk", "hclk";
+		clocks = <&cru MCLK_SPDIF>, <&cru HCLK_SPDIF>;
+		#sound-dai-cells = <0>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&spdifm0_pins>;
+		status = "disabled";
+	};
+
+	acdcdig_dsm: codec-digital@ff850000 {
+		compatible = "rockchip,rk3562-codec-digital", "rockchip,codec-digital-v1";
+		reg = <0x0 0xff850000 0x0 0x1000>;
+		clocks = <&cru CLK_DSM>, <&cru HCLK_DSM>;
+		clock-names = "dac", "pclk";
+		resets = <&cru SRST_DSM>;
+		reset-names = "reset" ;
+		rockchip,grf = <&sys_grf>;
+		rockchip,pwm-output-mode;
+		pinctrl-names = "default";
+		pinctrl-0 = <&dsm_pins>;
+		#sound-dai-cells = <0>;
+		status = "disabled";
+	};
+
+	sfc: spi@ff860000 {
+		compatible = "rockchip,sfc";
+		reg = <0x0 0xff860000 0x0 0x10000>;
+		interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru SCLK_SFC>, <&cru HCLK_SFC>;
+		clock-names = "clk_sfc", "hclk_sfc";
+		assigned-clocks = <&cru SCLK_SFC>;
+		assigned-clock-rates = <100000000>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	sdhci: mmc@ff870000 {
+		compatible = "rockchip,rk3562-dwcmshc", "rockchip,rk3528-dwcmshc";
+		reg = <0x0 0xff870000 0x0 0x10000>;
+		interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+		assigned-clocks = <&cru BCLK_EMMC>, <&cru CCLK_EMMC>;
+		assigned-clock-rates = <200000000>, <200000000>;
+		clocks = <&cru CCLK_EMMC>, <&cru HCLK_EMMC>,
+			 <&cru ACLK_EMMC>, <&cru BCLK_EMMC>,
+			 <&cru TMCLK_EMMC>;
+		clock-names = "core", "bus", "axi", "block", "timer";
+		resets = <&cru SRST_C_EMMC>, <&cru SRST_H_EMMC>,
+			 <&cru SRST_A_EMMC>, <&cru SRST_B_EMMC>,
+			 <&cru SRST_T_EMMC>;
+		reset-names = "core", "bus", "axi", "block", "timer";
+		max-frequency = <200000000>;
+		status = "disabled";
+	};
+
+	sdmmc0: mmc@ff880000 {
+		compatible = "rockchip,rk3562-dw-mshc",
+			     "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xff880000 0x0 0x10000>;
+		interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+		max-frequency = <150000000>;
+		clocks = <&cru HCLK_SDMMC0>, <&cru CCLK_SDMMC0>,
+			 <&cru SCLK_SDMMC0_DRV>, <&cru SCLK_SDMMC0_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
+		resets = <&cru SRST_H_SDMMC0>;
+		reset-names = "reset";
+		fifo-depth = <0x100>;
+		status = "disabled";
+	};
+
+	sdmmc1: mmc@ff890000 {
+		compatible = "rockchip,rk3562-dw-mshc",
+			     "rockchip,rk3288-dw-mshc";
+		reg = <0x0 0xff890000 0x0 0x10000>;
+		interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
+		max-frequency = <150000000>;
+		clocks = <&cru HCLK_SDMMC1>, <&cru CCLK_SDMMC1>,
+			 <&cru SCLK_SDMMC1_DRV>, <&cru SCLK_SDMMC1_SAMPLE>;
+		clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
+		resets = <&cru SRST_H_SDMMC1>;
+		reset-names = "reset";
+		fifo-depth = <0x100>;
+		status = "disabled";
+	};
+
+	crypto: crypto@ff8a0000 {
+		compatible = "rockchip,crypto-v4";
+		reg = <0x0 0xff8a0000 0x0 0x2000>;
+		interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&scmi_clk CLK_CORE_CRYPTO>, <&scmi_clk CLK_PKA_CRYPTO>,
+			 <&scmi_clk ACLK_CRYPTO>, <&scmi_clk HCLK_CRYPTO>,
+			 <&scmi_clk PCLK_CRYPTO>;
+		clock-names = "sclk", "pka", "aclk", "pclk", "pclk";
+		assigned-clocks = <&scmi_clk CLK_CORE_CRYPTO>, <&scmi_clk CLK_PKA_CRYPTO>;
+		assigned-clock-rates = <200000000>, <300000000>;
+		resets = <&cru SRST_CORE_CRYPTO>;
+		reset-names = "crypto-rst";
+		status = "disabled";
+	};
+
+	rng: rng@ff8e0000 {
+		compatible = "rockchip,rkrng";
+		reg = <0x0 0xff8e0000 0x0 0x200>;
+		interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&scmi_clk HCLK_RK_RNG_NS>;
+		clock-names = "hclk_trng";
+		resets = <&cru SRST_H_RK_RNG_NS>;
+		reset-names = "reset";
+		status = "disabled";
+	};
+
+	otp: otp@ff930000 {
+		compatible = "rockchip,rk3562-otp";
+		reg = <0x0 0xff930000 0x0 0x4000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		clocks = <&cru CLK_USER_OTPC_NS>, <&cru CLK_SBPI_OTPC_NS>,
+			 <&cru PCLK_OTPC_NS>, <&cru CLK_OTPC_ARB>,
+			 <&cru PCLK_OTPPHY>;
+		clock-names = "usr", "sbpi", "apb", "arb", "phy";
+		resets = <&cru SRST_USER_OTPC_NS>, <&cru SRST_SBPI_OTPC_NS>,
+			 <&cru SRST_P_OTPC_NS>, <&cru SRST_OTPC_ARB>,
+			 <&cru SRST_P_OTPPHY>;
+		reset-names = "usr", "sbpi", "apb", "arb", "phy";
+
+		/* Data cells */
+		cpu_code: cpu-code@2 {
+			reg = <0x02 0x2>;
+		};
+		otp_cpu_version: cpu-version@8 {
+			reg = <0x08 0x1>;
+			bits = <3 3>;
+		};
+		otp_id: id@a {
+			reg = <0x0a 0x10>;
+		};
+		cpu_leakage: cpu-leakage@1a {
+			reg = <0x1a 0x1>;
+		};
+		log_leakage: log-leakage@1b {
+			reg = <0x1b 0x1>;
+		};
+		npu_leakage: npu-leakage@1c {
+			reg = <0x1c 0x1>;
+		};
+		gpu_leakage: gpu-leakage@1d {
+			reg = <0x1d 0x1>;
+		};
+	};
+
+	dmac: dma-controller@ff990000 {
+		compatible = "arm,pl330", "arm,primecell";
+		reg = <0x0 0xff990000 0x0 0x4000>;
+		interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_DMAC>;
+		clock-names = "apb_pclk";
+		#dma-cells = <1>;
+		arm,pl330-periph-burst;
+	};
+
+	hwlock: hwspinlock@ff9e0000 {
+		compatible = "rockchip,hwspinlock";
+		reg = <0x0 0xff9e0000 0x0 0x100>;
+		#hwlock-cells = <1>;
+		status = "disabled";
+	};
+
+	i2c1: i2c@ffa00000 {
+		compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa00000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c1m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c2: i2c@ffa10000 {
+		compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa10000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C2>, <&cru PCLK_I2C2>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c2m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c3: i2c@ffa20000 {
+		compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa20000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c3m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c4: i2c@ffa30000 {
+		compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa30000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c4m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	i2c5: i2c@ffa40000 {
+		compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c";
+		reg = <0x0 0xffa40000 0x0 0x1000>;
+		clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>;
+		clock-names = "i2c", "pclk";
+		interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2c5m0_xfer>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+	};
+
+	wdt: watchdog@ffa60000 {
+		compatible = "snps,dw-wdt";
+		reg = <0x0 0xffa60000 0x0 0x100>;
+		clocks = <&cru CLK_WDTNS>, <&cru PCLK_WDTNS>;
+		clock-names = "tclk", "pclk";
+		interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
+		status = "disabled";
+	};
+
+	tsadc: tsadc@ffa70000 {
+		compatible = "rockchip,rk3562-tsadc";
+		reg = <0x0 0xffa70000 0x0 0x400>;
+		rockchip,grf = <&sys_grf>;
+		interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>, <&cru PCLK_TSADC>;
+		clock-names = "tsadc", "tsadc_tsen", "apb_pclk";
+		assigned-clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>;
+		assigned-clock-rates = <1200000>, <12000000>;
+		resets = <&cru SRST_TSADC>, <&cru SRST_P_TSADC>, <&cru SRST_TSADCPHY>;
+		reset-names = "tsadc", "tsadc-apb", "tsadc-phy";
+		#thermal-sensor-cells = <1>;
+		rockchip,hw-tshut-temp = <120000>;
+		rockchip,hw-tshut-mode = <0>; /* tshut mode 0:CRU 1:GPIO */
+		rockchip,hw-tshut-polarity = <0>; /* tshut polarity 0:LOW 1:HIGH */
+		status = "disabled";
+	};
+
+	gmac0: ethernet@ffa80000 {
+		compatible = "rockchip,rk3562-gmac", "snps,dwmac-4.20a";
+		reg = <0x0 0xffa80000 0x0 0x10000>;
+		interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "macirq", "eth_wake_irq";
+		rockchip,grf = <&sys_grf>;
+		rockchip,php_grf = <&ioc_grf>;
+		clocks = <&cru CLK_GMAC_125M_CRU_I>, <&cru CLK_GMAC_50M_CRU_I>,
+			 <&cru PCLK_GMAC>, <&cru ACLK_GMAC>;
+		clock-names = "stmmaceth", "clk_mac_ref",
+			      "pclk_mac", "aclk_mac";
+		resets = <&cru SRST_A_GMAC>;
+		reset-names = "stmmaceth";
+
+		snps,mixed-burst;
+		snps,tso;
+
+		snps,axi-config = <&gmac0_stmmac_axi_setup>;
+		snps,mtl-rx-config = <&gmac0_mtl_rx_setup>;
+		snps,mtl-tx-config = <&gmac0_mtl_tx_setup>;
+		status = "disabled";
+
+		mdio0: mdio {
+			compatible = "snps,dwmac-mdio";
+			#address-cells = <0x1>;
+			#size-cells = <0x0>;
+		};
+
+		gmac0_stmmac_axi_setup: stmmac-axi-config {
+			snps,wr_osr_lmt = <4>;
+			snps,rd_osr_lmt = <8>;
+			snps,blen = <0 0 0 0 16 8 4>;
+		};
+
+		gmac0_mtl_rx_setup: rx-queues-config {
+			snps,rx-queues-to-use = <1>;
+			queue0 {};
+		};
+
+		gmac0_mtl_tx_setup: tx-queues-config {
+			snps,tx-queues-to-use = <1>;
+			queue0 {};
+		};
+	};
+
+	saradc1: saradc@ffaa0000 {
+		compatible = "rockchip,rk3562-saradc";
+		reg = <0x0 0xffaa0000 0x0 0x100>;
+		interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
+		#io-channel-cells = <1>;
+		clocks = <&cru CLK_SARADC_VCCIO156>, <&cru PCLK_SARADC_VCCIO156>;
+		clock-names = "saradc", "apb_pclk";
+		resets = <&cru SRST_P_SARADC_VCCIO156>;
+		reset-names = "saradc-apb";
+		status = "disabled";
+	};
+
+	mailbox: mailbox@ffae0000 {
+		compatible = "rockchip,rk3562-mailbox",
+			     "rockchip,rk3368-mailbox";
+		reg = <0x0 0xffae0000 0x0 0x200>;
+		interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru PCLK_MAILBOX>;
+		clock-names = "pclk_mailbox";
+		#mbox-cells = <1>;
+		status = "disabled";
+	};
+
+	dsi: dsi@ffb10000 {
+		compatible = "rockchip,rk3562-mipi-dsi";
+		reg = <0x0 0xffb10000 0x0 0x10000>;
+		interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru PCLK_DSITX>;
+		clock-names = "pclk";
+		resets = <&cru SRST_P_DSITX>;
+		reset-names = "apb";
+		phys = <&video_phy>;
+		phy-names = "dphy";
+		rockchip,grf = <&sys_grf>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		status = "disabled";
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			dsi_in: port@0 {
+				reg = <0>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				dsi_in_vp0: endpoint@0 {
+					reg = <0>;
+					remote-endpoint = <&vp0_out_dsi>;
+					status = "disabled";
+				};
+
+				dsi_in_vp1: endpoint@1 {
+					reg = <1>;
+					remote-endpoint = <&vp1_out_dsi>;
+					status = "disabled";
+				};
+			};
+		};
+	};
+
+	video_phy: phy@ffb20000 {
+		compatible = "rockchip,rk3562-dsi-dphy", "rockchip,rk3562-video-phy",
+			     "rockchip,rk3568-dsi-dphy", "rockchip,rk3568-video-phy";
+		reg = <0x0 0xffb20000 0x0 0x10000>,
+		      <0x0 0xffb10000 0x0 0x10000>;
+		reg-names = "phy", "host";
+		clocks = <&cru CLK_MIPIDSIPHY_REF>,
+			 <&cru PCLK_DSIPHY>, <&cru PCLK_DSITX>;
+		clock-names = "ref", "pclk", "pclk_host";
+		#clock-cells = <0>;
+		resets = <&cru SRST_P_DSIPHY>;
+		reset-names = "apb";
+		#phy-cells = <0>;
+		status = "disabled";
+	};
+
+	gmac1: ethernet@ffb30000 {
+		compatible = "rockchip,rk3562-gmac";
+		reg = <0x0 0xffb30000 0x0 0x10000>;
+		interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "macirq", "eth_wake_irq";
+		rockchip,grf = <&sys_grf>;
+		rockchip,php_grf = <&ioc_grf>;
+		clocks = <&cru CLK_GMAC_50M_CRU_I>, <&cru CLK_GMAC_50M_CRU_I>,
+			 <&cru PCLK_GMAC>, <&cru ACLK_GMAC>;
+		clock-names = "stmmaceth", "clk_mac_ref",
+			      "pclk_mac", "aclk_mac";
+		resets = <&cru SRST_A_MAC100>;
+		reset-names = "stmmaceth";
+		status = "disabled";
+
+		mdio1: mdio {
+			compatible = "snps,dwmac-mdio";
+			#address-cells = <0x1>;
+			#size-cells = <0x0>;
+		};
+	};
+
+	pinctrl: pinctrl {
+		compatible = "rockchip,rk3562-pinctrl";
+		rockchip,grf = <&ioc_grf>;
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		gpio0: gpio@ff260000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff260000 0x0 0x100>;
+			interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_PMU0_GPIO0>, <&cru DBCLK_PMU0_GPIO0>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 0 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio1: gpio@ff620000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff620000 0x0 0x100>;
+			interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_PERI_GPIO1>, <&cru DCLK_PERI_GPIO1>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 32 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio2: gpio@ff630000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xff630000 0x0 0x100>;
+			interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_PERI_GPIO2>, <&cru DCLK_PERI_GPIO2>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 64 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio3: gpio@ffac0000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xffac0000 0x0 0x100>;
+			interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO3_VCCIO156>, <&cru DCLK_BUS_GPIO3>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 96 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+
+		gpio4: gpio@ffad0000 {
+			compatible = "rockchip,gpio-bank";
+			reg = <0x0 0xffad0000 0x0 0x100>;
+			interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&cru PCLK_GPIO4_VCCIO156>, <&cru DCLK_BUS_GPIO4>;
+
+			gpio-controller;
+			#gpio-cells = <2>;
+			gpio-ranges = <&pinctrl 0 128 32>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
+		};
+	};
+};
+
+#include "rk3562-pinctrl.dtsi"
diff --git a/u-boot/arch/arm/dts/rk3568-u-boot.dtsi b/u-boot/arch/arm/dts/rk3568-u-boot.dtsi
index 3eb3937..a0678e3 100644
--- a/u-boot/arch/arm/dts/rk3568-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/rk3568-u-boot.dtsi
@@ -17,6 +17,15 @@
 		stdout-path = &uart2;
 		u-boot,spl-boot-order = &sdmmc0, &sdhci, &nandc0, &spi_nand, &spi_nor;
 	};
+
+	secure-otp@fe3a0000 {
+		compatible = "rockchip,rk3568-secure-otp";
+		reg = <0x0 0xfe3a0000 0x0 0x4000>;
+		secure_conf = <0xfdd18008>;
+		mask_addr = <0xfe880000>;
+		cru_rst_addr = <0xfdd20470>;
+		u-boot,dm-spl;
+	};
 };
 
 &psci {
@@ -25,7 +34,7 @@
 };
 
 &crypto {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 };
 
 &uart2 {
@@ -37,12 +46,12 @@
 };
 
 &grf {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 	status = "okay";
 };
 
 &pmugrf {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 	status = "okay";
 };
 
@@ -87,12 +96,12 @@
 };
 
 &cru {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 	status = "okay";
 };
 
 &pmucru {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 	status = "okay";
 };
 
@@ -132,7 +141,7 @@
 };
 
 &saradc {
-	u-boot,dm-spl;
+	u-boot,dm-pre-reloc;
 	status = "okay";
 };
 
@@ -194,7 +203,7 @@
 	};
 };
 
-&gmac0_clkin{
+&gmac0_clkin {
 	u-boot,dm-pre-reloc;
 };
 
@@ -391,15 +400,15 @@
 };
 
 &gpio2 {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 };
 
 &pcfg_pull_none_drv_level_1 {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 };
 
 &pcfg_pull_none_drv_level_2 {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-spl;
 };
 
 
@@ -416,10 +425,6 @@
 };
 
 &pcfg_pull_none {
-	u-boot,dm-pre-reloc;
-};
-
-&secure_otp {
 	u-boot,dm-spl;
 };
 
diff --git a/u-boot/arch/arm/dts/rk3568.dtsi b/u-boot/arch/arm/dts/rk3568.dtsi
index 910161c..060a31b 100644
--- a/u-boot/arch/arm/dts/rk3568.dtsi
+++ b/u-boot/arch/arm/dts/rk3568.dtsi
@@ -1892,14 +1892,6 @@
 		status = "disabled";
 	};
 
-	secure_otp: secure_otp@fe3a0000 {
-		compatible = "rockchip,rk3568-secure-otp";
-		reg = <0x0 0xfe3a0000 0x0 0x4000>;
-		secure_conf = <0xfdd18008>;
-		mask_addr = <0xfe880000>;
-		cru_rst_addr = <0xfdd20470>;
-	};
-
 	i2s0_8ch: i2s@fe400000 {
 		compatible = "rockchip,rk3568-i2s-tdm";
 		reg = <0x0 0xfe400000 0x0 0x1000>;
diff --git a/u-boot/arch/arm/dts/rk3588-u-boot.dtsi b/u-boot/arch/arm/dts/rk3588-u-boot.dtsi
index 3fe8054..d0b82f6 100644
--- a/u-boot/arch/arm/dts/rk3588-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/rk3588-u-boot.dtsi
@@ -173,7 +173,8 @@
 &sdhci {
 	bus-width = <8>;
 	u-boot,dm-spl;
-	mmc-hs200-1_8v;
+	mmc-hs400-1_8v;
+	mmc-hs400-enhanced-strobe;
 	non-removable;
 	status = "okay";
 };
diff --git a/u-boot/arch/arm/dts/rk3588.dtsi b/u-boot/arch/arm/dts/rk3588.dtsi
index 8a13e8e..fbffe36 100644
--- a/u-boot/arch/arm/dts/rk3588.dtsi
+++ b/u-boot/arch/arm/dts/rk3588.dtsi
@@ -34,6 +34,8 @@
 			resets = <&cru SRST_A_USB3OTG1>;
 			reset-names = "usb3-otg";
 			dr_mode = "host";
+			phys = <&u2phy1_otg>;
+			phy-names = "usb2-phy";
 			phy_type = "utmi_wide";
 			snps,dis_enblslpm_quirk;
 			snps,dis-u2-freeclk-exists-quirk;
@@ -69,6 +71,8 @@
 			compatible = "rockchip,rk3588-usb2phy";
 			reg = <0x4000 0x10>;
 			interrupts = <GIC_SPI 394 IRQ_TYPE_LEVEL_HIGH>;
+			resets = <&cru SRST_OTGPHY_U3_1>, <&cru SRST_P_USB2PHY_U3_1_GRF0>;
+			reset-names = "phy", "apb";
 			clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>;
 			clock-names = "phyclk";
 			#clock-cells = <0>;
diff --git a/u-boot/arch/arm/dts/rk3588s.dtsi b/u-boot/arch/arm/dts/rk3588s.dtsi
index 53ccfba..ebe8761 100644
--- a/u-boot/arch/arm/dts/rk3588s.dtsi
+++ b/u-boot/arch/arm/dts/rk3588s.dtsi
@@ -44,6 +44,11 @@
 		spi3 = &spi3;
 		spi4 = &spi4;
 		spi5 = &sfc;
+		gpio0 = &gpio0;
+		gpio1 = &gpio1;
+		gpio2 = &gpio2;
+		gpio3 = &gpio3;
+		gpio4 = &gpio4;
 	};
 
 	cpus {
@@ -253,6 +258,8 @@
 			resets = <&cru SRST_A_USB3OTG0>;
 			reset-names = "usb3-otg";
 			dr_mode = "otg";
+			phys = <&u2phy0_otg>;
+			phy-names = "usb2-phy";
 			phy_type = "utmi_wide";
 			snps,dis_enblslpm_quirk;
 			snps,dis-u1-entry-quirk;
@@ -270,6 +277,8 @@
 		interrupts = <GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST_ARB0>;
 		clock-names = "usbhost", "arbiter";
+		phys = <&u2phy2_host>;
+		phy-names = "usb2-phy";
 		power-domains = <&power RK3588_PD_USB>;
 		status = "disabled";
 	};
@@ -280,6 +289,8 @@
 		interrupts = <GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST_ARB0>;
 		clock-names = "usbhost", "arbiter";
+		phys = <&u2phy2_host>;
+		phy-names = "usb2-phy";
 		power-domains = <&power RK3588_PD_USB>;
 		status = "disabled";
 	};
@@ -290,6 +301,8 @@
 		interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&cru HCLK_HOST1>, <&cru HCLK_HOST_ARB1>;
 		clock-names = "usbhost", "arbiter";
+		phys = <&u2phy3_host>;
+		phy-names = "usb2-phy";
 		power-domains = <&power RK3588_PD_USB>;
 		status = "disabled";
 	};
@@ -300,6 +313,8 @@
 		interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&cru HCLK_HOST1>, <&cru HCLK_HOST_ARB1>;
 		clock-names = "usbhost", "arbiter";
+		phys = <&u2phy3_host>;
+		phy-names = "usb2-phy";
 		power-domains = <&power RK3588_PD_USB>;
 		status = "disabled";
 	};
@@ -406,6 +421,8 @@
 			compatible = "rockchip,rk3588-usb2phy";
 			reg = <0x0 0x10>;
 			interrupts = <GIC_SPI 393 IRQ_TYPE_LEVEL_HIGH>;
+			resets = <&cru SRST_OTGPHY_U3_0>, <&cru SRST_P_USB2PHY_U3_0_GRF0>;
+			reset-names = "phy", "apb";
 			clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>;
 			clock-names = "phyclk";
 			#clock-cells = <0>;
@@ -429,6 +446,8 @@
 			compatible = "rockchip,rk3588-usb2phy";
 			reg = <0x8000 0x10>;
 			interrupts = <GIC_SPI 391 IRQ_TYPE_LEVEL_HIGH>;
+			resets = <&cru SRST_OTGPHY_U2_0>, <&cru SRST_P_USB2PHY_U2_0_GRF0>;
+			reset-names = "phy", "apb";
 			clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>;
 			clock-names = "phyclk";
 			#clock-cells = <0>;
@@ -452,6 +471,8 @@
 			compatible = "rockchip,rk3588-usb2phy";
 			reg = <0xc000 0x10>;
 			interrupts = <GIC_SPI 392 IRQ_TYPE_LEVEL_HIGH>;
+			resets = <&cru SRST_OTGPHY_U2_1>, <&cru SRST_P_USB2PHY_U2_1_GRF0>;
+			reset-names = "phy", "apb";
 			clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>;
 			clock-names = "phyclk";
 			#clock-cells = <0>;
diff --git a/u-boot/arch/arm/dts/rv1106-evb2.dts b/u-boot/arch/arm/dts/rv1106-evb2.dts
index ffc431c..71ad07b 100644
--- a/u-boot/arch/arm/dts/rv1106-evb2.dts
+++ b/u-boot/arch/arm/dts/rv1106-evb2.dts
@@ -7,6 +7,7 @@
 
 #include "rv1106.dtsi"
 #include "rv1106-u-boot.dtsi"
+#include <dt-bindings/input/input.h>
 
 / {
 	model = "Rockchip RV1106 EVB2 Board";
@@ -15,6 +16,22 @@
 	chosen {
 		stdout-path = &uart2;
 		u-boot,spl-boot-order = &spi_nor, &emmc;
+	};
+
+	adc-keys {
+		compatible = "adc-keys";
+		io-channels = <&saradc 0>;
+		io-channel-names = "buttons";
+		keyup-threshold-microvolt = <1800000>;
+		u-boot,dm-spl;
+		status = "okay";
+
+		volumeup-key {
+			u-boot,dm-spl;
+			linux,code = <KEY_VOLUMEUP>;
+			label = "volume up";
+			press-threshold-microvolt = <17578>;
+		};
 	};
 };
 
@@ -63,6 +80,11 @@
 	status = "disabled";
 };
 
+&saradc {
+	u-boot,dm-spl;
+	status = "okay";
+};
+
 &sdmmc {
 	/delete-property/ u-boot,dm-spl;
 	status = "disabled";
diff --git a/u-boot/arch/arm/dts/rv1106-u-boot.dtsi b/u-boot/arch/arm/dts/rv1106-u-boot.dtsi
index 6196dba..b0632e9 100644
--- a/u-boot/arch/arm/dts/rv1106-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/rv1106-u-boot.dtsi
@@ -15,7 +15,7 @@
 		u-boot,spl-boot-order = &sdmmc, &spi_nor, &spi_nand, &emmc;
 	};
 
-	secure_otp: secure_otp@ff3fd8000 {
+	secure-otp@ff3fd8000 {
 		compatible = "rockchip,rv1106-secure-otp";
 		reg = <0xff3d8000 0x4000>;
 		secure_conf = <0xff07a018>;
@@ -112,8 +112,28 @@
 	u-boot,dm-spl;
 };
 
+&gpio0 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&gpio1 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&gpio2 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
 &gpio3 {
 	u-boot,dm-spl;
+	status = "okay";
+};
+
+&gpio4 {
+	u-boot,dm-pre-reloc;
 	status = "okay";
 };
 
@@ -159,3 +179,23 @@
 		spi-max-frequency = <100000000>;
 	};
 };
+
+&u2phy {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&u2phy_otg {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&usbdrd {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
+
+&usbdrd_dwc3 {
+	u-boot,dm-pre-reloc;
+	status = "okay";
+};
diff --git a/u-boot/arch/arm/dts/rv1106.dtsi b/u-boot/arch/arm/dts/rv1106.dtsi
index 1ac96f8..fed453e 100644
--- a/u-boot/arch/arm/dts/rv1106.dtsi
+++ b/u-boot/arch/arm/dts/rv1106.dtsi
@@ -492,7 +492,7 @@
 	};
 
 	saradc: saradc@ff3c0000 {
-		compatible = "rockchip,rk3588-saradc";
+		compatible = "rockchip,rv1106-saradc";
 		reg = <0xff3c0000 0x100>;
 		interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
 		#io-channel-cells = <1>;
diff --git a/u-boot/arch/arm/dts/rv1126-u-boot.dtsi b/u-boot/arch/arm/dts/rv1126-u-boot.dtsi
index 2bd1d6f..d3c98a8 100644
--- a/u-boot/arch/arm/dts/rv1126-u-boot.dtsi
+++ b/u-boot/arch/arm/dts/rv1126-u-boot.dtsi
@@ -15,10 +15,12 @@
 		u-boot,spl-boot-order = &sdmmc, &spi_nand, &spi_nor, &nandc, &emmc;
 	};
 
-	secure_otp: secure_otp@0xff5d0000 {
+	secure-otp@ff5d0000 {
 		compatible = "rockchip,rv1126-secure-otp";
 		reg = <0xff5d0000 0x4000>;
 		secure_conf = <0xfe0a0008>;
+		u-boot,dm-spl;
+		status = "okay";
 	};
 };
 
@@ -147,11 +149,6 @@
 };
 
 &hw_decompress {
-	u-boot,dm-spl;
-	status = "okay";
-};
-
-&secure_otp {
 	u-boot,dm-spl;
 	status = "okay";
 };
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h b/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h
index bc1395e..063fd6b 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h
@@ -23,6 +23,8 @@
 #define BOOT_UMS		(REBOOT_FLAG + 12)
 /* enter dfu download mode */
 #define BOOT_DFU                (REBOOT_FLAG + 13)
+/* reboot system quiescent */
+#define BOOT_QUIESCENT		(REBOOT_FLAG + 14)
 /* enter bootrom download mode */
 #define BOOT_BROM_DOWNLOAD	0xEF08A53C
 
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/clock.h b/u-boot/arch/arm/include/asm/arch-rockchip/clock.h
index cabe1d5..8487615 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/clock.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/clock.h
@@ -12,6 +12,13 @@
 #define RKCLK_PLL_MODE_NORMAL		1
 #define RKCLK_PLL_MODE_DEEP		2
 
+/*
+ * PLL flags
+ */
+#define ROCKCHIP_PLL_SYNC_RATE		BIT(0)
+/* normal mode only. now only for pll_rk3036, pll_rk3328 type */
+#define ROCKCHIP_PLL_FIXED_MODE		BIT(1)
+
 enum {
 	ROCKCHIP_SYSCON_NOC,
 	ROCKCHIP_SYSCON_GRF,
@@ -29,6 +36,7 @@
 	ROCKCHIP_SYSCON_PIPE_PHY2_GRF,
 	ROCKCHIP_SYSCON_VOP_GRF,
 	ROCKCHIP_SYSCON_VO_GRF,
+	ROCKCHIP_SYSCON_IOC,
 };
 
 /* Standard Rockchip clock numbers */
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h
new file mode 100644
index 0000000..3576b03
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h
@@ -0,0 +1,396 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
+ * Author: Joseph Chen <chenjh@rock-chips.com>
+ */
+
+#ifndef _ASM_ARCH_CRU_RK3528_H
+#define _ASM_ARCH_CRU_RK3528_H
+
+#define MHz		1000000
+#define KHz		1000
+#define OSC_HZ		(24 * MHz)
+
+#define CPU_PVTPLL_HZ	(1200 * MHz)
+#define APLL_HZ		(600 * MHz)
+#define GPLL_HZ		(1188 * MHz)
+#define CPLL_HZ		(996 * MHz)
+#define PPLL_HZ		(1000 * MHz)
+
+/* RK3528 pll id */
+enum rk3528_pll_id {
+	APLL,
+	CPLL,
+	GPLL,
+	PPLL,
+	DPLL,
+	PLL_COUNT,
+};
+
+struct rk3528_clk_info {
+	unsigned long id;
+	char *name;
+};
+
+struct rk3528_clk_priv {
+	struct rk3528_cru *cru;
+	struct rk3528_sysgrf *grf;
+	ulong ppll_hz;
+	ulong gpll_hz;
+	ulong cpll_hz;
+	ulong armclk_hz;
+	ulong armclk_enter_hz;
+	ulong armclk_init_hz;
+	bool sync_kernel;
+	bool set_armclk_rate;
+};
+
+struct rk3528_pll {
+	unsigned int con0;
+	unsigned int con1;
+	unsigned int con2;
+	unsigned int con3;
+	unsigned int con4;
+	unsigned int reserved0[3];
+};
+
+struct rk3528_cru {
+	uint32_t apll_con[5];
+	uint32_t reserved0014[3];
+	uint32_t cpll_con[5];
+	uint32_t reserved0034[11];
+	uint32_t gpll_con[5];
+	uint32_t reserved0074[51+32];
+	uint32_t reserved01c0[48];
+	uint32_t mode_con[1];
+	uint32_t reserved0284[31];
+	uint32_t clksel_con[91];
+	uint32_t reserved046c[229];
+	uint32_t gate_con[46];
+	uint32_t reserved08b8[82];
+	uint32_t softrst_con[47];
+	uint32_t reserved0abc[81];
+	uint32_t glb_cnt_th;
+	uint32_t glb_rst_st;
+	uint32_t glb_srst_fst;
+	uint32_t glb_srst_snd;
+	uint32_t glb_rst_con;
+	uint32_t reserved0c14[6];
+	uint32_t corewfi_con;
+	uint32_t reserved0c30[15604];
+
+	/* pmucru */
+	uint32_t reserved10000[192];
+	uint32_t pmuclksel_con[3];
+	uint32_t reserved1030c[317];
+	uint32_t pmugate_con[3];
+	uint32_t reserved1080c[125];
+	uint32_t pmusoftrst_con[3];
+	uint32_t reserved10a08[7550+8191];
+
+	/* pciecru */
+	uint32_t reserved20000[32];
+	uint32_t ppll_con[5];
+	uint32_t reserved20094[155];
+	uint32_t pcieclksel_con[2];
+	uint32_t reserved20308[318];
+	uint32_t pciegate_con;
+};
+check_member(rk3528_cru, pciegate_con, 0x20800);
+
+struct rk3528_grf_clk_priv {
+	struct rk3528_grf *grf;
+};
+
+struct pll_rate_table {
+	unsigned long rate;
+	unsigned int fbdiv;
+	unsigned int postdiv1;
+	unsigned int refdiv;
+	unsigned int postdiv2;
+	unsigned int dsmpd;
+	unsigned int frac;
+};
+
+#define RK3528_PMU_CRU_BASE			0x10000
+#define RK3528_PCIE_CRU_BASE			0x20000
+#define RK3528_DDRPHY_CRU_BASE			0x28000
+#define RK3528_PLL_CON(x)			((x) * 0x4)
+#define RK3528_PCIE_PLL_CON(x)			((x) * 0x4 + RK3528_PCIE_CRU_BASE)
+#define RK3528_DDRPHY_PLL_CON(x)		((x) * 0x4 + RK3528_DDRPHY_CRU_BASE)
+#define RK3528_MODE_CON				0x280
+#define RK3528_CLKSEL_CON(x)			((x) * 0x4 + 0x300)
+#define RK3528_PMU_CLKSEL_CON(x)		((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE)
+#define RK3528_PCIE_CLKSEL_CON(x)		((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE)
+#define RK3528_DDRPHY_MODE_CON			(0x280 + RK3528_DDRPHY_CRU_BASE)
+
+#define RK3528_DIV_ACLK_M_CORE_MASK		0x1f
+#define RK3528_DIV_ACLK_M_CORE_SHIFT		11
+#define RK3528_DIV_PCLK_DBG_MASK		0x1f
+#define RK3528_DIV_PCLK_DBG_SHIFT		1
+
+enum {
+	/* CRU_CLKSEL_CON00 */
+	CLK_MATRIX_50M_SRC_DIV_SHIFT             = 2,
+	CLK_MATRIX_50M_SRC_DIV_MASK              = 0x1F << CLK_MATRIX_50M_SRC_DIV_SHIFT,
+	CLK_MATRIX_100M_SRC_DIV_SHIFT            = 7,
+	CLK_MATRIX_100M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_100M_SRC_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON01 */
+	CLK_MATRIX_150M_SRC_DIV_SHIFT            = 0,
+	CLK_MATRIX_150M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_150M_SRC_DIV_SHIFT,
+	CLK_MATRIX_200M_SRC_DIV_SHIFT            = 5,
+	CLK_MATRIX_200M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_200M_SRC_DIV_SHIFT,
+	CLK_MATRIX_250M_SRC_DIV_SHIFT            = 10,
+	CLK_MATRIX_250M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_250M_SRC_DIV_SHIFT,
+	CLK_MATRIX_250M_SRC_SEL_SHIFT            = 15,
+	CLK_MATRIX_250M_SRC_SEL_MASK             = 0x1 << CLK_MATRIX_250M_SRC_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON02 */
+	CLK_MATRIX_300M_SRC_DIV_SHIFT            = 0,
+	CLK_MATRIX_300M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_300M_SRC_DIV_SHIFT,
+	CLK_MATRIX_339M_SRC_DIV_SHIFT            = 5,
+	CLK_MATRIX_339M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_339M_SRC_DIV_SHIFT,
+	CLK_MATRIX_400M_SRC_DIV_SHIFT            = 10,
+	CLK_MATRIX_400M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_400M_SRC_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON03 */
+	CLK_MATRIX_500M_SRC_DIV_SHIFT            = 6,
+	CLK_MATRIX_500M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_500M_SRC_DIV_SHIFT,
+	CLK_MATRIX_500M_SRC_SEL_SHIFT            = 11,
+	CLK_MATRIX_500M_SRC_SEL_MASK             = 0x1 << CLK_MATRIX_500M_SRC_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON04 */
+	CLK_MATRIX_600M_SRC_DIV_SHIFT            = 0,
+	CLK_MATRIX_600M_SRC_DIV_MASK             = 0x1F << CLK_MATRIX_600M_SRC_DIV_SHIFT,
+	CLK_MATRIX_250M_SRC_SEL_CLK_GPLL_MUX     = 0U,
+	CLK_MATRIX_250M_SRC_SEL_CLK_CPLL_MUX     = 1U,
+	CLK_MATRIX_500M_SRC_SEL_CLK_GPLL_MUX     = 0U,
+	CLK_MATRIX_500M_SRC_SEL_CLK_CPLL_MUX     = 1U,
+
+	/* PMUCRU_CLKSEL_CON00 */ 
+	CLK_I2C2_SEL_SHIFT                       = 0,
+	CLK_I2C2_SEL_MASK                        = 0x3 << CLK_I2C2_SEL_SHIFT,
+
+	/* PCIE_CRU_CLKSEL_CON01 */
+	PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT        = 7,
+	PCIE_CLK_MATRIX_50M_SRC_DIV_MASK         = 0x1f << PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT,
+	PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT       = 11,
+	PCIE_CLK_MATRIX_100M_SRC_DIV_MASK        = 0x1f << PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON32 */
+	DCLK_VOP_SRC0_SEL_SHIFT                  = 10,
+	DCLK_VOP_SRC0_SEL_MASK                   = 0x1 << DCLK_VOP_SRC0_SEL_SHIFT,
+	DCLK_VOP_SRC0_DIV_SHIFT                  = 2,
+	DCLK_VOP_SRC0_DIV_MASK                   = 0xFF << DCLK_VOP_SRC0_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON33 */
+	DCLK_VOP_SRC1_SEL_SHIFT                  = 8,
+	DCLK_VOP_SRC1_SEL_MASK                   = 0x1 << DCLK_VOP_SRC1_SEL_SHIFT,
+	DCLK_VOP_SRC1_DIV_SHIFT                  = 0,
+	DCLK_VOP_SRC1_DIV_MASK                   = 0xFF << DCLK_VOP_SRC1_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON43 */
+	CLK_CORE_CRYPTO_SEL_SHIFT                = 14,
+	CLK_CORE_CRYPTO_SEL_MASK                 = 0x3 << CLK_CORE_CRYPTO_SEL_SHIFT,
+	ACLK_BUS_VOPGL_ROOT_DIV_SHIFT            = 0U,
+	ACLK_BUS_VOPGL_ROOT_DIV_MASK             = 0x7U << ACLK_BUS_VOPGL_ROOT_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON44 */
+	CLK_PWM0_SEL_SHIFT                       = 6,
+	CLK_PWM0_SEL_MASK                        = 0x3 << CLK_PWM0_SEL_SHIFT,
+	CLK_PWM1_SEL_SHIFT                       = 8,
+	CLK_PWM1_SEL_MASK                        = 0x3 << CLK_PWM1_SEL_SHIFT,
+	CLK_PWM0_SEL_CLK_MATRIX_100M_SRC         = 0U,
+	CLK_PWM0_SEL_CLK_MATRIX_50M_SRC          = 1U,
+	CLK_PWM0_SEL_XIN_OSC0_FUNC               = 2U,
+	CLK_PWM1_SEL_CLK_MATRIX_100M_SRC         = 0U,
+	CLK_PWM1_SEL_CLK_MATRIX_50M_SRC          = 1U,
+	CLK_PWM1_SEL_XIN_OSC0_FUNC               = 2U,
+	CLK_PKA_CRYPTO_SEL_SHIFT                 = 0,
+	CLK_PKA_CRYPTO_SEL_MASK                  = 0x3 << CLK_PKA_CRYPTO_SEL_SHIFT,
+	CLK_CORE_CRYPTO_SEL_CLK_MATRIX_300M_SRC  = 0U,
+	CLK_CORE_CRYPTO_SEL_CLK_MATRIX_200M_SRC  = 1U,
+	CLK_CORE_CRYPTO_SEL_CLK_MATRIX_100M_SRC  = 2U,
+	CLK_CORE_CRYPTO_SEL_XIN_OSC0_FUNC        = 3U,
+	CLK_PKA_CRYPTO_SEL_CLK_MATRIX_300M_SRC   = 0U,
+	CLK_PKA_CRYPTO_SEL_CLK_MATRIX_200M_SRC   = 1U,
+	CLK_PKA_CRYPTO_SEL_CLK_MATRIX_100M_SRC   = 2U,
+	CLK_PKA_CRYPTO_SEL_XIN_OSC0_FUNC         = 3U,
+
+	/* CRU_CLKSEL_CON60 */
+	CLK_MATRIX_25M_SRC_DIV_SHIFT             = 2,
+	CLK_MATRIX_25M_SRC_DIV_MASK              = 0xff << CLK_MATRIX_25M_SRC_DIV_SHIFT,
+	CLK_MATRIX_125M_SRC_DIV_SHIFT            = 10,
+	CLK_MATRIX_125M_SRC_DIV_MASK             = 0x1f << CLK_MATRIX_125M_SRC_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON61 */
+	SCLK_SFC_DIV_SHIFT                       = 6,
+	SCLK_SFC_DIV_MASK                        = 0x3F << SCLK_SFC_DIV_SHIFT,
+	SCLK_SFC_SEL_SHIFT                       = 12,
+	SCLK_SFC_SEL_MASK                        = 0x3 << SCLK_SFC_SEL_SHIFT,
+	SCLK_SFC_SEL_CLK_GPLL_MUX                = 0U,
+	SCLK_SFC_SEL_CLK_CPLL_MUX                = 1U,
+	SCLK_SFC_SEL_XIN_OSC0_FUNC               = 2U,
+
+	/* CRU_CLKSEL_CON62 */
+	CCLK_SRC_EMMC_DIV_SHIFT                  = 0,
+	CCLK_SRC_EMMC_DIV_MASK                   = 0x3F << CCLK_SRC_EMMC_DIV_SHIFT,
+	CCLK_SRC_EMMC_SEL_SHIFT                  = 6,
+	CCLK_SRC_EMMC_SEL_MASK                   = 0x3 << CCLK_SRC_EMMC_SEL_SHIFT,
+	BCLK_EMMC_SEL_SHIFT                      = 8,
+	BCLK_EMMC_SEL_MASK                       = 0x3 << BCLK_EMMC_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON63 */
+	CLK_I2C3_SEL_SHIFT                       = 12,
+	CLK_I2C3_SEL_MASK                        = 0x3 << CLK_I2C3_SEL_SHIFT,
+	CLK_I2C5_SEL_SHIFT                       = 14,
+	CLK_I2C5_SEL_MASK                        = 0x3 << CLK_I2C5_SEL_SHIFT,
+	CLK_SPI1_SEL_SHIFT                       = 10,
+	CLK_SPI1_SEL_MASK                        = 0x3 << CLK_SPI1_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON64 */
+	CLK_I2C6_SEL_SHIFT                       = 0,
+	CLK_I2C6_SEL_MASK                        = 0x3 << CLK_I2C6_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON74 */
+	CLK_SARADC_DIV_SHIFT                     = 0,
+	CLK_SARADC_DIV_MASK                      = 0x7 << CLK_SARADC_DIV_SHIFT,
+	CLK_TSADC_DIV_SHIFT                      = 3,
+	CLK_TSADC_DIV_MASK                       = 0x1F << CLK_TSADC_DIV_SHIFT,
+	CLK_TSADC_TSEN_DIV_SHIFT                 = 8,
+	CLK_TSADC_TSEN_DIV_MASK                  = 0x1F << CLK_TSADC_TSEN_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON79 */
+	CLK_I2C1_SEL_SHIFT                       = 9,
+	CLK_I2C1_SEL_MASK                        = 0x3 << CLK_I2C1_SEL_SHIFT,
+	CLK_I2C0_SEL_SHIFT                       = 11,
+	CLK_I2C0_SEL_MASK                        = 0x3 << CLK_I2C0_SEL_SHIFT,
+	CLK_SPI0_SEL_SHIFT                       = 13,
+	CLK_SPI0_SEL_MASK                        = 0x3 << CLK_SPI0_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON83 */
+	ACLK_VOP_ROOT_DIV_SHIFT                  = 12,
+	ACLK_VOP_ROOT_DIV_MASK                   = 0x7 << ACLK_VOP_ROOT_DIV_SHIFT,
+	ACLK_VOP_ROOT_SEL_SHIFT                  = 15,
+	ACLK_VOP_ROOT_SEL_MASK                   = 0x1 << ACLK_VOP_ROOT_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON84 */
+	DCLK_VOP0_SEL_SHIFT                      = 0,
+	DCLK_VOP0_SEL_MASK                       = 0x1 << DCLK_VOP0_SEL_SHIFT,
+	DCLK_VOP_SRC_SEL_CLK_GPLL_MUX            = 0U,
+	DCLK_VOP_SRC_SEL_CLK_CPLL_MUX            = 1U,
+	ACLK_VOP_ROOT_SEL_CLK_GPLL_MUX           = 0U,
+	ACLK_VOP_ROOT_SEL_CLK_CPLL_MUX           = 1U,
+	DCLK_VOP0_SEL_DCLK_VOP_SRC0              = 0U,
+	DCLK_VOP0_SEL_CLK_HDMIPHY_PIXEL_IO       = 1U,
+
+	/* CRU_CLKSEL_CON85 */
+	CLK_I2C4_SEL_SHIFT                       = 13,
+	CLK_I2C4_SEL_MASK                        = 0x3 << CLK_I2C4_SEL_SHIFT,
+	CLK_I2C7_SEL_SHIFT                       = 0,
+	CLK_I2C7_SEL_MASK                        = 0x3 << CLK_I2C7_SEL_SHIFT,
+	CLK_I2C3_SEL_CLK_MATRIX_200M_SRC         = 0U,
+	CLK_I2C3_SEL_CLK_MATRIX_100M_SRC         = 1U,
+	CLK_I2C3_SEL_CLK_MATRIX_50M_SRC          = 2U,
+	CLK_I2C3_SEL_XIN_OSC0_FUNC               = 3U,
+	CLK_SPI1_SEL_CLK_MATRIX_200M_SRC         = 0U,
+	CLK_SPI1_SEL_CLK_MATRIX_100M_SRC         = 1U,
+	CLK_SPI1_SEL_CLK_MATRIX_50M_SRC          = 2U,
+	CLK_SPI1_SEL_XIN_OSC0_FUNC               = 3U,
+	CCLK_SRC_SDMMC0_DIV_SHIFT                = 0,
+	CCLK_SRC_SDMMC0_DIV_MASK                 = 0x3F << CCLK_SRC_SDMMC0_DIV_SHIFT,
+	CCLK_SRC_SDMMC0_SEL_SHIFT                = 6,
+	CCLK_SRC_SDMMC0_SEL_MASK                 = 0x3 << CCLK_SRC_SDMMC0_SEL_SHIFT,
+	CCLK_SRC_EMMC_SEL_CLK_GPLL_MUX           = 0U,
+	CCLK_SRC_EMMC_SEL_CLK_CPLL_MUX           = 1U,
+	CCLK_SRC_EMMC_SEL_XIN_OSC0_FUNC          = 2U,
+	BCLK_EMMC_SEL_CLK_MATRIX_200M_SRC        = 0U,
+	BCLK_EMMC_SEL_CLK_MATRIX_100M_SRC        = 1U,
+	BCLK_EMMC_SEL_CLK_MATRIX_50M_SRC         = 2U,
+	BCLK_EMMC_SEL_XIN_OSC0_FUNC              = 3U,
+	CCLK_SRC_SDMMC0_SEL_CLK_GPLL_MUX         = 0U,
+	CCLK_SRC_SDMMC0_SEL_CLK_CPLL_MUX         = 1U,
+	CCLK_SRC_SDMMC0_SEL_XIN_OSC0_FUNC        = 2U,
+
+	/* CRU_CLKSEL_CON04 */
+	CLK_UART0_SRC_DIV_SHIFT                  = 5,
+	CLK_UART0_SRC_DIV_MASK                   = 0x1F << CLK_UART0_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON05 */
+	CLK_UART0_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART0_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART0_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON06 */
+	SCLK_UART0_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART0_SRC_SEL_MASK                  = 0x3 << SCLK_UART0_SRC_SEL_SHIFT,
+	CLK_UART1_SRC_DIV_SHIFT                  = 2,
+	CLK_UART1_SRC_DIV_MASK                   = 0x1F << CLK_UART1_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON07 */
+	CLK_UART1_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART1_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART1_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON08 */
+	SCLK_UART1_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART1_SRC_SEL_MASK                  = 0x3 << SCLK_UART1_SRC_SEL_SHIFT,
+	CLK_UART2_SRC_DIV_SHIFT                  = 2,
+	CLK_UART2_SRC_DIV_MASK                   = 0x1F << CLK_UART2_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON09 */
+	CLK_UART2_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART2_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART2_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON10 */
+	SCLK_UART2_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART2_SRC_SEL_MASK                  = 0x3 << SCLK_UART2_SRC_SEL_SHIFT,
+	CLK_UART3_SRC_DIV_SHIFT                  = 2,
+	CLK_UART3_SRC_DIV_MASK                   = 0x1F << CLK_UART3_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON11 */
+	CLK_UART3_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART3_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART3_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON12 */
+	SCLK_UART3_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART3_SRC_SEL_MASK                  = 0x3 << SCLK_UART3_SRC_SEL_SHIFT,
+	CLK_UART4_SRC_DIV_SHIFT                  = 2,
+	CLK_UART4_SRC_DIV_MASK                   = 0x1F << CLK_UART4_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON13 */
+	CLK_UART4_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART4_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART4_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON14 */
+	SCLK_UART4_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART4_SRC_SEL_MASK                  = 0x3 << SCLK_UART4_SRC_SEL_SHIFT,
+	CLK_UART5_SRC_DIV_SHIFT                  = 2,
+	CLK_UART5_SRC_DIV_MASK                   = 0x1F << CLK_UART5_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON15 */
+	CLK_UART5_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART5_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART5_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON16 */
+	SCLK_UART5_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART5_SRC_SEL_MASK                  = 0x3 << SCLK_UART5_SRC_SEL_SHIFT,
+	CLK_UART6_SRC_DIV_SHIFT                  = 2,
+	CLK_UART6_SRC_DIV_MASK                   = 0x1F << CLK_UART6_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON17 */
+	CLK_UART6_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART6_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART6_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON18 */
+	SCLK_UART6_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART6_SRC_SEL_MASK                  = 0x3 << SCLK_UART6_SRC_SEL_SHIFT,
+	CLK_UART7_SRC_DIV_SHIFT                  = 2,
+	CLK_UART7_SRC_DIV_MASK                   = 0x1F << CLK_UART7_SRC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON19 */
+	CLK_UART7_FRAC_DIV_SHIFT                 = 0,
+	CLK_UART7_FRAC_DIV_MASK                  = 0xFFFFFFFF << CLK_UART7_FRAC_DIV_SHIFT,
+	/* CRU_CLKSEL_CON20 */
+	SCLK_UART7_SRC_SEL_SHIFT                 = 0,
+	SCLK_UART7_SRC_SEL_MASK                  = 0x3 << SCLK_UART7_SRC_SEL_SHIFT,
+	SCLK_UART0_SRC_SEL_CLK_UART0_SRC         = 0U,
+	SCLK_UART0_SRC_SEL_CLK_UART0_FRAC        = 1U,
+	SCLK_UART0_SRC_SEL_XIN_OSC0_FUNC         = 2U,
+
+	/* CRU_CLKSEL_CON60 */
+	CLK_GMAC1_VPU_25M_DIV_SHIFT              = 2,
+	CLK_GMAC1_VPU_25M_DIV_MASK               = 0xFF << CLK_GMAC1_VPU_25M_DIV_SHIFT,
+	/* CRU_CLKSEL_CON66 */
+	CLK_GMAC1_SRC_VPU_DIV_SHIFT              = 0,
+	CLK_GMAC1_SRC_VPU_DIV_MASK               = 0x3F << CLK_GMAC1_SRC_VPU_DIV_SHIFT,
+	/* CRU_CLKSEL_CON84 */
+	CLK_GMAC0_SRC_DIV_SHIFT                  = 3,
+	CLK_GMAC0_SRC_DIV_MASK                   = 0x3F << CLK_GMAC0_SRC_DIV_SHIFT,
+};
+
+#endif
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h
new file mode 100644
index 0000000..db67e14
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h
@@ -0,0 +1,416 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
+ * Author:
+ * 	Elaine Zhang <zhangqing@rock-chips.com>
+ *	Finley Xiao <finley.xiao@rock-chips.com>
+ */
+
+#ifndef _ASM_ARCH_CRU_RK3562_H
+#define _ASM_ARCH_CRU_RK3562_H
+
+#define MHz		1000000
+#define KHz		1000
+#define OSC_HZ		(24 * MHz)
+
+#define CPU_PVTPLL_HZ	(1008 * MHz)
+#define APLL_HZ		(600 * MHz)
+#define GPLL_HZ		(1188 * MHz)
+#define CPLL_HZ		(1000 * MHz)
+#define HPLL_HZ		(1000 * MHz)
+
+/* RK3562 pll id */
+enum rk3562_pll_id {
+	APLL,
+	GPLL,
+	VPLL,
+	HPLL,
+	CPLL,
+	DPLL,
+	PLL_COUNT,
+};
+
+struct rk3562_clk_info {
+	unsigned long id;
+	char *name;
+};
+
+struct rk3562_clk_priv {
+	struct rk3562_cru *cru;
+	ulong gpll_hz;
+	ulong vpll_hz;
+	ulong hpll_hz;
+	ulong cpll_hz;
+	ulong armclk_hz;
+	ulong armclk_enter_hz;
+	ulong armclk_init_hz;
+	bool sync_kernel;
+	bool set_armclk_rate;
+};
+
+struct rk3562_cru {
+	/* top cru */
+	uint32_t apll_con[5];
+	uint32_t reserved0014[19];
+	uint32_t gpll_con[5];
+	uint32_t reserved0074[3];
+	uint32_t vpll_con[5];
+	uint32_t reserved0094[3];
+	uint32_t hpll_con[5];
+	uint32_t reserved00b4[19];
+	uint32_t clksel_con[48];
+	uint32_t reserved01c0[80];
+	uint32_t gate_con[28];
+	uint32_t reserved370[36];
+	uint32_t softrst_con[28];
+	uint32_t reserved0470[100];
+	uint32_t mode_con[1];
+	uint32_t reserved0604[3];
+	uint32_t glb_cnt_th;
+	uint32_t glb_srst_fst;
+	uint32_t glb_srst_snd;
+	uint32_t glb_rst_con;
+	uint32_t glb_rst_st;
+	unsigned int sdmmc0_con[2];
+	unsigned int sdmmc1_con[2];
+	uint32_t reserved0634[2];
+	unsigned int emmc_con[1];
+	uint32_t reserved0640[15984];
+
+	/* pmu0 cru */
+	uint32_t reserved10000[64];
+	uint32_t pmu0clksel_con[4];
+	uint32_t reserved10110[28];
+	uint32_t pmu0gate_con[3];
+	uint32_t reserved1018c[29];
+	uint32_t pmu0softrst_con[3];
+	uint32_t reserved1020c[8061];
+
+	/* pmu1 cru */
+	uint32_t reserved18000[16];
+	uint32_t cpll_con[5];
+	uint32_t reserved18054[43];
+	uint32_t pmu1clksel_con[7];
+	uint32_t reserved1811c[25];
+	uint32_t pmu1gate_con[4];
+	uint32_t reserved18190[28];
+	uint32_t pmu1softrst_con[3];
+	uint32_t reserved1820c[93];
+	uint32_t pmu1mode_con[1];
+	uint32_t reserved18384[7967];
+
+	/* ddr cru */
+	uint32_t reserved20000[64];
+	uint32_t ddrclksel_con[2];
+	uint32_t reserved20108[30];
+	uint32_t ddrgate_con[2];
+	uint32_t reserved20188[30];
+	uint32_t ddrsoftrst_con[2];
+	uint32_t reserved20208[8062];
+
+	/* subddr cru */
+	uint32_t reserved28000[8];
+	uint32_t dpll_con[5];
+	uint32_t reserved28034[51];
+	uint32_t sudbddrclksel_con[1];
+	uint32_t reserved28104[31];
+	uint32_t subddrgate_con[1];
+	uint32_t reserved28184[31];
+	uint32_t sudbddrsoftrst_con[1];
+	uint32_t reserved28204[95];
+	uint32_t subddrmode_con[1];
+	uint32_t reserved28384[7967];
+
+	/* peri cru */
+	uint32_t reserved30000[64];
+	uint32_t periclksel_con[48];
+	uint32_t reserved301c0[80];
+	uint32_t perigate_con[18];
+	uint32_t reserved30348[46];
+	uint32_t perisoftrst_con[18];
+	uint32_t reserved30448[143];
+};
+check_member(rk3562_cru, reserved0640[0], 0x00640);
+check_member(rk3562_cru, reserved1020c[0], 0x1020c);
+check_member(rk3562_cru, reserved18384[0], 0x18384);
+check_member(rk3562_cru, reserved20208[0], 0x20208);
+check_member(rk3562_cru, reserved28384[0], 0x28384);
+check_member(rk3562_cru, reserved30448[0], 0x30448);
+
+struct pll_rate_table {
+	unsigned long rate;
+	unsigned int fbdiv;
+	unsigned int postdiv1;
+	unsigned int refdiv;
+	unsigned int postdiv2;
+	unsigned int dsmpd;
+	unsigned int frac;
+};
+
+#define RK3562_PMU0_CRU_BASE		0x10000
+#define RK3562_PMU1_CRU_BASE		0x18000
+#define RK3562_DDR_CRU_BASE		0x20000
+#define RK3562_SUBDDR_CRU_BASE		0x28000
+#define RK3562_PERI_CRU_BASE		0x30000
+
+#define RK3562_PLL_CON(x)		((x) * 0x4)
+#define RK3562_PMU1_PLL_CON(x)		((x) * 0x4 + RK3562_PMU1_CRU_BASE + 0x40)
+#define RK3562_SUBDDR_PLL_CON(x)	((x) * 0x4 + RK3562_SUBDDR_CRU_BASE + 0x20)
+#define RK3562_MODE_CON			0x600
+#define RK3562_PMU1_MODE_CON		(RK3562_PMU1_CRU_BASE + 0x380)
+#define RK3562_SUBDDR_MODE_CON		(RK3562_SUBDDR_CRU_BASE + 0x380)
+#define RK3562_GLB_SRST_FST		0x614
+#define RK3562_GLB_SRST_SND		0x618
+#define RK3562_GLB_RST_CON		0x61c
+#define RK3562_GLB_RST_ST		0x620
+
+enum {
+	/* CRU_CLKSEL_CON10 */
+	CLK_CORE_PRE_DIV_SHIFT		= 0,
+	CLK_CORE_PRE_DIV_MASK		= 0x1f << CLK_CORE_PRE_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON11 */
+	ACLK_CORE_PRE_DIV_SHIFT		= 0,
+	ACLK_CORE_PRE_DIV_MASK		= 0x7 << ACLK_CORE_PRE_DIV_SHIFT,
+	CLK_SCANHS_ACLKM_CORE_DIV_SHIFT	= 8,
+	CLK_SCANHS_ACLKM_CORE_DIV_MASK	= 0x7 << CLK_SCANHS_ACLKM_CORE_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON12 */
+	PCLK_DBG_PRE_DIV_SHIFT		= 0,
+	PCLK_DBG_PRE_DIV_MASK		= 0xf << PCLK_DBG_PRE_DIV_SHIFT,
+	CLK_SCANHS_PCLK_DBG_DIV_SHIFT	= 8,
+	CLK_SCANHS_PCLK_DBG_DIV_MASK	= 0xf << CLK_SCANHS_PCLK_DBG_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON28 */
+	ACLK_VOP_DIV_SHIFT		= 0,
+	ACLK_VOP_DIV_MASK		= 0x1f << ACLK_VOP_DIV_SHIFT,
+	ACLK_VOP_SEL_SHIFT		= 6,
+	ACLK_VOP_SEL_MASK		= 0x3 << ACLK_VOP_SEL_SHIFT,
+	ACLK_VOP_SEL_GPLL		= 0,
+	ACLK_VOP_SEL_CPLL,
+	ACLK_VOP_SEL_VPLL,
+	ACLK_VOP_SEL_HPLL,
+
+	/* CRU_CLKSEL_CON30 */
+	DCLK_VOP_DIV_SHIFT		= 0,
+	DCLK_VOP_DIV_MASK		= 0xff << DCLK_VOP_DIV_SHIFT,
+	DCLK_VOP_SEL_SHIFT		= 14,
+	DCLK_VOP_SEL_MASK		= 0x3 << DCLK_VOP_SEL_SHIFT,
+	DCLK_VOP_SEL_GPLL		= 0,
+	DCLK_VOP_SEL_HPLL,
+	DCLK_VOP_SEL_VPLL,
+	DCLK_VOP_SEL_APLL,
+
+	/* CRU_CLKSEL_CON31 */
+	DCLK_VOP1_DIV_SHIFT		= 0,
+	DCLK_VOP1_DIV_MASK		= 0xff << DCLK_VOP1_DIV_SHIFT,
+	DCLK_VOP1_SEL_SHIFT		= 14,
+	DCLK_VOP1_SEL_MASK		= 0x3 << DCLK_VOP1_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON40 */
+	ACLK_BUS_DIV_SHIFT		= 0,
+	ACLK_BUS_DIV_MASK		= 0x1f << ACLK_BUS_DIV_SHIFT,
+	ACLK_BUS_SEL_SHIFT		= 7,
+	ACLK_BUS_SEL_MASK		= 0x1 << ACLK_BUS_SEL_SHIFT,
+	ACLK_BUS_SEL_GPLL		= 0,
+	ACLK_BUS_SEL_CPLL,
+	HCLK_BUS_DIV_SHIFT		= 8,
+	HCLK_BUS_DIV_MASK		= 0x3f << HCLK_BUS_DIV_SHIFT,
+	HCLK_BUS_SEL_SHIFT		= 15,
+	HCLK_BUS_SEL_MASK		= 0x1 << HCLK_BUS_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON41 */
+	PCLK_BUS_DIV_SHIFT		= 0,
+	PCLK_BUS_DIV_MASK		= 0x1f << PCLK_BUS_DIV_SHIFT,
+	PCLK_BUS_SEL_SHIFT		= 7,
+	PCLK_BUS_SEL_MASK		= 0x1 << PCLK_BUS_SEL_SHIFT,
+	CLK_I2C_SEL_SHIFT		= 8,
+	CLK_I2C_SEL_MASK		= 0x3 << CLK_I2C_SEL_SHIFT,
+	CLK_I2C_SEL_200M		= 0,
+	CLK_I2C_SEL_100M,
+	CLK_I2C_SEL_50M,
+	CLK_I2C_SEL_24M,
+	DCLK_BUS_GPIO_SEL_SHIFT		= 15,
+	DCLK_BUS_GPIO_SEL_MASK		= 0x1 << DCLK_BUS_GPIO_SEL_SHIFT,
+
+	/* CRU_CLKSEL_CON43 */
+	CLK_TSADC_DIV_SHIFT		= 0,
+	CLK_TSADC_DIV_MASK		= 0x7ff << CLK_TSADC_DIV_SHIFT,
+	CLK_TSADC_TSEN_DIV_SHIFT	= 11,
+	CLK_TSADC_TSEN_DIV_MASK		= 0x1f << CLK_TSADC_TSEN_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON44 */
+	CLK_SARADC_VCCIO156_DIV_SHIFT	= 0,
+	CLK_SARADC_VCCIO156_DIV_MASK 	= 0xfff << CLK_SARADC_VCCIO156_DIV_SHIFT,
+
+	/* CRU_CLKSEL_CON45 */
+	CLK_GMAC_125M_SEL_SHIFT		= 8,
+	CLK_GMAC_125M_SEL_MASK		= 0x1 << CLK_GMAC_125M_SEL_SHIFT,
+	CLK_GMAC_125M			= 0,
+	CLK_GMAC_24M,
+	CLK_GMAC_50M_SEL_SHIFT		= 7,
+	CLK_GMAC_50M_SEL_MASK		= 0x1 << CLK_GMAC_50M_SEL_SHIFT,
+	CLK_GMAC_50M			= 0,
+
+	/* CRU_CLKSEL_CON46 */
+	CLK_GMAC_ETH_OUT2IO_SEL_SHIFT	= 7,
+	CLK_GMAC_ETH_OUT2IO_SEL_MASK	= 0x1 << CLK_GMAC_ETH_OUT2IO_SEL_SHIFT,
+	CLK_GMAC_ETH_OUT2IO_GPLL	= 0,
+	CLK_GMAC_ETH_OUT2IO_CPLL,
+	CLK_GMAC_ETH_OUT2IO_DIV_SHIFT	= 0,
+	CLK_GMAC_ETH_OUT2IO_DIV_MASK	= 0x7f,
+
+	/* PMU0CRU_CLKSEL_CON03 */
+	CLK_PMU0_I2C0_DIV_SHIFT		= 8,
+	CLK_PMU0_I2C0_DIV_MASK		= 0x1f << CLK_PMU0_I2C0_DIV_SHIFT,
+	CLK_PMU0_I2C0_SEL_SHIFT		= 14,
+	CLK_PMU0_I2C0_SEL_MASK		= 0x3 << CLK_PMU0_I2C0_SEL_SHIFT,
+	CLK_PMU0_I2C0_SEL_200M		= 0,
+	CLK_PMU0_I2C0_SEL_24M,
+	CLK_PMU0_I2C0_SEL_32K,
+
+	/* PMU1CRU_CLKSEL_CON02 */
+	CLK_PMU1_UART0_SRC_DIV_SHIFT	= 0,
+	CLK_PMU1_UART0_SRC_DIV_MASK	= 0xf << CLK_PMU1_UART0_SRC_DIV_SHIFT,
+	CLK_PMU1_UART0_SEL_SHIFT	= 6,
+	CLK_PMU1_UART0_SEL_MASK		= 0x3 << CLK_PMU1_UART0_SEL_SHIFT,
+
+	/* PMU1CRU_CLKSEL_CON04 */
+	CLK_PMU1_SPI0_DIV_SHIFT		= 0,
+	CLK_PMU1_SPI0_DIV_MASK		= 0x3 << CLK_PMU1_SPI0_DIV_SHIFT,
+	CLK_PMU1_SPI0_SEL_SHIFT		= 6,
+	CLK_PMU1_SPI0_SEL_MASK		= 0x3 << CLK_PMU1_SPI0_SEL_SHIFT,
+	CLK_PMU1_SPI0_SEL_200M		= 0,
+	CLK_PMU1_SPI0_SEL_24M,
+	CLK_PMU1_SPI0_SEL_32K,
+	CLK_PMU1_PWM0_DIV_SHIFT		= 8,
+	CLK_PMU1_PWM0_DIV_MASK		= 0x3 << CLK_PMU1_PWM0_DIV_SHIFT,
+	CLK_PMU1_PWM0_SEL_SHIFT		= 14,
+	CLK_PMU1_PWM0_SEL_MASK		= 0x3 << CLK_PMU1_PWM0_SEL_SHIFT,
+	CLK_PMU1_PWM0_SEL_200M		= 0,
+	CLK_PMU1_PWM0_SEL_24M,
+	CLK_PMU1_PWM0_SEL_32K,
+
+	/* PERICRU_CLKSEL_CON00 */
+	ACLK_PERI_DIV_SHIFT		= 0,
+	ACLK_PERI_DIV_MASK		= 0x1f << ACLK_PERI_DIV_SHIFT,
+	ACLK_PERI_SEL_SHIFT		= 7,
+	ACLK_PERI_SEL_MASK		= 0x1 << ACLK_PERI_SEL_SHIFT,
+	ACLK_PERI_SEL_GPLL		= 0,
+	ACLK_PERI_SEL_CPLL,
+	HCLK_PERI_DIV_SHIFT		= 8,
+	HCLK_PERI_DIV_MASK		= 0x3f << HCLK_PERI_DIV_SHIFT,
+	HCLK_PERI_SEL_SHIFT		= 15,
+	HCLK_PERI_SEL_MASK		= 0x1 << HCLK_PERI_SEL_SHIFT,
+
+	/* PERICRU_CLKSEL_CON01 */
+	PCLK_PERI_DIV_SHIFT		= 0,
+	PCLK_PERI_DIV_MASK		= 0x1f << PCLK_PERI_DIV_SHIFT,
+	PCLK_PERI_SEL_SHIFT		= 7,
+	PCLK_PERI_SEL_MASK		= 0x1 << PCLK_PERI_SEL_SHIFT,
+	CLK_SAI0_SRC_DIV_SHIFT		= 8,
+	CLK_SAI0_SRC_DIV_MASK		= 0x3f << CLK_SAI0_SRC_DIV_SHIFT,
+	CLK_SAI0_SRC_SEL_SHIFT		= 14,
+	CLK_SAI0_SRC_SEL_MASK		= 0x3 << CLK_SAI0_SRC_SEL_SHIFT,
+
+	/* PERICRU_CLKSEL_CON16 */
+	CCLK_SDMMC0_DIV_SHIFT		= 0,
+	CCLK_SDMMC0_DIV_MASK		= 0xff << CCLK_SDMMC0_DIV_SHIFT,
+	CCLK_SDMMC0_SEL_SHIFT		= 14,
+	CCLK_SDMMC0_SEL_MASK		= 0x3 << CCLK_SDMMC0_SEL_SHIFT,
+	CCLK_SDMMC_SEL_GPLL		= 0,
+	CCLK_SDMMC_SEL_CPLL,
+	CCLK_SDMMC_SEL_24M,
+	CCLK_SDMMC_SEL_HPLL,
+
+	/* PERICRU_CLKSEL_CON17 */
+	CCLK_SDMMC1_DIV_SHIFT		= 0,
+	CCLK_SDMMC1_DIV_MASK		= 0xff << CCLK_SDMMC1_DIV_SHIFT,
+	CCLK_SDMMC1_SEL_SHIFT		= 14,
+	CCLK_SDMMC1_SEL_MASK		= 0x3 << CCLK_SDMMC1_SEL_SHIFT,
+
+	/* PERICRU_CLKSEL_CON18 */
+	CCLK_EMMC_DIV_SHIFT		= 0,
+	CCLK_EMMC_DIV_MASK		= 0xff << CCLK_EMMC_DIV_SHIFT,
+	CCLK_EMMC_SEL_SHIFT		= 14,
+	CCLK_EMMC_SEL_MASK		= 0x3 << CCLK_EMMC_SEL_SHIFT,
+	CCLK_EMMC_SEL_GPLL		= 0,
+	CCLK_EMMC_SEL_CPLL,
+	CCLK_EMMC_SEL_24M,
+	CCLK_EMMC_SEL_HPLL,
+
+	/* PERICRU_CLKSEL_CON19 */
+	BCLK_EMMC_DIV_SHIFT		= 8,
+	BCLK_EMMC_DIV_MASK		= 0x7f << BCLK_EMMC_DIV_SHIFT,
+	BCLK_EMMC_SEL_SHIFT		= 15,
+	BCLK_EMMC_SEL_MASK		= 0x1 << BCLK_EMMC_SEL_SHIFT,
+	BCLK_EMMC_SEL_GPLL		= 0,
+	BCLK_EMMC_SEL_CPLL,
+
+	/* PERICRU_CLKSEL_CON20 */
+	SCLK_SFC_DIV_SHIFT		= 0,
+	SCLK_SFC_DIV_MASK		= 0xff << SCLK_SFC_DIV_SHIFT,
+	SCLK_SFC_SEL_SHIFT		= 8,
+	SCLK_SFC_SEL_MASK		= 0x3 << SCLK_SFC_SEL_SHIFT,
+	SCLK_SFC_SRC_SEL_GPLL		= 0,
+	SCLK_SFC_SRC_SEL_CPLL,
+	SCLK_SFC_SRC_SEL_24M,
+	CLK_SPI1_SEL_SHIFT		= 12,
+	CLK_SPI1_SEL_MASK		= 0x3 << CLK_SPI1_SEL_SHIFT,
+	CLK_SPI_SEL_200M		= 0,
+	CLK_SPI_SEL_100M,
+	CLK_SPI_SEL_50M,
+	CLK_SPI_SEL_24M,
+	CLK_SPI2_SEL_SHIFT		= 14,
+	CLK_SPI2_SEL_MASK		= 0x3 << CLK_SPI2_SEL_SHIFT,
+
+	/* PERICRU_CLKSEL_CON21 */
+	CLK_UART_SRC_DIV_SHIFT		= 0,
+	CLK_UART_SRC_DIV_MASK		= 0x7f << CLK_UART_SRC_DIV_SHIFT,
+	CLK_UART_SRC_SEL_SHIFT		= 8,
+	CLK_UART_SRC_SEL_MASK		= 0x1 << CLK_UART_SRC_SEL_SHIFT,
+	CLK_UART_SRC_SEL_GPLL		= 0,
+	CLK_UART_SRC_SEL_CPLL,
+	CLK_UART_SEL_SHIFT		= 14,
+	CLK_UART_SEL_MASK		= 0x3 << CLK_UART_SEL_SHIFT,
+	CLK_UART_SEL_SRC		= 0,
+	CLK_UART_SEL_FRAC,
+	CLK_UART_SEL_XIN24M,
+
+	/* PERICRU_CLKSEL_CON22 */
+	CLK_UART_FRAC_NUMERATOR_SHIFT	= 16,
+	CLK_UART_FRAC_NUMERATOR_MASK	= 0xffff << 16,
+	CLK_UART_FRAC_DENOMINATOR_SHIFT	= 0,
+	CLK_UART_FRAC_DENOMINATOR_MASK	= 0xffff,
+
+	/* PERICRU_CLKSEL_CON40 */
+	CLK_PWM1_PERI_SEL_SHIFT		= 0,
+	CLK_PWM1_PERI_SEL_MASK		= 0x3 << CLK_PWM1_PERI_SEL_SHIFT,
+	CLK_PWM_SEL_100M		= 0,
+	CLK_PWM_SEL_50M,
+	CLK_PWM_SEL_24M,
+	CLK_PWM2_PERI_SEL_SHIFT		= 6,
+	CLK_PWM2_PERI_SEL_MASK		= 0x3 << CLK_PWM2_PERI_SEL_SHIFT,
+	CLK_PWM3_PERI_SEL_SHIFT		= 8,
+	CLK_PWM3_PERI_SEL_MASK		= 0x3 << CLK_PWM3_PERI_SEL_SHIFT,
+
+	/* PERICRU_CLKSEL_CON43 */
+	CLK_CORE_CRYPTO_SEL_SHIFT	= 0,
+	CLK_CORE_CRYPTO_SEL_MASK	= 0x3 << CLK_CORE_CRYPTO_SEL_SHIFT,
+	CLK_CORE_CRYPTO_SEL_200M	= 0,
+	CLK_CORE_CRYPTO_SEL_100M,
+	CLK_CORE_CRYPTO_SEL_24M,
+	CLK_PKA_CRYPTO_SEL_SHIFT	= 6,
+	CLK_PKA_CRYPTO_SEL_MASK		= 0x3 << CLK_PKA_CRYPTO_SEL_SHIFT,
+	CLK_PKA_CRYPTO_SEL_300M		= 0,
+	CLK_PKA_CRYPTO_SEL_200M,
+	CLK_PKA_CRYPTO_SEL_100M,
+	CLK_PKA_CRYPTO_SEL_24M,
+	TCLK_PERI_WDT_SEL_SHIFT		= 15,
+	TCLK_PERI_WDT_SEL_MASK		= 0x1 << TCLK_PERI_WDT_SEL_SHIFT,
+
+	/* PERICRU_CLKSEL_CON46 */
+	CLK_SARADC_DIV_SHIFT		= 0,
+	CLK_SARADC_DIV_MASK		= 0xfff << CLK_SARADC_DIV_SHIFT,
+};
+#endif
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/fit.h b/u-boot/arch/arm/include/asm/arch-rockchip/fit.h
index d10d2f2..36971ef 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/fit.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/fit.h
@@ -14,7 +14,7 @@
 
 int fit_image_pre_process(const void *fit);
 int fit_image_fail_process(const void *fit);
-int fit_image_init_resource(void);
 int fit_image_read_dtb(void *fdt_addr);
+ulong fit_image_init_resource(struct blk_desc *dev_desc);
 
 #endif
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h
new file mode 100644
index 0000000..222fcbd
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h
@@ -0,0 +1,89 @@
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd.
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#ifndef _ASM_ARCH_GRF_RK3528_H
+#define _ASM_ARCH_GRF_RK3528_H
+
+#include <common.h>
+
+struct rk3528_grf {
+	uint32_t reserved0[0x40018 / 4];
+
+	/* vpugrf*/
+	uint32_t gmac1_con0;			     /* Address Offset: 0x40018 */
+	uint32_t gmac1_con1;			     /* Address Offset: 0x4001c */
+	uint32_t reserved1[(0x60018 - 0x4001c) / 4 - 1];
+	
+	/* vogrf */
+	uint32_t gmac0_con;                          /* Address Offset: 0x60018 */
+	uint32_t macphy_con0;                        /* Address Offset: 0x6001c */
+	uint32_t macphy_con1;                        /* Address Offset: 0x60020 */
+	uint32_t sdmmc_con0;                         /* Address Offset: 0x60024 */
+	uint32_t sdmmc_con1;                         /* Address Offset: 0x60028 */
+	uint32_t reserved2[(0x70000 - 0x60028) / 4 - 1];
+
+	/* pmugrf */
+	uint32_t soc_con[8];                         /* Address Offset: 0x70000 */
+	uint32_t soc_status;                         /* Address Offset: 0x70020 */
+	uint32_t reserved3[3];                       /* Address Offset: 0x70024 */
+	uint32_t pmuio_vsel;                         /* Address Offset: 0x70030 */
+	uint32_t reserved4[3];                       /* Address Offset: 0x70034 */
+	uint32_t mem_con;                            /* Address Offset: 0x70040 */
+	uint32_t reserved5[47];                      /* Address Offset: 0x70044 */
+	uint32_t rstfunc_status;                     /* Address Offset: 0x70100 */
+	uint32_t rstfunc_clr;                        /* Address Offset: 0x70104 */
+	uint32_t reserved6[62];                      /* Address Offset: 0x70108 */
+	uint32_t os_reg0;                            /* Address Offset: 0x70200 */
+	uint32_t os_reg1;                            /* Address Offset: 0x70204 */
+	uint32_t os_reg2;                            /* Address Offset: 0x70208 */
+	uint32_t os_reg3;                            /* Address Offset: 0x7020C */
+	uint32_t os_reg4;                            /* Address Offset: 0x70210 */
+	uint32_t os_reg5;                            /* Address Offset: 0x70214 */
+	uint32_t os_reg6;                            /* Address Offset: 0x70218 */
+	uint32_t os_reg7;                            /* Address Offset: 0x7021C */
+	uint32_t os_reg8;                            /* Address Offset: 0x70220 */
+	uint32_t os_reg9;                            /* Address Offset: 0x70224 */
+	uint32_t os_reg10;                           /* Address Offset: 0x70228 */
+	uint32_t os_reg11;                           /* Address Offset: 0x7022C */
+	uint32_t os_reg12;                           /* Address Offset: 0x70230 */
+	uint32_t os_reg13;                           /* Address Offset: 0x70234 */
+	uint32_t os_reg14;                           /* Address Offset: 0x70238 */
+	uint32_t os_reg15;                           /* Address Offset: 0x7023C */
+	uint32_t os_reg16;                           /* Address Offset: 0x70240 */
+	uint32_t os_reg17;                           /* Address Offset: 0x70244 */
+	uint32_t os_reg18;                           /* Address Offset: 0x70248 */
+	uint32_t os_reg19;                           /* Address Offset: 0x7024C */
+	uint32_t os_reg20;                           /* Address Offset: 0x70250 */
+	uint32_t os_reg21;                           /* Address Offset: 0x70254 */
+	uint32_t os_reg22;                           /* Address Offset: 0x70258 */
+	uint32_t os_reg23;                           /* Address Offset: 0x7025C */
+	uint32_t reserved7[(0x80000 - 0x7025C) / 4 - 1];
+
+	uint32_t grf_sys_con[2];                     /* Address Offset: 0x80000 */
+	uint32_t reserved8[2];                       /* Address Offset: 0x80008 */
+	uint32_t grf_sys_status;                     /* Address Offset: 0x80010 */
+	uint32_t reserved9[3];                       /* Address Offset: 0x80014 */
+	uint32_t grf_biu_con[2];                     /* Address Offset: 0x80020 */
+	uint32_t reserved10[2];                      /* Address Offset: 0x80028 */
+	uint32_t grf_biu_status[3];                  /* Address Offset: 0x80030 */
+	uint32_t reserved11[17];                     /* Address Offset: 0x8003C */
+	uint32_t grf_sys_mem_con[5];                 /* Address Offset: 0x80080 */
+	uint32_t reserved12[59];                     /* Address Offset: 0x80094 */
+	uint32_t grf_soc_code;                       /* Address Offset: 0x80180 */
+	uint32_t reserved13[3];                      /* Address Offset: 0x80184 */
+	uint32_t grf_soc_version;                    /* Address Offset: 0x80190 */
+	uint32_t reserved14[3];                      /* Address Offset: 0x80194 */
+	uint32_t grf_chip_id;                        /* Address Offset: 0x801A0 */
+	uint32_t reserved15[3];                      /* Address Offset: 0x801A4 */
+	uint32_t grf_chip_version;                   /* Address Offset: 0x801B0 */
+	uint32_t reserved16[(0x10000 - 0x81b0) / 4 - 1];
+
+};
+
+check_member(rk3528_grf, sdmmc_con1, 0x60028);
+check_member(rk3528_grf, os_reg23, 0x7025C);
+check_member(rk3528_grf, grf_chip_version, 0x801B0);
+
+#endif
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h
new file mode 100644
index 0000000..31d5fad
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h
@@ -0,0 +1,76 @@
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd.
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#ifndef _ASM_ARCH_GRF_RK3562_H
+#define _ASM_ARCH_GRF_RK3562_H
+
+#include <common.h>
+
+struct rk3562_pmu_grf {
+        /* pmugrf */
+        uint32_t reserved1[(0x0100 - 0x0000) / 4];        /* address offset: 0x0000 */
+        uint32_t soc_con[13];                             /* address offset: 0x0100 */
+        uint32_t soc_status[1];                           /* address offset: 0x0134 */
+        uint32_t reserved2[(0x0180 - 0x0134) / 4 - 1];    /* address offset: 0x0138 */
+        uint32_t pvtm_con[1];                             /* address offset: 0x0180 */
+        uint32_t reserved3[(0x0200 - 0x0180) / 4 - 1];    /* address offset: 0x0184 */
+        uint32_t os_reg[12];                              /* address offset: 0x0200 */
+        uint32_t reset_function_status;                   /* address offset: 0x0230 */
+        uint32_t reset_function_clr;                      /* address offset: 0x0234 */
+        uint32_t reserved4[(0x0380 - 0x0234) / 4 - 1];    /* address offset: 0x0238 */
+        uint32_t sig_detect_con;                          /* address offset: 0x0380 */
+        uint32_t reserved5[(0x0390 - 0x0380) / 4 - 1];    /* address offset: 0x0384 */
+        uint32_t sig_detect_status;                       /* address offset: 0x0390 */
+        uint32_t reserved6[(0x03a0 - 0x0390) / 4 - 1];    /* address offset: 0x0394 */
+        uint32_t sig_detect_status_clear;                 /* address offset: 0x03a0 */
+        uint32_t reserved7[(0x03b0 - 0x03a0) / 4 - 1];    /* address offset: 0x03a4 */
+        uint32_t sdmmc_det_counter;                       /* address offset: 0x03b0 */
+};
+
+check_member(rk3562_pmu_grf, sdmmc_det_counter, 0x03b0);
+
+struct rk3562_grf {
+        /* sysgrf */
+        uint32_t reserved1[(0x0400 - 0x0000) / 4];        /* address offset: 0x0000 */
+        uint32_t soc_con[7];                              /* address offset: 0x0400 */
+        uint32_t reserved2[(0x0430 - 0x0400) / 4 - 7];    /* address offset: 0x041c */
+        uint32_t soc_status[3];                           /* address offset: 0x0430 */
+        uint32_t reserved3;                               /* address offset: 0x043c */
+        uint32_t biu_con[2];                              /* address offset: 0x0440 */
+        uint32_t reserved4[(0x0460 - 0x0440) / 4 - 2];    /* address offset: 0x0448 */
+        uint32_t ram_con;                                 /* address offset: 0x0460 */
+        uint32_t core_ram_con;                            /* address offset: 0x0464 */
+        uint32_t reserved5[(0x0500 - 0x0464) / 4 - 1];    /* address offset: 0x0468 */
+        uint32_t cpu_con[2];                              /* address offset: 0x0500 */
+        uint32_t reserved6[(0x0510 - 0x0500) / 4 - 2];    /* address offset: 0x0508 */
+        uint32_t cpu_status[2];                           /* address offset: 0x0510 */
+        uint32_t reserved7[(0x0520 - 0x0510) / 4 - 2];    /* address offset: 0x0518 */
+        uint32_t vi_con[2];                               /* address offset: 0x0520 */
+        uint32_t reserved8[(0x0530 - 0x0520) / 4 - 2];    /* address offset: 0x0528 */
+        uint32_t vi_status[1];                            /* address offset: 0x0530 */
+        uint32_t reserved9[(0x0570 - 0x0530) / 4 - 1];    /* address offset: 0x0534 */
+        uint32_t gpu_con[2];                              /* address offset: 0x0570 */
+        uint32_t reserved10[(0x0580 - 0x0570) / 4 - 2];   /* address offset: 0x0578 */
+        uint32_t tsadc_con;                               /* address offset: 0x0580 */
+        uint32_t reserved11[(0x05d0 - 0x0580) / 4 - 1];   /* address offset: 0x0584 */
+        uint32_t vo_con[2];                               /* address offset: 0x05d0 */
+        uint32_t reserved12[(0x0600 - 0x05d0) / 4 - 2];   /* address offset: 0x05d8 */
+        uint32_t top_pvtpll_con[4];                       /* address offset: 0x0600 */
+        uint32_t top_pvtpll_status[2];                    /* address offset: 0x0610 */
+        uint32_t reserved13[(0x0620 - 0x0610) / 4 - 2];   /* address offset: 0x0618 */
+        uint32_t cpu_pvtpll_con[4];                       /* address offset: 0x0620 */
+        uint32_t cpu_pvtpll_status[2];                    /* address offset: 0x0630 */
+        uint32_t reserved14[(0x0640 - 0x0630) / 4 - 2];   /* address offset: 0x0638 */
+        uint32_t gpu_pvtpll_con[4];                       /* address offset: 0x0640 */
+        uint32_t gpu_pvtpll_status[2];                    /* address offset: 0x0650 */
+        uint32_t reserved15[(0x0660 - 0x0650) / 4 - 2];   /* address offset: 0x0658 */
+        uint32_t npu_pvtpll_con[4];                       /* address offset: 0x0660 */
+        uint32_t npu_pvtpll_status[2];                    /* address offset: 0x0670 */
+        uint32_t reserved16[(0x0800 - 0x0670) / 4 - 2];   /* address offset: 0x0678 */
+        uint32_t chip_id;                                 /* address offset: 0x0800 */
+};
+check_member(rk3562_grf, chip_id, 0x0800);
+
+#endif
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h
new file mode 100644
index 0000000..74c6116
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h
@@ -0,0 +1,196 @@
+/*
+ * (C) Copyright 2021 Rockchip Electronics Co., Ltd.
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#ifndef _ASM_ARCH_IOC_RK3528_H
+#define _ASM_ARCH_IOC_RK3528_H
+
+#include <common.h>
+
+struct rk3528_gpio0_ioc {
+	uint32_t gpio0a_iomux_sel_l;                 /* Address Offset: 0x0000 */
+	uint32_t gpio0a_iomux_sel_h;                 /* Address Offset: 0x0004 */
+	uint32_t reserved0008[62];                   /* Address Offset: 0x0008 */
+	uint32_t gpio0a_ds[3];                       /* Address Offset: 0x0100 */
+	uint32_t reserved010c[61];                   /* Address Offset: 0x010C */
+	uint32_t gpio0a_pull;                        /* Address Offset: 0x0200 */
+	uint32_t reserved0204[63];                   /* Address Offset: 0x0204 */
+	uint32_t gpio0a_ie;                          /* Address Offset: 0x0300 */
+	uint32_t reserved0304[63];                   /* Address Offset: 0x0304 */
+	uint32_t gpio0a_smt;                         /* Address Offset: 0x0400 */
+	uint32_t reserved0404[63];                   /* Address Offset: 0x0404 */
+	uint32_t gpio0a_sus;                         /* Address Offset: 0x0500 */
+	uint32_t reserved0504[63];                   /* Address Offset: 0x0504 */
+	uint32_t gpio0a_sl;                          /* Address Offset: 0x0600 */
+	uint32_t reserved0604[63];                   /* Address Offset: 0x0604 */
+	uint32_t gpio0a_od;                          /* Address Offset: 0x0700 */
+	uint32_t vcc5vio_ctrl;                          /* Address Offset: 0x0704 */
+};
+check_member(rk3528_gpio0_ioc, vcc5vio_ctrl, 0x0704);
+
+struct rk3528_gpio1_ioc {
+	uint32_t reserved0000[8];                    /* Address Offset: 0x0000 */
+	uint32_t gpio1a_iomux_sel_l;                 /* Address Offset: 0x0020 */
+	uint32_t gpio1a_iomux_sel_h;                 /* Address Offset: 0x0024 */
+	uint32_t gpio1b_iomux_sel_l;                 /* Address Offset: 0x0028 */
+	uint32_t gpio1b_iomux_sel_h;                 /* Address Offset: 0x002C */
+	uint32_t gpio1c_iomux_sel_l;                 /* Address Offset: 0x0030 */
+	uint32_t gpio1c_iomux_sel_h;                 /* Address Offset: 0x0034 */
+	uint32_t gpio1d_iomux_sel_l;                 /* Address Offset: 0x0038 */
+	uint32_t gpio1d_iomux_sel_h;                 /* Address Offset: 0x003C */
+	uint32_t reserved0040[56];                   /* Address Offset: 0x0040 */
+	uint32_t gpio1a_ds[4];                       /* Address Offset: 0x0120 */
+	uint32_t gpio1b_ds[4];                       /* Address Offset: 0x0130 */
+	uint32_t gpio1c_ds[4];                       /* Address Offset: 0x0140 */
+	uint32_t gpio1d_ds[4];                       /* Address Offset: 0x0150 */
+	uint32_t reserved0160[44];                   /* Address Offset: 0x0160 */
+	uint32_t gpio1a_pull;                        /* Address Offset: 0x0210 */
+	uint32_t gpio1b_pull;                        /* Address Offset: 0x0214 */
+	uint32_t gpio1c_pull;                        /* Address Offset: 0x0218 */
+	uint32_t gpio1d_pull;                        /* Address Offset: 0x021C */
+	uint32_t reserved0220[60];                   /* Address Offset: 0x0220 */
+	uint32_t gpio1a_ie;                          /* Address Offset: 0x0310 */
+	uint32_t gpio1b_ie;                          /* Address Offset: 0x0314 */
+	uint32_t gpio1c_ie;                          /* Address Offset: 0x0318 */
+	uint32_t gpio1d_ie;                          /* Address Offset: 0x031C */
+	uint32_t reserved0320[60];                   /* Address Offset: 0x0320 */
+	uint32_t gpio1a_smt;                         /* Address Offset: 0x0410 */
+	uint32_t gpio1b_smt;                         /* Address Offset: 0x0414 */
+	uint32_t gpio1c_smt;                         /* Address Offset: 0x0418 */
+	uint32_t gpio1d_smt;                         /* Address Offset: 0x041C */
+	uint32_t reserved0420[60];                   /* Address Offset: 0x0420 */
+	uint32_t gpio1a_sus;                         /* Address Offset: 0x0510 */
+	uint32_t gpio1b_sus;                         /* Address Offset: 0x0514 */
+	uint32_t gpio1c_sus;                         /* Address Offset: 0x0518 */
+	uint32_t gpio1d_sus;                         /* Address Offset: 0x051C */
+	uint32_t reserved0520[60];                   /* Address Offset: 0x0520 */
+	uint32_t gpio1a_sl;                          /* Address Offset: 0x0610 */
+	uint32_t gpio1b_sl;                          /* Address Offset: 0x0614 */
+	uint32_t gpio1c_sl;                          /* Address Offset: 0x0618 */
+	uint32_t gpio1d_sl;                          /* Address Offset: 0x061C */
+	uint32_t reserved0620[60];                   /* Address Offset: 0x0620 */
+	uint32_t gpio1a_od;                          /* Address Offset: 0x0710 */
+	uint32_t gpio1b_od;                          /* Address Offset: 0x0714 */
+	uint32_t gpio1c_od;                          /* Address Offset: 0x0718 */
+	uint32_t gpio1d_od;                          /* Address Offset: 0x071C */
+	uint32_t reserved0720[60];                   /* Address Offset: 0x0720 */
+	uint32_t vccio0_poc;                         /* Address Offset: 0x0810 */
+	uint32_t reserved0814[3];                    /* Address Offset: 0x0814 */
+	uint32_t vccio1_poc;                         /* Address Offset: 0x0820 */
+};
+check_member(rk3528_gpio1_ioc, vccio1_poc, 0x0820);
+
+struct rk3528_gpio2_ioc {
+	uint32_t reserved0000[16];                   /* Address Offset: 0x0000 */
+	uint32_t gpio2a_iomux_sel_l;                 /* Address Offset: 0x0040 */
+	uint32_t gpio2a_iomux_sel_h;                 /* Address Offset: 0x0044 */
+	uint32_t reserved0048[70];                   /* Address Offset: 0x0048 */
+	uint32_t gpio2a_ds[4];                       /* Address Offset: 0x0160 */
+	uint32_t reserved0170[44];                   /* Address Offset: 0x0170 */
+	uint32_t gpio2a_pull;                        /* Address Offset: 0x0220 */
+	uint32_t reserved0224[63];                   /* Address Offset: 0x0224 */
+	uint32_t gpio2a_ie;                          /* Address Offset: 0x0320 */
+	uint32_t reserved0324[63];                   /* Address Offset: 0x0324 */
+	uint32_t gpio2a_smt;                         /* Address Offset: 0x0420 */
+	uint32_t reserved0424[63];                   /* Address Offset: 0x0424 */
+	uint32_t gpio2a_sus;                         /* Address Offset: 0x0520 */
+	uint32_t reserved0524[63];                   /* Address Offset: 0x0524 */
+	uint32_t gpio2a_sl;                          /* Address Offset: 0x0620 */
+	uint32_t reserved0624[63];                   /* Address Offset: 0x0624 */
+	uint32_t gpio2a_od;                          /* Address Offset: 0x0720 */
+	uint32_t reserved0724[67];                   /* Address Offset: 0x0724 */
+	uint32_t vccio2_poc;                         /* Address Offset: 0x0830 */
+};
+check_member(rk3528_gpio2_ioc, vccio2_poc, 0x0830);
+	
+struct rk3528_gpio3_ioc {
+	uint32_t reserved0000[24];                   /* Address Offset: 0x0000 */
+	uint32_t gpio3a_iomux_sel_l;                 /* Address Offset: 0x0060 */
+	uint32_t gpio3a_iomux_sel_h;                 /* Address Offset: 0x0064 */
+	uint32_t gpio3b_iomux_sel_l;                 /* Address Offset: 0x0068 */
+	uint32_t gpio3b_iomux_sel_h;                 /* Address Offset: 0x006C */
+	uint32_t gpio3c_iomux_sel_l;                 /* Address Offset: 0x0070 */
+	uint32_t reserved0074[71];                   /* Address Offset: 0x0074 */
+	uint32_t gpio3a_ds[4];                       /* Address Offset: 0x0190 */
+	uint32_t gpio3b_ds[4];                       /* Address Offset: 0x01A0 */
+	uint32_t gpio3c_ds[2];                       /* Address Offset: 0x01B0 */
+	uint32_t reserved01b8[30];                   /* Address Offset: 0x01B8 */
+	uint32_t gpio3a_pull;                        /* Address Offset: 0x0230 */
+	uint32_t gpio3b_pull;                        /* Address Offset: 0x0234 */
+	uint32_t gpio3c_pull;                        /* Address Offset: 0x0238 */
+	uint32_t reserved023c[61];                   /* Address Offset: 0x023C */
+	uint32_t gpio3a_ie;                          /* Address Offset: 0x0330 */
+	uint32_t gpio3b_ie;                          /* Address Offset: 0x0334 */
+	uint32_t gpio3c_ie;                          /* Address Offset: 0x0338 */
+	uint32_t reserved033c[61];                   /* Address Offset: 0x033C */
+	uint32_t gpio3a_smt;                         /* Address Offset: 0x0430 */
+	uint32_t gpio3b_smt;                         /* Address Offset: 0x0434 */
+	uint32_t gpio3c_smt;                         /* Address Offset: 0x0438 */
+	uint32_t reserved043c[61];                   /* Address Offset: 0x043C */
+	uint32_t gpio3a_sus;                         /* Address Offset: 0x0530 */
+	uint32_t gpio3b_sus;                         /* Address Offset: 0x0534 */
+	uint32_t gpio3c_sus;                         /* Address Offset: 0x0538 */
+	uint32_t reserved053c[61];                   /* Address Offset: 0x053C */
+	uint32_t gpio3a_sl;                          /* Address Offset: 0x0630 */
+	uint32_t gpio3b_sl;                          /* Address Offset: 0x0634 */
+	uint32_t gpio3c_sl;                          /* Address Offset: 0x0638 */
+	uint32_t reserved063c[61];                   /* Address Offset: 0x063C */
+	uint32_t gpio3a_od;                          /* Address Offset: 0x0730 */
+	uint32_t gpio3b_od;                          /* Address Offset: 0x0734 */
+	uint32_t gpio3c_od;                          /* Address Offset: 0x0738 */
+	uint32_t reserved073c[65];                   /* Address Offset: 0x073C */
+	uint32_t vccio3_poc;                         /* Address Offset: 0x0840 */
+};
+check_member(rk3528_gpio3_ioc, vccio3_poc, 0x0840);
+
+struct rk3528_gpio4_ioc {
+	uint32_t reserved0000[32];                   /* Address Offset: 0x0000 */
+	uint32_t gpio4a_iomux_sel_l;                 /* Address Offset: 0x0080 */
+	uint32_t gpio4a_iomux_sel_h;                 /* Address Offset: 0x0084 */
+	uint32_t gpio4b_iomux_sel_l;                 /* Address Offset: 0x0088 */
+	uint32_t gpio4b_iomux_sel_h;                 /* Address Offset: 0x008C */
+	uint32_t gpio4c_iomux_sel_l;                 /* Address Offset: 0x0090 */
+	uint32_t gpio4c_iomux_sel_h;                 /* Address Offset: 0x0094 */
+	uint32_t gpio4d_iomux_sel_l;                 /* Address Offset: 0x0098 */
+	uint32_t reserved009c[73];                   /* Address Offset: 0x009C */
+	uint32_t gpio4a_ds[4];                       /* Address Offset: 0x01C0 */
+	uint32_t gpio4b_ds[4];                       /* Address Offset: 0x01D0 */
+	uint32_t gpio4c_ds[4];                       /* Address Offset: 0x01E0 */
+	uint32_t gpio4d_ds[1];                       /* Address Offset: 0x01F0 */
+	uint32_t reserved01f4[19];                   /* Address Offset: 0x01F4 */
+	uint32_t gpio4a_pull;                        /* Address Offset: 0x0240 */
+	uint32_t gpio4b_pull;                        /* Address Offset: 0x0244 */
+	uint32_t gpio4c_pull;                        /* Address Offset: 0x0248 */
+	uint32_t gpio4d_pull;                        /* Address Offset: 0x024C */
+	uint32_t reserved0250[60];                   /* Address Offset: 0x0250 */
+	uint32_t gpio4a_ie;                          /* Address Offset: 0x0340 */
+	uint32_t gpio4b_ie;                          /* Address Offset: 0x0344 */
+	uint32_t gpio4c_ie;                          /* Address Offset: 0x0348 */
+	uint32_t gpio4d_ie;                          /* Address Offset: 0x034C */
+	uint32_t reserved0350[60];                   /* Address Offset: 0x0350 */
+	uint32_t gpio4a_smt;                         /* Address Offset: 0x0440 */
+	uint32_t gpio4b_smt;                         /* Address Offset: 0x0444 */
+	uint32_t gpio4c_smt;                         /* Address Offset: 0x0448 */
+	uint32_t gpio4d_smt;                         /* Address Offset: 0x044C */
+	uint32_t reserved0450[60];                   /* Address Offset: 0x0450 */
+	uint32_t gpio4a_sus;                         /* Address Offset: 0x0540 */
+	uint32_t gpio4b_sus;                         /* Address Offset: 0x0544 */
+	uint32_t gpio4c_sus;                         /* Address Offset: 0x0548 */
+	uint32_t gpio4d_sus;                         /* Address Offset: 0x054C */
+	uint32_t reserved0550[60];                   /* Address Offset: 0x0550 */
+	uint32_t gpio4a_sl;                          /* Address Offset: 0x0640 */
+	uint32_t gpio4b_sl;                          /* Address Offset: 0x0644 */
+	uint32_t gpio4c_sl;                          /* Address Offset: 0x0648 */
+	uint32_t gpio4d_sl;                          /* Address Offset: 0x064C */
+	uint32_t reserved0650[60];                   /* Address Offset: 0x0650 */
+	uint32_t gpio4a_od;                          /* Address Offset: 0x0740 */
+	uint32_t gpio4b_od;                          /* Address Offset: 0x0744 */
+	uint32_t gpio4c_od;                          /* Address Offset: 0x0748 */
+	uint32_t gpio4d_od;                          /* Address Offset: 0x074C */
+	uint32_t reserved0750[64];                   /* Address Offset: 0x0750 */
+	uint32_t vccio4_poc;                         /* Address Offset: 0x0850 */
+};
+check_member(rk3528_gpio4_ioc, vccio4_poc, 0x0850);
+#endif
+
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h
new file mode 100644
index 0000000..efe5729
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h
@@ -0,0 +1,211 @@
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd.
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#ifndef _ASM_ARCH_IOC_RK3562_H
+#define _ASM_ARCH_IOC_RK3562_H
+
+#include <common.h>
+
+struct rk3562_ioc {
+	uint32_t gpio1a_iomux_sel_l;                 /* Address Offset: 0x0000 */
+	uint32_t gpio1a_iomux_sel_h;                 /* Address Offset: 0x0004 */
+	uint32_t gpio1b_iomux_sel_l;                 /* Address Offset: 0x0008 */
+	uint32_t gpio1b_iomux_sel_h;                 /* Address Offset: 0x000C */
+	uint32_t gpio1c_iomux_sel_l;                 /* Address Offset: 0x0010 */
+	uint32_t gpio1c_iomux_sel_h;                 /* Address Offset: 0x0014 */
+	uint32_t gpio1d_iomux_sel_l;                 /* Address Offset: 0x0018 */
+	uint32_t gpio1d_iomux_sel_h;                 /* Address Offset: 0x001C */
+	uint32_t gpio2a_iomux_sel_l;                 /* Address Offset: 0x0020 */
+	uint32_t reserved0024[23];                   /* Address Offset: 0x0024 */
+	uint32_t gpio1a_p;                           /* Address Offset: 0x0080 */
+	uint32_t gpio1b_p;                           /* Address Offset: 0x0084 */
+	uint32_t gpio1c_p;                           /* Address Offset: 0x0088 */
+	uint32_t gpio1d_p;                           /* Address Offset: 0x008C */
+	uint32_t gpio2a_p;                           /* Address Offset: 0x0090 */
+	uint32_t reserved0094[11];                   /* Address Offset: 0x0094 */
+	uint32_t gpio1a_ie;                          /* Address Offset: 0x00C0 */
+	uint32_t gpio1b_ie;                          /* Address Offset: 0x00C4 */
+	uint32_t gpio1c_ie;                          /* Address Offset: 0x00C8 */
+	uint32_t gpio1d_ie;                          /* Address Offset: 0x00CC */
+	uint32_t gpio2a_ie;                          /* Address Offset: 0x00D0 */
+	uint32_t reserved00d4[11];                   /* Address Offset: 0x00D4 */
+	uint32_t gpio1a_od;                          /* Address Offset: 0x0100 */
+	uint32_t gpio1b_od;                          /* Address Offset: 0x0104 */
+	uint32_t gpio1c_od;                          /* Address Offset: 0x0108 */
+	uint32_t gpio1d_od;                          /* Address Offset: 0x010C */
+	uint32_t gpio2a_od;                          /* Address Offset: 0x0110 */
+	uint32_t reserved0114[11];                   /* Address Offset: 0x0114 */
+	uint32_t gpio1a_sus;                         /* Address Offset: 0x0140 */
+	uint32_t gpio1b_sus;                         /* Address Offset: 0x0144 */
+	uint32_t gpio1c_sus;                         /* Address Offset: 0x0148 */
+	uint32_t gpio1d_sus;                         /* Address Offset: 0x014C */
+	uint32_t gpio2a_sus;                         /* Address Offset: 0x0150 */
+	uint32_t reserved0154[11];                   /* Address Offset: 0x0154 */
+	uint32_t gpio1a_sl;                          /* Address Offset: 0x0180 */
+	uint32_t gpio1b_sl;                          /* Address Offset: 0x0184 */
+	uint32_t gpio1c_sl;                          /* Address Offset: 0x0188 */
+	uint32_t gpio1d_sl;                          /* Address Offset: 0x018C */
+	uint32_t gpio2a_sl;                          /* Address Offset: 0x0190 */
+	uint32_t reserved0194[27];                   /* Address Offset: 0x0194 */
+	uint32_t gpio1a_ds0;                         /* Address Offset: 0x0200 */
+	uint32_t gpio1a_ds1;                         /* Address Offset: 0x0204 */
+	uint32_t gpio1a_ds2;                         /* Address Offset: 0x0208 */
+	uint32_t gpio1a_ds3;                         /* Address Offset: 0x020C */
+	uint32_t gpio1b_ds0;                         /* Address Offset: 0x0210 */
+	uint32_t gpio1b_ds1;                         /* Address Offset: 0x0214 */
+	uint32_t gpio1b_ds2;                         /* Address Offset: 0x0218 */
+	uint32_t gpio1b_ds3;                         /* Address Offset: 0x021C */
+	uint32_t gpio1c_ds0;                         /* Address Offset: 0x0220 */
+	uint32_t gpio1c_ds1;                         /* Address Offset: 0x0224 */
+	uint32_t gpio1c_ds2;                         /* Address Offset: 0x0228 */
+	uint32_t gpio1c_ds3;                         /* Address Offset: 0x022C */
+	uint32_t gpio1d_ds0;                         /* Address Offset: 0x0230 */
+	uint32_t gpio1d_ds1;                         /* Address Offset: 0x0234 */
+	uint32_t gpio1d_ds2;                         /* Address Offset: 0x0238 */
+	uint32_t gpio1d_ds3;                         /* Address Offset: 0x023C */
+	uint32_t gpio2a_ds0;                         /* Address Offset: 0x0240 */
+	uint32_t reserved0244[47];                   /* Address Offset: 0x0244 */
+	uint32_t io_vsel0;                           /* Address Offset: 0x0300 */
+	uint32_t reserved0304[63];                   /* Address Offset: 0x0304 */
+	uint32_t mac1_io_con0;                       /* Address Offset: 0x0400 */
+	uint32_t mac1_io_con1;                       /* Address Offset: 0x0404 */
+	uint32_t reserved0408[62];                   /* Address Offset: 0x0408 */
+	uint32_t sdcard0_io_con;                     /* Address Offset: 0x0500 */
+	uint32_t jtag_m1_con;                        /* Address Offset: 0x0504 */
+	uint32_t reserved0508[16078];                /* Address Offset: 0x0508 */
+	uint32_t gpio3a_iomux_sel_l;                 /* Address Offset: 0x10040 */
+	uint32_t gpio3a_iomux_sel_h;                 /* Address Offset: 0x10044 */
+	uint32_t gpio3b_iomux_sel_l;                 /* Address Offset: 0x10048 */
+	uint32_t gpio3b_iomux_sel_h;                 /* Address Offset: 0x1004C */
+	uint32_t gpio3c_iomux_sel_l;                 /* Address Offset: 0x10050 */
+	uint32_t gpio3c_iomux_sel_h;                 /* Address Offset: 0x10054 */
+	uint32_t gpio3d_iomux_sel_l;                 /* Address Offset: 0x10058 */
+	uint32_t gpio3d_iomux_sel_h;                 /* Address Offset: 0x1005C */
+	uint32_t gpio4a_iomux_sel_l;                 /* Address Offset: 0x10060 */
+	uint32_t gpio4a_iomux_sel_h;                 /* Address Offset: 0x10064 */
+	uint32_t gpio4b_iomux_sel_l;                 /* Address Offset: 0x10068 */
+	uint32_t gpio4b_iomux_sel_h;                 /* Address Offset: 0x1006C */
+	uint32_t reserved10070[12];                  /* Address Offset: 0x10070 */
+	uint32_t gpio3a_p;                           /* Address Offset: 0x100A0 */
+	uint32_t gpio3b_p;                           /* Address Offset: 0x100A4 */
+	uint32_t gpio3c_p;                           /* Address Offset: 0x100A8 */
+	uint32_t gpio3d_p;                           /* Address Offset: 0x100AC */
+	uint32_t gpio4a_p;                           /* Address Offset: 0x100B0 */
+	uint32_t gpio4b_p;                           /* Address Offset: 0x100B4 */
+	uint32_t reserved100b8[10];                  /* Address Offset: 0x100B8 */
+	uint32_t gpio3a_ie;                          /* Address Offset: 0x100E0 */
+	uint32_t gpio3b_ie;                          /* Address Offset: 0x100E4 */
+	uint32_t gpio3c_ie;                          /* Address Offset: 0x100E8 */
+	uint32_t gpio3d_ie;                          /* Address Offset: 0x100EC */
+	uint32_t gpio4a_ie;                          /* Address Offset: 0x100F0 */
+	uint32_t gpio4b_ie;                          /* Address Offset: 0x100F4 */
+	uint32_t reserved100f8[10];                  /* Address Offset: 0x100F8 */
+	uint32_t gpio3a_od;                          /* Address Offset: 0x10120 */
+	uint32_t gpio3b_od;                          /* Address Offset: 0x10124 */
+	uint32_t gpio3c_od;                          /* Address Offset: 0x10128 */
+	uint32_t gpio3d_od;                          /* Address Offset: 0x1012C */
+	uint32_t gpio4a_od;                          /* Address Offset: 0x10130 */
+	uint32_t gpio4b_od;                          /* Address Offset: 0x10134 */
+	uint32_t reserved10138[10];                  /* Address Offset: 0x10138 */
+	uint32_t gpio3a_sus;                         /* Address Offset: 0x10160 */
+	uint32_t gpio3b_sus;                         /* Address Offset: 0x10164 */
+	uint32_t gpio3c_sus;                         /* Address Offset: 0x10168 */
+	uint32_t gpio3d_sus;                         /* Address Offset: 0x1016C */
+	uint32_t gpio4a_sus;                         /* Address Offset: 0x10170 */
+	uint32_t gpio4b_sus;                         /* Address Offset: 0x10174 */
+	uint32_t reserved10178[10];                  /* Address Offset: 0x10178 */
+	uint32_t gpio3a_sl;                          /* Address Offset: 0x101A0 */
+	uint32_t gpio3b_sl;                          /* Address Offset: 0x101A4 */
+	uint32_t gpio3c_sl;                          /* Address Offset: 0x101A8 */
+	uint32_t gpio3d_sl;                          /* Address Offset: 0x101AC */
+	uint32_t gpio4a_sl;                          /* Address Offset: 0x101B0 */
+	uint32_t gpio4b_sl;                          /* Address Offset: 0x101B4 */
+	uint32_t reserved101b8[50];                  /* Address Offset: 0x101B8 */
+	uint32_t gpio3a_ds0;                         /* Address Offset: 0x10280 */
+	uint32_t gpio3a_ds1;                         /* Address Offset: 0x10284 */
+	uint32_t gpio3a_ds2;                         /* Address Offset: 0x10288 */
+	uint32_t gpio3a_ds3;                         /* Address Offset: 0x1028C */
+	uint32_t gpio3b_ds0;                         /* Address Offset: 0x10290 */
+	uint32_t gpio3b_ds1;                         /* Address Offset: 0x10294 */
+	uint32_t gpio3b_ds2;                         /* Address Offset: 0x10298 */
+	uint32_t gpio3b_ds3;                         /* Address Offset: 0x1029C */
+	uint32_t gpio3c_ds0;                         /* Address Offset: 0x102A0 */
+	uint32_t gpio3c_ds1;                         /* Address Offset: 0x102A4 */
+	uint32_t gpio3c_ds2;                         /* Address Offset: 0x102A8 */
+	uint32_t gpio3c_ds3;                         /* Address Offset: 0x102AC */
+	uint32_t gpio3d_ds0;                         /* Address Offset: 0x102B0 */
+	uint32_t gpio3d_ds1;                         /* Address Offset: 0x102B4 */
+	uint32_t gpio3d_ds2;                         /* Address Offset: 0x102B8 */
+	uint32_t gpio3d_ds3;                         /* Address Offset: 0x102BC */
+	uint32_t gpio4a_ds0;                         /* Address Offset: 0x102C0 */
+	uint32_t gpio4a_ds1;                         /* Address Offset: 0x102C4 */
+	uint32_t gpio4a_ds2;                         /* Address Offset: 0x102C8 */
+	uint32_t gpio4a_ds3;                         /* Address Offset: 0x102CC */
+	uint32_t gpio4b_ds0;                         /* Address Offset: 0x102D0 */
+	uint32_t gpio4b_ds1;                         /* Address Offset: 0x102D4 */
+	uint32_t gpio4b_ds2;                         /* Address Offset: 0x102D8 */
+	uint32_t gpio4b_ds3;                         /* Address Offset: 0x102DC */
+	uint32_t reserved102e0[8];                   /* Address Offset: 0x102E0 */
+	uint32_t io_vsel1;                           /* Address Offset: 0x10300 */
+	uint32_t reserved10304[63];                  /* Address Offset: 0x10304 */
+	uint32_t mac0_io_con0;                       /* Address Offset: 0x10400 */
+	uint32_t mac0_io_con1;                       /* Address Offset: 0x10404 */
+	uint32_t reserved10408[62];                  /* Address Offset: 0x10408 */
+	uint32_t vo_io_con;                          /* Address Offset: 0x10500 */
+	uint32_t reserved10504[35];                  /* Address Offset: 0x10504 */
+	uint32_t saradc1_con;                        /* Address Offset: 0x10590 */
+	uint32_t reserved10594[16027];               /* Address Offset: 0x10594 */
+	uint32_t gpio0a_iomux_sel_l;                 /* Address Offset: 0x20000 */
+	uint32_t gpio0a_iomux_sel_h;                 /* Address Offset: 0x20004 */
+	uint32_t gpio0b_iomux_sel_l;                 /* Address Offset: 0x20008 */
+	uint32_t gpio0b_iomux_sel_h;                 /* Address Offset: 0x2000C */
+	uint32_t gpio0c_iomux_sel_l;                 /* Address Offset: 0x20010 */
+	uint32_t gpio0c_iomux_sel_h;                 /* Address Offset: 0x20014 */
+	uint32_t gpio0d_iomux_sel_l;                 /* Address Offset: 0x20018 */
+	uint32_t reserved2001c;                      /* Address Offset: 0x2001C */
+	uint32_t gpio0a_p;                           /* Address Offset: 0x20020 */
+	uint32_t gpio0b_p;                           /* Address Offset: 0x20024 */
+	uint32_t gpio0c_p;                           /* Address Offset: 0x20028 */
+	uint32_t gpio0d_p;                           /* Address Offset: 0x2002C */
+	uint32_t gpio0a_ie;                          /* Address Offset: 0x20030 */
+	uint32_t gpio0b_ie;                          /* Address Offset: 0x20034 */
+	uint32_t gpio0c_ie;                          /* Address Offset: 0x20038 */
+	uint32_t gpio0d_ie;                          /* Address Offset: 0x2003C */
+	uint32_t gpio0a_od;                          /* Address Offset: 0x20040 */
+	uint32_t gpio0b_od;                          /* Address Offset: 0x20044 */
+	uint32_t gpio0c_od;                          /* Address Offset: 0x20048 */
+	uint32_t gpio0d_od;                          /* Address Offset: 0x2004C */
+	uint32_t gpio0a_sus;                         /* Address Offset: 0x20050 */
+	uint32_t gpio0b_sus;                         /* Address Offset: 0x20054 */
+	uint32_t gpio0c_sus;                         /* Address Offset: 0x20058 */
+	uint32_t gpio0d_sus;                         /* Address Offset: 0x2005C */
+	uint32_t gpio0a_sl;                          /* Address Offset: 0x20060 */
+	uint32_t gpio0b_sl;                          /* Address Offset: 0x20064 */
+	uint32_t gpio0c_sl;                          /* Address Offset: 0x20068 */
+	uint32_t gpio0d_sl;                          /* Address Offset: 0x2006C */
+	uint32_t gpio0a_ds0;                         /* Address Offset: 0x20070 */
+	uint32_t gpio0a_ds1;                         /* Address Offset: 0x20074 */
+	uint32_t gpio0a_ds2;                         /* Address Offset: 0x20078 */
+	uint32_t gpio0a_ds3;                         /* Address Offset: 0x2007C */
+	uint32_t gpio0b_ds0;                         /* Address Offset: 0x20080 */
+	uint32_t gpio0b_ds1;                         /* Address Offset: 0x20084 */
+	uint32_t gpio0b_ds2;                         /* Address Offset: 0x20088 */
+	uint32_t gpio0b_ds3;                         /* Address Offset: 0x2008C */
+	uint32_t gpio0c_ds0;                         /* Address Offset: 0x20090 */
+	uint32_t gpio0c_ds1;                         /* Address Offset: 0x20094 */
+	uint32_t gpio0c_ds2;                         /* Address Offset: 0x20098 */
+	uint32_t gpio0c_ds3;                         /* Address Offset: 0x2009C */
+	uint32_t gpio0d_ds0;                         /* Address Offset: 0x200A0 */
+	uint32_t reserved200a4[23];                  /* Address Offset: 0x200A4 */
+	uint32_t jtag_m0_con;                        /* Address Offset: 0x20100 */
+	uint32_t uart_io_con;                        /* Address Offset: 0x20104 */
+	uint32_t reserved20108[16];                  /* Address Offset: 0x20108 */
+	uint32_t io_vsel2;                           /* Address Offset: 0x20148 */
+	uint32_t xin_con;                            /* Address Offset: 0x2014C */
+};
+check_member(rk3562_ioc, xin_con, 0x2014c);
+
+#endif
+
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h b/u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h
new file mode 100644
index 0000000..dcfd657
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0+  */
+/*
+ * Copyright (c) 2023 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef __ASM_PCIE_EP_BOOT_H
+#define __ASM_PCIE_EP_BOOT_H
+
+void rockchip_pcie_ep_init(void);
+void rockchip_pcie_ep_get_firmware(void);
+#endif
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h b/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h
index 8b6701c..aa6cb0b 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h
@@ -11,55 +11,42 @@
 
 #define MAX_FILE_NAME_LEN		220
 #define MAX_HASH_LEN			32
-#define ROOT_COMPAT_PROP_OFFSET		0x4c	/* Property: "/compatible" */
 #define DTB_SUFFIX			".dtb"
 
 struct resource_file {
 	char		name[MAX_FILE_NAME_LEN];
+	uint32_t	blk_start;
+	uint32_t	blk_offset;
 	char		hash[MAX_HASH_LEN];
 	uint32_t	hash_size;
-	uint32_t	f_offset;	/* Sector offset */
-	uint32_t	f_size;		/* Bytes */
+	uint32_t	size;		/* in byte */
+	bool		in_ram;
 	struct list_head link;
-	struct list_head dtbs;
-	/* Sector base of resource when ram=false, byte base when ram=true */
-	uint32_t	rsce_base;
-	bool		ram;
 };
 
-extern struct list_head entrys_head;
-extern struct list_head entrys_dtbs_head;
+extern struct list_head entry_head;
 
 /*
- * resource_image_check_header - check resource image header
+ * resource_setup_ram_list() - setup resource file list by given resource image.
  *
- * @rsce_hdr: resource file hdr
+ * @dev_desc: boot device
+ * @hdr: resource file hdr
  *
- * return 0 on header okay, otherwise failed
+ * return 0 on success, otherwise fail.
  */
-int resource_image_check_header(void *rsce_hdr);
+int resource_setup_ram_list(struct blk_desc *dev_desc, void *hdr);
 
 /*
- * resource_create_ram_list - create resource file list by data from memory
- *
- * @dev_desc: blk dev descritpion
- * @rsce_hdr: resource file hdr
- *
- * return 0 on header okay, otherwise failed
- */
-int resource_create_ram_list(struct blk_desc *dev_desc, void *rsce_hdr);
-
-/*
- * rockchip_read_resource_file - read file from resource partition
+ * rockchip_read_resource_file() - read file from resource.
  *
  * @buf: destination buf to store file data
  * @name: file name
- * @offset: blocks offset in the file, 1 block = 512 bytes
- * @len: the size(by bytes) of file to read.
+ * @blk_offset: blocks offset in the file, 1 block = 512 bytes
+ * @len: the size(by bytes) of file to read
  *
- * return negative num on failed, otherwise the file size
+ * return the length of read data.
  */
-int rockchip_read_resource_file(void *buf, const char *name, int offset, int len);
+int rockchip_read_resource_file(void *buf, const char *name, int blk_offset, int len);
 
 /*
  * rockchip_read_resource_dtb() - read dtb file
@@ -69,43 +56,5 @@
  * @hash_size: hash value length
  */
 int rockchip_read_resource_dtb(void *fdt_addr, char **hash, int *hash_size);
-
-/*
- * resource_init_list - init resource list of android image from storage
- */
-int resource_init_list(void);
-
-/*
- * resource_replace_entry - replace resource entry, override if find exist one
- */
-int resource_replace_entry(const char *f_name, uint32_t base,
-			   uint32_t f_offset, uint32_t f_size);
-
-/*
- * resource_read_logo_bmps() - read logo bmp from "logo" partition
- */
-int resource_read_logo_bmps(void);
-
-/*
- * resource_read_hwid_dtb() - read hwid dtb
- */
-struct resource_file *resource_read_hwid_dtb(void);
-
-/*
- * resource_is_empty() - return if resource is empty
- */
-int resource_is_empty(void);
-
-/*
- * resource_traverse_init_list() - traverse all image(android/fit/uimage)
- */
-int resource_traverse_init_list(void);
-
-/*
- * board_resource_dtb_accepted() - check if this dtb is accepted
- *
- * return 0 if not accepted, otherwise accepted.
- */
-int board_resource_dtb_accepted(char *dtb_name);
 
 #endif
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h b/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h
index e31f485..2a8799d 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h
@@ -64,7 +64,7 @@
 #define ITEM_SIZE		(1 * 1024)
 #define MAX_CMDLINE_LENGTH	(1024 / 2)
 #define MAX_HEAD_SIZE 4
-#define MAX_META_SEGMENT_SIZE (16 * 1024)
+#define MAX_META_SEGMENT_SIZE (64 * 1024)
 #define BACKUP_META_SIZE (MAX_META_SEGMENT_SIZE / 2)
 #define META_INFO_HEAD_OFFSET	0
 #define META_INFO_SIZE		ITEM_SIZE
@@ -80,13 +80,17 @@
 #define APP_PARAM_OFFSET	(AE_TABLE_OFFSET + AE_TABLE_MAX_SIZE)
 #define APP_PARAM_MAX_SIZE	ITEM_SIZE
 
+#define SECONDARY_SENSOR_INIT_OFFSET	(APP_PARAM_OFFSET + APP_PARAM_MAX_SIZE)
+#define SECONDARY_SENSOR_INIT_MAX_SIZE	ITEM_SIZE
+
 #define SENSOR_IQ_BIN_OFFSET			(MAX_META_SEGMENT_SIZE)
 #define SENSOR_IQ_BIN_MAX_SIZE			(320 * 1024)
-#define MAX_META_BIN_SIZE (MAX_META_SEGMENT_SIZE + SENSOR_IQ_BIN_MAX_SIZE)
-#define META_SIZE						MAX_META_BIN_SIZE
 
-/* 512 - sizeof(tag/load/size/comp_type/comp_size/comp_off/crc32/meta_flags) */
-#define	META_HEAD_RESERVED_SIZE	   (120*4)
+#define SECONDARY_SENSOR_IQ_BIN_OFFSET			(SENSOR_IQ_BIN_OFFSET + SENSOR_IQ_BIN_MAX_SIZE)
+#define SECONDARY_SENSOR_IQ_BIN_MAX_SIZE		(SENSOR_IQ_BIN_MAX_SIZE)
+
+/* 512 - sizeof(tag/load/size/comp_type/comp_size/comp_off/crc32/meta_flags/iq_item_size) */
+#define	META_HEAD_RESERVED_SIZE	   (119*4)
 #define META_READ_DONE_FLAG (1 << 0)
 
 #define AE_TABLE_SHARE2KERNEL_OFFSET	(PARAM_SHARE2KERNEL_OFFSET)
@@ -100,6 +104,7 @@
 	uint32_t comp_type;
 	uint32_t comp_size;
 	uint32_t comp_off;
+	uint32_t iq_item_size;
 	uint8_t  reserved[META_HEAD_RESERVED_SIZE];
 	uint32_t crc32;
 	uint32_t meta_flags;
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h b/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h
index 72db8d9..e5663bf 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h
@@ -29,6 +29,7 @@
 #define SIP_LAST_LOG			0x8200000e
 #define SIP_AMP_CFG			0x82000022
 #define SIP_HDCP_CONFIG			0x82000025
+#define SIP_MCU_CFG			0x82000028
 
 #define ROCKCHIP_SIP_CONFIG_DRAM_INIT		0x00
 #define ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE	0x01
@@ -46,6 +47,19 @@
 #define ROCKCHIP_SIP_CONFIG_DRAM_ECC		0x0d
 #define ROCKCHIP_SIP_CONFIG_DRAM_GET_FREQ_INFO	0x0e
 #define ROCKCHIP_SIP_CONFIG_DRAM_FSP_INIT	0x0f
+
+/* RK_SIP_MCU_CFG child configs, MCU ID */
+#define ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID		0x00
+#define ROCKCHIP_SIP_CONFIG_BUSMCU_1_ID		0x01
+#define ROCKCHIP_SIP_CONFIG_PMUMCU_0_ID		0x10
+#define ROCKCHIP_SIP_CONFIG_DDRMCU_0_ID		0x20
+#define ROCKCHIP_SIP_CONFIG_NPUMCU_0_ID		0x30
+
+/* RK_SIP_MCU_CFG child configs */
+#define ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR		0x01
+#define ROCKCHIP_SIP_CONFIG_MCU_EXPERI_START_ADDR	0x02
+#define ROCKCHIP_SIP_CONFIG_MCU_SRAM_START_ADDR		0x03
+#define ROCKCHIP_SIP_CONFIG_MCU_EXSRAM_START_ADDR	0x04
 
 /* Rockchip Sip version */
 #define SIP_IMPLEMENT_V1                (1)
@@ -100,6 +114,8 @@
 int sip_smc_set_suspend_mode(unsigned long ctrl,
 			     unsigned long config1,
 			     unsigned long config2);
+
+int sip_smc_remotectl_config(unsigned long func, unsigned long data);
 
 /*
  * sip_smc_amp_cfg() - config AMP
@@ -172,6 +188,13 @@
 			unsigned long arg1, unsigned long arg2);
 
 /*
+ * sip_smc_mcu_config() - handle mcu.
+ *
+ * @return  0 on success, otherwise failed.
+ */
+int sip_smc_mcu_config(unsigned long mcu_id, unsigned long func, unsigned long arg2);
+
+/*
  * psci_cpu_on() - Standard ARM PSCI cpu on call.
  *
  * @cpuid:		cpu id
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h
new file mode 100644
index 0000000..ce9dacf
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef _ASM_ARCH_SDRAM_RK3528_H
+#define _ASM_ARCH_SDRAM_RK3528_H
+
+#include <asm/arch-rockchip/sdram.h>
+#include <asm/arch-rockchip/sdram_common.h>
+
+#endif /* _ASM_ARCH_SDRAM_RK3528_H */
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h
new file mode 100644
index 0000000..3357d8f
--- /dev/null
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef _ASM_ARCH_SDRAM_RK3562_H
+#define _ASM_ARCH_SDRAM_RK3562_H
+
+#include <asm/arch-rockchip/sdram.h>
+#include <asm/arch-rockchip/sdram_common.h>
+
+#endif /* _ASM_ARCH_SDRAM_RK3562_H */
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h b/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h
index f409348..a263de2 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h
@@ -12,7 +12,6 @@
 void *uimage_load_bootables(void);
 int uimage_sysmem_free_each(image_header_t *img, u32 ramdisk_sz);
 int uimage_sysmem_reserve_each(image_header_t *hdr, u32 *ramdisk_sz);
-int uimage_init_resource(void);
-
+int uimage_init_resource(struct blk_desc *dev_desc);
 #endif
 
diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h b/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h
index 2c11030..85570ca 100644
--- a/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h
+++ b/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h
@@ -46,4 +46,7 @@
 					       void *p_data));
 
 int vendor_handle_hdcp(struct vendor_item *vhead);
+
+void vendor_storage_fixup(void *blob);
+
 #endif /* _ROCKCHIP_VENDOR_ */
diff --git a/u-boot/arch/arm/include/asm/system.h b/u-boot/arch/arm/include/asm/system.h
index 795d82d..8625375 100644
--- a/u-boot/arch/arm/include/asm/system.h
+++ b/u-boot/arch/arm/include/asm/system.h
@@ -257,6 +257,7 @@
 void wait_for_wakeup(void);
 void protect_secure_region(void);
 void smp_kick_all_cpus(void);
+void smp_entry(u32 cpu);
 
 void flush_l3_cache(void);
 void mmu_change_region_attr(phys_addr_t start, size_t size, u64 attrs);
diff --git a/u-boot/arch/arm/lib/bootm-fdt.c b/u-boot/arch/arm/lib/bootm-fdt.c
index af47974..5ef0e66 100644
--- a/u-boot/arch/arm/lib/bootm-fdt.c
+++ b/u-boot/arch/arm/lib/bootm-fdt.c
@@ -46,6 +46,9 @@
 	if (ret)
 		return ret;
 
+	/* Show "/reserved-memory" */
+	boot_mem_rsv_regions(NULL, blob);
+
 #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_OF_LIBFDT)
 	bd_t *bd = gd->bd;
 	int bank;
diff --git a/u-boot/arch/arm/lib/bootm.c b/u-boot/arch/arm/lib/bootm.c
index 53f7444..7a94d79 100644
--- a/u-boot/arch/arm/lib/bootm.c
+++ b/u-boot/arch/arm/lib/bootm.c
@@ -22,6 +22,7 @@
 #include <asm/byteorder.h>
 #include <linux/libfdt.h>
 #include <mapmem.h>
+#include <mp_boot.h>
 #include <fdt_support.h>
 #include <asm/bootm.h>
 #include <asm/secure.h>
@@ -80,7 +81,7 @@
  */
 static void announce_and_cleanup(bootm_headers_t *images, int fake)
 {
-	ulong us;
+	ulong us, tt_us;
 
 	bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel");
 #ifdef CONFIG_BOOTSTAGE_FDT
@@ -108,8 +109,12 @@
 
 	cleanup_before_linux();
 
+#ifdef CONFIG_MP_BOOT
+	mpb_post(4);
+#endif
 	us = (get_ticks() - gd->sys_start_tick) / (COUNTER_FREQUENCY / 1000000);
-	printf("Total: %ld.%ld ms\n", us / 1000, us % 1000);
+	tt_us = get_ticks() / (COUNTER_FREQUENCY / 1000000);
+	printf("Total: %ld.%ld/%ld.%ld ms\n", us / 1000, us % 1000, tt_us / 1000, tt_us % 1000);
 
 	printf("\nStarting kernel ...%s\n\n", fake ?
 		"(fake run for tracing)" : "");
diff --git a/u-boot/arch/arm/lib/crt0_64.S b/u-boot/arch/arm/lib/crt0_64.S
index 27e22f9..5940253 100644
--- a/u-boot/arch/arm/lib/crt0_64.S
+++ b/u-boot/arch/arm/lib/crt0_64.S
@@ -66,42 +66,6 @@
  */
 
 ENTRY(_main)
-	/*
-	 * Enable instruction cache (if required), stack pointer,
-	 * data access alignment checks and SError.
-	 */
-#ifdef CONFIG_SPL_BUILD
-	mov x1, #CR_I
-#else
-	mov x1, #0
-#endif
-	switch_el x2, 3f, 2f, 1f
-3:	mrs	x0, sctlr_el3
-	orr	x0, x0, x1
-	msr	sctlr_el3, x0
-#ifndef CONFIG_SUPPORT_USBPLUG
-	msr	daifclr, #4			/* Enable SError. SCR_EL3.EA=1 was already set in start.S */
-#endif
-	b	0f
-2:	mrs	x0, sctlr_el2
-	orr	x0, x0, x1
-	msr	sctlr_el2, x0
-
-	mrs	x0, hcr_el2
-	orr	x0, x0, #HCR_EL2_TGE
-	orr	x0, x0, #HCR_EL2_AMO
-#if CONFIG_IS_ENABLED(IRQ)
-	orr	x0, x0, #HCR_EL2_IMO
-#endif
-	msr	hcr_el2, x0
-	msr	daifclr, #4
-	b	0f
-1:	mrs	x0, sctlr_el1
-	orr	x0, x0, x1
-	msr	sctlr_el1, x0
-	msr	daifclr, #4
-0:
-	isb
 
 /*
  * Set up initial C runtime environment and call board_init_f(0).
diff --git a/u-boot/arch/arm/mach-rockchip/Kconfig b/u-boot/arch/arm/mach-rockchip/Kconfig
index 0a3c8f4..383503d 100644
--- a/u-boot/arch/arm/mach-rockchip/Kconfig
+++ b/u-boot/arch/arm/mach-rockchip/Kconfig
@@ -381,6 +381,61 @@
 
 endif
 
+config ROCKCHIP_RK3528
+	bool "Support Rockchip RK3528"
+	select ARM64 if !ARM64_BOOT_AARCH32
+	select GICV2 if !ARM64_BOOT_AARCH32
+	select SUPPORT_TPL if !ARM64_BOOT_AARCH32
+	select SUPPORT_SPL if !ARM64_BOOT_AARCH32
+	select TPL_TINY_FRAMEWORK if TPL
+	select DEBUG_UART_BOARD_INIT
+	imply TPL if !ARM64_BOOT_AARCH32
+	imply SPL if !ARM64_BOOT_AARCH32
+	imply TPL_SERIAL_SUPPORT
+	help
+	  The Rockchip RK3528 is a ARM-based SoC with a quad-core Cortex-A53.
+
+if ROCKCHIP_RK3528
+
+config TPL_LDSCRIPT
+	default "arch/arm/mach-rockchip/u-boot-tpl-v8.lds"
+
+config TPL_TEXT_BASE
+	default 0xfe481000
+
+config TPL_MAX_SIZE
+	default 61440
+
+endif
+
+config ROCKCHIP_RK3562
+	bool "Support Rockchip RK3562"
+	select GICV2
+	select ARM64
+	select ARM_SMCCC
+	select SUPPORT_TPL
+	select SUPPORT_SPL
+	select TPL_TINY_FRAMEWORK if TPL
+	select DEBUG_UART_BOARD_INIT
+	imply TPL
+	imply SPL
+	imply TPL_SERIAL_SUPPORT
+	help
+	  The Rockchip RK3562 is a ARM-based SoC with a quad-core Cortex-A53.
+
+if ROCKCHIP_RK3562
+
+config TPL_LDSCRIPT
+	default "arch/arm/mach-rockchip/u-boot-tpl-v8.lds"
+
+config TPL_TEXT_BASE
+	default 0xfe481000
+
+config TPL_MAX_SIZE
+	default 61440
+
+endif
+
 config ROCKCHIP_RK3568
 	bool "Support Rockchip RK3568"
 	select ARM64 if !ARM64_BOOT_AARCH32
@@ -597,6 +652,8 @@
 	default 0xff1005c8 if ROCKCHIP_RK3328
 	default 0xff738200 if ROCKCHIP_RK3368
 	default 0xff320300 if ROCKCHIP_RK3399
+	default 0xff370200 if ROCKCHIP_RK3528
+	default 0xff010220 if ROCKCHIP_RK3562
 	default 0xfdc20200 if ROCKCHIP_RK3568
 	default 0xfd588080 if ROCKCHIP_RK3588
 	default 0xfe020200 if ROCKCHIP_RK1808
@@ -622,6 +679,8 @@
 	default 0xff1d0020 if ROCKCHIP_RK3328
 	default 0xff830020 if ROCKCHIP_RK3368
 	default 0xff8680a0 if ROCKCHIP_RK3399
+	default 0xff620000 if ROCKCHIP_RK3528
+	default 0xffa90020 if ROCKCHIP_RK3562
 	default 0xfdd1c020 if ROCKCHIP_RK3568
 	default 0xfd8c8000 if ROCKCHIP_RK3588
 	default 0xff590020 if ROCKCHIP_RV1106
@@ -644,6 +703,8 @@
 	default 0xff091000 if ROCKCHIP_RK3328
 	default 0xff8c0000 if ROCKCHIP_RK3368
 	default 0xff8c0000 if ROCKCHIP_RK3399
+	default 0xfe480000 if ROCKCHIP_RK3528
+	default 0xfe480000 if ROCKCHIP_RK3562
 	default 0xfdcc0000 if ROCKCHIP_RK3568
 	default 0xff000000 if ROCKCHIP_RK3588
 	default 0xff6c0000 if ROCKCHIP_RV1106
@@ -813,16 +874,22 @@
 	    - U-Boot: only some necessary U-Boot devices(storage, crypto...) in dm tree.
 	    - kernel: all the devices(except the U-Boot only) in dm tree.
 
+config EMBED_KERNEL_DTB
+	bool "Enable embedded dtb support"
+	default n
+	help
+	  Enable embedded dtb support.
+
 config EMBED_KERNEL_DTB_PATH
-	string "Embeded kernel dtb file path"
-	depends on USING_KERNEL_DTB
+	string "Embedded kernel dtb file path"
+	depends on EMBED_KERNEL_DTB && USING_KERNEL_DTB
 	default "dts/kern.dtb"
 	help
 	  This file will auto be appended to the u-boot.bin.
 
 config EMBED_KERNEL_DTB_ALWAYS
-	bool "Always using embed kernel dtb"
-	depends on USING_KERNEL_DTB
+	bool "Always using embedded kernel dtb"
+	depends on EMBED_KERNEL_DTB && USING_KERNEL_DTB
 	default n
 	help
 	  Allow fallback to always use a prepared kernel dtb even USING_KERNEL_DTB
@@ -914,6 +981,16 @@
 	default y
 	help
 	  Define a lot of hotkeys for debug.
+
+config ROCKCHIP_CMD
+	string "Rockchip specific command"
+	default ""
+	help
+	  It defines a command to be run when the key is pressed if assigned.
+	  String format: "cmd key".
+	  @cmd: any U-Boot cmd.
+	  @key: any key map id, '-' standard for ignore.
+	  e.g. "sd_update 115", 115 is KEY_VOLUMEUP.
 
 config GICV2
 	bool "ARM GICv2"
@@ -1013,14 +1090,16 @@
 	default 0x0
 	depends on PSTORE
 	help
-	  This select linux pstore buffer address for uboot.
+	  This select linux pstore buffer address for U-Boot. When value is
+	  0, U-Boot auto gets this address from preloader atags.
 
 config PERSISTENT_RAM_SIZE
 	hex "Linux pstore buffer size"
 	default 0x0
-	depends on PSTORE
+	depends on (PERSISTENT_RAM_ADDR != 0)
 	help
-	  This select linux pstore buffer size for uboot.
+	  This select linux pstore buffer size for U-Boot, the value must be
+	  set if PERSISTENT_RAM_ADDR != 0.
 
 source "arch/arm/mach-rockchip/px30/Kconfig"
 source "arch/arm/mach-rockchip/rk3036/Kconfig"
@@ -1033,6 +1112,8 @@
 source "arch/arm/mach-rockchip/rk3328/Kconfig"
 source "arch/arm/mach-rockchip/rk3368/Kconfig"
 source "arch/arm/mach-rockchip/rk3399/Kconfig"
+source "arch/arm/mach-rockchip/rk3528/Kconfig"
+source "arch/arm/mach-rockchip/rk3562/Kconfig"
 source "arch/arm/mach-rockchip/rk3568/Kconfig"
 source "arch/arm/mach-rockchip/rk3588/Kconfig"
 source "arch/arm/mach-rockchip/rk1808/Kconfig"
diff --git a/u-boot/arch/arm/mach-rockchip/Makefile b/u-boot/arch/arm/mach-rockchip/Makefile
index afa18a4..75de030 100644
--- a/u-boot/arch/arm/mach-rockchip/Makefile
+++ b/u-boot/arch/arm/mach-rockchip/Makefile
@@ -49,7 +49,7 @@
 obj-$(CONFIG_ROCKCHIP_UIMAGE) += uimage.o
 obj-$(CONFIG_ROCKCHIP_SMCCC) += rockchip_smccc.o
 obj-$(CONFIG_ROCKCHIP_VENDOR_PARTITION) += vendor.o vendor_misc.o
-obj-$(CONFIG_ROCKCHIP_RESOURCE_IMAGE) += resource_img.o resource_logo.o
+obj-$(CONFIG_ROCKCHIP_RESOURCE_IMAGE) += resource_img.o
 obj-$(CONFIG_ROCKCHIP_HWID_DTB) += resource_hwid.o
 obj-$(CONFIG_ROCKCHIP_DEBUGGER) += rockchip_debugger.o
 endif
@@ -58,6 +58,7 @@
 obj-$(CONFIG_RAM) += param.o
 obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram.o
 obj-$(CONFIG_SPL_KERNEL_BOOT) += spl_resource_img.o
+obj-$(CONFIG_SPL_PCIE_EP_SUPPORT) += spl_pcie_ep_boot.o
 
 obj-$(CONFIG_ROCKCHIP_PX30) += px30/
 obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036/
@@ -72,6 +73,8 @@
 obj-$(CONFIG_ROCKCHIP_RK3328) += rk3328/
 obj-$(CONFIG_ROCKCHIP_RK3368) += rk3368/
 obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399/
+obj-$(CONFIG_ROCKCHIP_RK3528) += rk3528/
+obj-$(CONFIG_ROCKCHIP_RK3562) += rk3562/
 obj-$(CONFIG_ROCKCHIP_RK3568) += rk3568/
 obj-$(CONFIG_ROCKCHIP_RK3588) += rk3588/
 obj-$(CONFIG_ROCKCHIP_RK1808) += rk1808/
diff --git a/u-boot/arch/arm/mach-rockchip/board.c b/u-boot/arch/arm/mach-rockchip/board.c
index b3bced5..a539d4b 100644
--- a/u-boot/arch/arm/mach-rockchip/board.c
+++ b/u-boot/arch/arm/mach-rockchip/board.c
@@ -56,6 +56,10 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifdef CONFIG_ARM64
+static ulong orig_images_ep;
+#endif
+
 __weak int rk_board_late_init(void)
 {
 	return 0;
@@ -246,30 +250,48 @@
 static int boot_from_udisk(void)
 {
 	struct blk_desc *desc;
-	char *devtype;
-	char *devnum;
-
-	devtype = env_get("devtype");
-	devnum = env_get("devnum");
+	struct udevice *dev;
+	int devnum = -1;
+	char buf[32];
 
 	/* Booting priority: mmc1 > udisk */
-	if (!strcmp(devtype, "mmc") && !strcmp(devnum, "1"))
+	if (!strcmp(env_get("devtype"), "mmc") && !strcmp(env_get("devnum"), "1"))
 		return 0;
 
 	if (!run_command("usb start", -1)) {
-		desc = blk_get_devnum_by_type(IF_TYPE_USB, 0);
-		if (!desc) {
-			printf("No usb device found\n");
+		for (blk_first_device(IF_TYPE_USB, &dev);
+		     dev;
+		     blk_next_device(&dev)) {
+			desc = dev_get_uclass_platdata(dev);
+			printf("Scanning usb %d ...\n", desc->devnum);
+			if (desc->type == DEV_TYPE_UNKNOWN)
+				continue;
+
+			if (desc->lba > 0L && desc->blksz > 0L) {
+				devnum = desc->devnum;
+				break;
+			}
+		}
+		if (devnum < 0) {
+			printf("No usb mass storage found\n");
 			return -ENODEV;
 		}
 
-		if (!run_command("rkimgtest usb 0", -1)) {
+		desc = blk_get_devnum_by_type(IF_TYPE_USB, devnum);
+		if (!desc) {
+			printf("No usb %d found\n", devnum);
+			return -ENODEV;
+		}
+
+		snprintf(buf, 32, "rkimgtest usb %d", devnum);
+		if (!run_command(buf, -1)) {
+			snprintf(buf, 32, "%d", devnum);
 			rockchip_set_bootdev(desc);
 			env_set("devtype", "usb");
-			env_set("devnum", "0");
-			printf("Boot from usb 0\n");
+			env_set("devnum", buf);
+			printf("=== Booting from usb %d ===\n", devnum);
 		} else {
-			printf("No usb dev 0 found\n");
+			printf("No available udisk image on usb %d\n", devnum);
 			return -ENODEV;
 		}
 	}
@@ -358,6 +380,8 @@
 static void cmdline_handle(void)
 {
 	struct blk_desc *dev_desc;
+	int if_type;
+	int devnum;
 
 	param_parse_pubkey_fuse_programmed();
 
@@ -373,19 +397,51 @@
 	 *    rockchip_get_boot_mode() actually only read once,
 	 *    we need to update boot mode according to udisk BCB.
 	 */
-	if ((dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 1) ||
-	    (dev_desc->if_type == IF_TYPE_USB && dev_desc->devnum == 0)) {
+	if_type = dev_desc->if_type;
+	devnum = dev_desc->devnum;
+	if ((if_type == IF_TYPE_MMC && devnum == 1) || (if_type == IF_TYPE_USB)) {
 		if (get_bcb_recovery_msg() == BCB_MSG_RECOVERY_RK_FWUPDATE) {
-			if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 1) {
+			if (if_type == IF_TYPE_MMC && devnum == 1) {
 				env_update("bootargs", "sdfwupdate");
-			} else if (dev_desc->if_type == IF_TYPE_USB && dev_desc->devnum == 0) {
+			} else if (if_type == IF_TYPE_USB) {
 				env_update("bootargs", "usbfwupdate");
 				env_set("reboot_mode", "recovery-usb");
 			}
 		} else {
-			if (dev_desc->if_type == IF_TYPE_USB && dev_desc->devnum == 0)
+			if (if_type == IF_TYPE_USB)
 				env_set("reboot_mode", "normal");
 		}
+	}
+
+	if (rockchip_get_boot_mode() == BOOT_MODE_QUIESCENT)
+		env_update("bootargs", "androidboot.quiescent=1 pwm_bl.quiescent=1");
+}
+
+static void scan_run_cmd(void)
+{
+	char *config = CONFIG_ROCKCHIP_CMD;
+	char *cmd, *key;
+
+	key = strchr(config, ' ');
+	if (!key)
+		return;
+
+	cmd = strdup(config);
+	cmd[key - config] = 0;
+	key++;
+
+	if (!strcmp(key, "-")) {
+		run_command(cmd, 0);
+	} else {
+#ifdef CONFIG_DM_KEY
+		ulong map;
+
+		map = simple_strtoul(key, NULL, 10);
+		if (key_is_pressed(key_read(map))) {
+			printf("## Key<%ld> pressed... run cmd '%s'\n", map, cmd);
+			run_command(cmd, 0);
+		}
+#endif
 	}
 }
 
@@ -398,7 +454,7 @@
 	rockchip_set_serialno();
 #endif
 	setup_download_mode();
-
+	scan_run_cmd();
 #ifdef CONFIG_ROCKCHIP_USB_BOOT
 	boot_from_udisk();
 #endif
@@ -406,7 +462,8 @@
 	charge_display();
 #endif
 #ifdef CONFIG_DRM_ROCKCHIP
-	rockchip_show_logo();
+	if (rockchip_get_boot_mode() != BOOT_MODE_QUIESCENT)
+		rockchip_show_logo();
 #endif
 #ifdef CONFIG_ROCKCHIP_EINK_DISPLAY
 	rockchip_eink_show_uboot_logo();
@@ -458,57 +515,31 @@
 		printf("Cmd interface: disabled\n");
 }
 
-#if defined(CONFIG_MTD_BLK) && defined(CONFIG_USING_KERNEL_DTB)
-static void board_mtd_blk_map_partitions(void)
-{
-	struct blk_desc *dev_desc;
-
-	dev_desc = rockchip_get_bootdev();
-	if (dev_desc)
-		mtd_blk_map_partitions(dev_desc);
-}
-#endif
-
 int board_init(void)
 {
 	board_debug_init();
-	/* optee select security level */
-#ifdef CONFIG_OPTEE_CLIENT
-	trusty_select_security_level();
-#endif
-
 #ifdef DEBUG
 	soc_clk_dump();
 #endif
-
-#ifdef CONFIG_USING_KERNEL_DTB
-#ifdef CONFIG_MTD_BLK
-	board_mtd_blk_map_partitions();
+#ifdef CONFIG_OPTEE_CLIENT
+	trusty_select_security_level();
 #endif
+#ifdef CONFIG_USING_KERNEL_DTB
 	init_kernel_dtb();
 #endif
 	early_download();
 
-	/*
-	 * pmucru isn't referenced on some platforms, so pmucru driver can't
-	 * probe that the "assigned-clocks" is unused.
-	 */
 	clks_probe();
 #ifdef CONFIG_DM_REGULATOR
-	if (regulators_enable_boot_on(is_hotkey(HK_REGULATOR)))
-		debug("%s: Can't enable boot on regulator\n", __func__);
+	regulators_enable_boot_on(is_hotkey(HK_REGULATOR));
 #endif
-
 #ifdef CONFIG_ROCKCHIP_IO_DOMAIN
 	io_domain_init();
 #endif
-
 	set_armclk_rate();
-
 #ifdef CONFIG_DM_DVFS
 	dvfs_init(true);
 #endif
-
 #ifdef CONFIG_ANDROID_AB
 	if (ab_decrease_tries())
 		printf("Decrease ab tries count fail!\n");
@@ -537,6 +568,10 @@
 	/* Common fixup for DRM */
 #ifdef CONFIG_DRM_ROCKCHIP
 	rockchip_display_fixup(blob);
+#endif
+
+#ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION
+	vendor_storage_fixup(blob);
 #endif
 
 	return rk_board_fdt_fixup(blob);
@@ -603,6 +638,9 @@
 	 * But relocation is in board_quiesce_devices() until all decompress
 	 * done, mainly for saving boot time.
 	 */
+
+	orig_images_ep = images->ep;
+
 	if (data[10] == 0x00) {
 		if (round_down(images->ep, SZ_2M) != images->ep)
 			images->ep = round_down(images->ep, SZ_2M);
@@ -736,9 +774,10 @@
 	return boot_flags;
 }
 
-#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG)
-#include <fdt_support.h>
+#if defined(CONFIG_USB_GADGET)
 #include <usb.h>
+#if defined(CONFIG_USB_GADGET_DWC2_OTG)
+#include <fdt_support.h>
 #include <usb/dwc2_udc.h>
 
 static struct dwc2_plat_otg_data otg_data = {
@@ -808,7 +847,17 @@
 {
 	return 0;
 }
-#endif
+#elif defined(CONFIG_USB_DWC3_GADGET) /* CONFIG_USB_GADGET_DWC2_OTG */
+#include <dwc3-uboot.h>
+
+int board_usb_cleanup(int index, enum usb_init_type init)
+{
+	dwc3_uboot_exit(index);
+	return 0;
+}
+
+#endif /* CONFIG_USB_DWC3_GADGET */
+#endif /* CONFIG_USB_GADGET */
 
 static void bootm_no_reloc(void)
 {
@@ -1049,15 +1098,13 @@
 #endif
 #ifdef CONFIG_ARM64
 	bootm_headers_t *bootm_images = (bootm_headers_t *)images;
-	ulong kernel_addr;
 
 	/* relocate kernel after decompress cleanup */
-	kernel_addr = env_get_ulong("kernel_addr_r", 16, 0);
-	if (kernel_addr != bootm_images->ep) {
-		memmove((char *)bootm_images->ep, (const char *)kernel_addr,
+	if (orig_images_ep && orig_images_ep != bootm_images->ep) {
+		memmove((char *)bootm_images->ep, (const char *)orig_images_ep,
 			bootm_images->os.image_len);
 		printf("== DO RELOCATE == Kernel from 0x%08lx to 0x%08lx\n",
-		       kernel_addr, bootm_images->ep);
+		       orig_images_ep, bootm_images->ep);
 	}
 #endif
 
@@ -1109,16 +1156,39 @@
 #endif
 	}
 
-#ifdef CONFIG_ENVF
-	char * sys_bootargs;
+#if defined(CONFIG_ENVF) || defined(CONFIG_ENV_PARTITION)
+	char *part_type[] = { "mtdparts", "blkdevparts" };
+	char *part_list;
+	char *env;
+	int id = 0;
 
-	sys_bootargs = env_get("sys_bootargs");
-	if (sys_bootargs) {
-		env_update("bootargs", sys_bootargs);
+	env = env_get(part_type[id]);
+	if (!env)
+		env = env_get(part_type[++id]);
+	if (env) {
+		if (!strstr(env, part_type[id])) {
+			part_list = calloc(1, strlen(env) + strlen(part_type[id]) + 2);
+			if (part_list) {
+				strcat(part_list, part_type[id]);
+				strcat(part_list, "=");
+				strcat(part_list, env);
+			}
+		} else {
+			part_list = env;
+		}
+		env_update("bootargs", part_list);
 		if (dump)
-			printf("## sys_bootargs: %s\n\n", sys_bootargs);
+			printf("## parts: %s\n\n", part_list);
+	}
+
+	env = env_get("sys_bootargs");
+	if (env) {
+		env_update("bootargs", env);
+		if (dump)
+			printf("## sys_bootargs: %s\n\n", env);
 	}
 #endif
+
 #ifdef CONFIG_MTD_BLK
 	if (!env_get("mtdparts")) {
 		char *mtd_par_info = mtd_part_parse(NULL);
@@ -1129,6 +1199,10 @@
 		}
 	}
 #endif
+
+#ifdef CONFIG_ANDROID_AB
+	ab_update_root_partition();
+#endif
 	/*
 	 * Initrd fixup: remove unused "initrd=0x...,0x...",
 	 * this for compatible with legacy parameter.txt
diff --git a/u-boot/arch/arm/mach-rockchip/boot_mode.c b/u-boot/arch/arm/mach-rockchip/boot_mode.c
index 61f0e85..6f4858b 100644
--- a/u-boot/arch/arm/mach-rockchip/boot_mode.c
+++ b/u-boot/arch/arm/mach-rockchip/boot_mode.c
@@ -202,6 +202,10 @@
 			printf("boot mode: watchdog\n");
 			boot_mode[PL] = BOOT_MODE_WATCHDOG;
 			break;
+		case BOOT_QUIESCENT:
+			printf("boot mode: quiescent\n");
+			boot_mode[PL] = BOOT_MODE_QUIESCENT;
+			break;
 		default:
 			printf("boot mode: None\n");
 			boot_mode[PL] = BOOT_MODE_UNDEFINE;
diff --git a/u-boot/arch/arm/mach-rockchip/boot_rkimg.c b/u-boot/arch/arm/mach-rockchip/boot_rkimg.c
index 097d976..3e133fb 100644
--- a/u-boot/arch/arm/mach-rockchip/boot_rkimg.c
+++ b/u-boot/arch/arm/mach-rockchip/boot_rkimg.c
@@ -19,6 +19,8 @@
 #include <key.h>
 #include <mmc.h>
 #include <malloc.h>
+#include <mp_boot.h>
+#include <mtd_blk.h>
 #include <nvme.h>
 #include <scsi.h>
 #include <stdlib.h>
@@ -91,6 +93,10 @@
 
 	if (done)
 		return;
+
+#ifdef CONFIG_MP_BOOT
+	mpb_post(0);
+#endif
 
 	/* configuration */
 	if (!param_parse_assign_bootdev(&devtype, &devnum)) {
@@ -269,6 +275,9 @@
 
 	printf("PartType: %s\n", part_get_type(dev_desc));
 
+#ifdef CONFIG_MTD_BLK
+	mtd_blk_map_partitions(dev_desc);
+#endif
 	return dev_desc;
 }
 
@@ -512,7 +521,7 @@
 	LOCATE_END,
 };
 
-static int rkimg_traverse_read_dtb(void *fdt, int where)
+static int dtb_scan(void *fdt, int where)
 {
 	if (where == LOCATE_DISTRO) {
 #ifdef CONFIG_ROCKCHIP_EARLY_DISTRO_DTB
@@ -557,19 +566,13 @@
 	int locate, ret;
 	int size;
 
-	/* init resource list */
-#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
-	resource_traverse_init_list();
-#endif
-
-	/* traverse location */
 	for (locate = 0; locate < LOCATE_END; locate++) {
-		ret = rkimg_traverse_read_dtb(fdt, locate);
+		ret = dtb_scan(fdt, locate);
 		if (!ret)
 			break;
 	}
 	if (ret) {
-		printf("No find valid DTB, ret=%d\n", ret);
+		printf("No valid DTB, ret=%d\n", ret);
 		return ret;
 	}
 
@@ -608,7 +611,7 @@
 		offset = hdr->page_size + ALIGN(hdr->kernel_size, hdr->page_size) +
 			ALIGN(hdr->ramdisk_size, hdr->page_size);
 #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
-		ret = resource_create_ram_list(dev_desc, (void *)hdr + offset);
+		ret = resource_setup_ram_list(dev_desc, (void *)hdr + offset);
 		if (ret)
 			return ret;
 
@@ -650,9 +653,9 @@
 		if (!dev_desc)
 			return -ENODEV;
 
-		ret = resource_create_ram_list(dev_desc, (void *)data);
+		ret = resource_setup_ram_list(dev_desc, (void *)data);
 		if (ret) {
-			printf("resource_create_ram_list fail, ret=%d\n", ret);
+			printf("resource_setup_ram_list fail, ret=%d\n", ret);
 			return ret;
 		}
 
diff --git a/u-boot/arch/arm/mach-rockchip/chip_info.c b/u-boot/arch/arm/mach-rockchip/chip_info.c
index ee0f9a0..65667ff 100644
--- a/u-boot/arch/arm/mach-rockchip/chip_info.c
+++ b/u-boot/arch/arm/mach-rockchip/chip_info.c
@@ -63,6 +63,10 @@
 	chip_info[0] = 0x33333236;
 #elif defined(CONFIG_ROCKCHIP_PX30)
 	chip_info[0] = 0x50583330;
+#elif defined(CONFIG_ROCKCHIP_RK3528)
+	chip_info[0] = 0x33353238;
+#elif defined(CONFIG_ROCKCHIP_RK3562)
+	chip_info[0] = 0x33353632;
 #elif defined(CONFIG_ROCKCHIP_RK3568)
 	chip_info[0] = 0x33353638;
 #elif defined(CONFIG_ROCKCHIP_RK3588)
diff --git a/u-boot/arch/arm/mach-rockchip/fit.c b/u-boot/arch/arm/mach-rockchip/fit.c
index 9348c76..7c5681a 100644
--- a/u-boot/arch/arm/mach-rockchip/fit.c
+++ b/u-boot/arch/arm/mach-rockchip/fit.c
@@ -142,14 +142,14 @@
 {
 	__maybe_unused int conf_noffset;
 	disk_partition_t part;
-	char *part_name;
+	char *part_name = PART_BOOT;
 	void *fit, *fdt;
 	int blk_num;
 
+#ifndef CONFIG_ANDROID_AB
 	if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY)
 		part_name = PART_RECOVERY;
-	else
-		part_name = PART_BOOT;
+#endif
 
 	if (part_get_info_by_name(dev_desc, part_name, &part) < 0) {
 		FIT_I("No %s partition\n", part_name);
@@ -201,6 +201,7 @@
 	printf("%s: ", fdt_get_name(fit, conf_noffset, NULL));
 	if (fit_config_verify(fit, conf_noffset)) {
 		puts("\n");
+		/* don't remove this failure handle */
 		run_command("download", 0);
 		hang();
 	}
@@ -246,6 +247,7 @@
 {
 	int ret;
 
+	/* free for fit_image_fixup_alloc(FIT_FDT_PROP) to re-alloc */
 	if ((gd->flags & GD_FLG_KDTB_READY) && !gd->fdt_blob_kern)
 		sysmem_free((phys_addr_t)gd->fdt_blob);
 
@@ -404,65 +406,45 @@
 }
 
 #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
-static int fit_image_load_resource(const void *fit, struct blk_desc *dev_desc,
-				   disk_partition_t *part, ulong *addr)
+ulong fit_image_init_resource(struct blk_desc *dev_desc)
 {
-	int offset, size;
-	int ret;
-	void *data;
-
-	ret = fdt_image_get_offset_size(fit, FIT_MULTI_PROP, &offset, &size);
-	if (ret)
-		return ret;
-
-	data = malloc(ALIGN(size, dev_desc->blksz));
-	if (!data)
-		return -ENOMEM;
-
-	*addr = (ulong)data;
-
-	return fit_image_load_one(fit, dev_desc, part, FIT_MULTI_PROP,
-				  data, IS_ENABLED(CONFIG_FIT_SIGNATURE));
-}
-
-int fit_image_init_resource(void)
-{
-	struct blk_desc *dev_desc;
 	disk_partition_t part;
+	void *fit, *buf;
+	int offset, size;
 	int ret = 0;
-	void *fit;
 
-	dev_desc = rockchip_get_bootdev();
-	if (!dev_desc) {
-		FIT_I("No dev_desc!\n");
+	if (!dev_desc)
 		return -ENODEV;
-	}
 
 	fit = fit_get_blob(dev_desc, &part, true);
 	if (!fit)
+		return -EAGAIN;
+
+	ret = fdt_image_get_offset_size(fit, FIT_MULTI_PROP, &offset, &size);
+	if (ret)
 		return -EINVAL;
 
-#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
-	ulong rsce;
+	buf = memalign(ARCH_DMA_MINALIGN, ALIGN(size, dev_desc->blksz));
+	if (!buf)
+		return -ENOMEM;
 
-	ret = fit_image_load_resource(fit, dev_desc, &part, &rsce);
+	printf("RESC: '%s', blk@0x%08lx\n", part.name,
+	       part.start + ((FIT_ALIGN(fdt_totalsize(fit)) + offset) / dev_desc->blksz));
+	ret = fit_image_load_one(fit, dev_desc, &part, FIT_MULTI_PROP, buf, 1);
+	if (ret)
+		return ret;
+
+	ret = resource_setup_ram_list(dev_desc, buf);
 	if (ret) {
-		FIT_I("Failed to load resource\n");
+		FIT_I("Failed to setup resource ram list, ret=%d\n", ret);
 		free(fit);
 		return ret;
 	}
 
-	ret = resource_create_ram_list(dev_desc, (void *)rsce);
-	if (ret) {
-		FIT_I("Failed to create resource list\n");
-		free(fit);
-		return ret;
-	}
-#endif
 	fit_msg(fit);
 	free(fit);
 
-	return ret;
+	return 0;
 }
 #else
 int fit_image_read_dtb(void *fdt_addr)
diff --git a/u-boot/arch/arm/mach-rockchip/fit_args.sh b/u-boot/arch/arm/mach-rockchip/fit_args.sh
index 6f67965..d92cbf5 100755
--- a/u-boot/arch/arm/mach-rockchip/fit_args.sh
+++ b/u-boot/arch/arm/mach-rockchip/fit_args.sh
@@ -107,7 +107,9 @@
 
 # Base
 DARM_BASE=`sed -n "/CONFIG_SYS_SDRAM_BASE=/s/CONFIG_SYS_SDRAM_BASE=//p" ${srctree}/include/autoconf.mk|tr -d '\r'`
-UBOOT_LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" ${srctree}/include/autoconf.mk|tr -d '\r'`
+if ! grep -q '^CONFIG_FIT_OMIT_UBOOT=y' .config ; then
+	UBOOT_LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" ${srctree}/include/autoconf.mk|tr -d '\r'`
+fi
 
 # ARCH
 U_ARCH="arm"
diff --git a/u-boot/arch/arm/mach-rockchip/fit_misc.c b/u-boot/arch/arm/mach-rockchip/fit_misc.c
index a279f5f..d3a2ad5 100644
--- a/u-boot/arch/arm/mach-rockchip/fit_misc.c
+++ b/u-boot/arch/arm/mach-rockchip/fit_misc.c
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <boot_rkimg.h>
+#include <malloc.h>
 #include <misc.h>
 #ifdef CONFIG_SPL_BUILD
 #include <spl.h>
@@ -25,7 +26,7 @@
 #if CONFIG_IS_ENABLED(FIT_IMAGE_POST_PROCESS)
 
 #define FIT_UNCOMP_HASH_NODENAME	"digest"
-#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP)
+#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP) || CONFIG_IS_ENABLED(LZMA)
 static int fit_image_get_uncomp_digest(const void *fit, int parent_noffset)
 {
 	const char *name;
@@ -126,8 +127,10 @@
 		else
 			misc_decompress_sync(comp);
 #else
+#if CONFIG_IS_ENABLED(GZIP)
 		ret = gunzip((void *)(*load_addr), ALIGN(len, FIT_MAX_SPL_IMAGE_SZ),
 			     (void *)(*src_addr), (void *)(&len));
+#endif
 #endif
 	}
 
@@ -154,7 +157,7 @@
 void board_fit_image_post_process(void *fit, int node, ulong *load_addr,
 				  ulong **src_addr, size_t *src_len, void *spec)
 {
-#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP)
+#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP) || CONFIG_IS_ENABLED(LZMA)
 	fit_decomp_image(fit, node, load_addr, src_addr, src_len, spec);
 #endif
 
@@ -169,6 +172,33 @@
 		}
 	}
 #endif
+
+#ifndef CONFIG_SPL_BUILD
+	if (fit_image_check_type(fit, node, IH_TYPE_FIRMWARE)) {
+		const char *uname;
+		char *old, *new;
+		size_t len;
+
+		uname = fdt_get_name(fit, node, NULL);
+		if (strcmp("bootargs", uname))
+			return;
+
+		old = env_get("bootargs");
+		if (!old)
+			return;
+
+		len = strlen(old) + (*src_len) + 2;
+		new = calloc(1, len);
+		if (new) {
+			strcpy(new, old);
+			strcat(new, " ");
+			strcat(new, (char *)(*src_addr));
+			env_set("bootargs", new);
+			free(new);
+		}
+
+	}
+#endif
 }
 #endif /* FIT_IMAGE_POST_PROCESS */
 /*
diff --git a/u-boot/arch/arm/mach-rockchip/fit_nodes.sh b/u-boot/arch/arm/mach-rockchip/fit_nodes.sh
index be7d46d..4d39ea0 100755
--- a/u-boot/arch/arm/mach-rockchip/fit_nodes.sh
+++ b/u-boot/arch/arm/mach-rockchip/fit_nodes.sh
@@ -27,6 +27,10 @@
 # nodes
 function gen_uboot_node()
 {
+	if [ -z ${UBOOT_LOAD_ADDR} ]; then
+		return
+	fi
+
 	UBOOT="u-boot-nodtb.bin"
 	echo "		uboot {
 			description = \"U-Boot\";
@@ -53,10 +57,16 @@
 				algo = \"sha256\";
 			};
 		};"
+
+	LOADABLE_UBOOT="\"uboot\", "
 }
 
 function gen_fdt_node()
 {
+	if [ -z ${UBOOT_LOAD_ADDR} ]; then
+		return
+	fi
+
 	echo "		fdt {
 			description = \"U-Boot dtb\";
 			data = /incbin/(\"./u-boot.dtb\");
@@ -67,12 +77,19 @@
 				algo = \"sha256\";
 			};
 		};"
+
+	FDT_SIGN=", \"fdt\""
+	FDT="fdt = \"fdt\"${PROP_KERN_DTB};"
 };
 
 function gen_kfdt_node()
 {
+	if [ -z ${UBOOT_LOAD_ADDR} ]; then
+		return
+	fi
+
 	KERN_DTB=`sed -n "/CONFIG_EMBED_KERNEL_DTB_PATH=/s/CONFIG_EMBED_KERNEL_DTB_PATH=//p" .config | tr -d '"'`
-	if [ -z "${KERN_DTB}" ]; then
+	if [ -z ${KERN_DTB} ]; then
 		return;
 	fi
 
@@ -96,7 +113,7 @@
 	${srctree}/arch/arm/mach-rockchip/decode_bl31.py
 
 	NUM=1
-	for ATF in `ls -l bl31_0x*.bin | sort --key=5 -nr | awk '{ print $9 }'`
+	for ATF in `ls -1 -S bl31_0x*.bin`
 	do
 		ATF_LOAD_ADDR=`echo ${ATF} | awk -F "_" '{ printf $2 }' | awk -F "." '{ printf $1 }'`
 		# only atf-1 support compress
@@ -135,7 +152,9 @@
 		};"
 		fi
 
-		if [ ${NUM} -gt 1 ]; then
+		if [ ${NUM} -eq 2 ]; then
+			LOADABLE_ATF=${LOADABLE_ATF}"\"atf-${NUM}\""
+		elif [ ${NUM} -gt 2 ]; then
 			LOADABLE_ATF=${LOADABLE_ATF}", \"atf-${NUM}\""
 		fi
 		NUM=`expr ${NUM} + 1`
@@ -152,6 +171,12 @@
 		# If not AArch32 mode
 		if ! grep  -q '^CONFIG_ARM64_BOOT_AARCH32=y' .config ; then
 			ENTRY="entry = <"${TEE_LOAD_ADDR}">;"
+
+			# if disable packing tee.bin
+			if ! grep -q '^CONFIG_SPL_OPTEE=y' .config ; then
+				return
+			fi
+
 		fi
 	fi
 
@@ -179,7 +204,7 @@
 		};"
 	LOADABLE_OPTEE=", \"optee\""
 	FIRMWARE_OPTEE="firmware = \"optee\";"
-	FIRMWARE_SIGN=", \"firmware\""
+	FIRMWARE_SIGN="\"firmware\""
 }
 
 function gen_mcu_node()
@@ -314,8 +339,13 @@
 function gen_arm64_configurations()
 {
 PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'`
-if grep  -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
+if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
 	ALGO_PADDING="				padding = \"pss\";"
+fi
+if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then
+	ALGO_NAME="				algo = \"sha256,rsa4096\";"
+else
+	ALGO_NAME="				algo = \"sha256,rsa2048\";"
 fi
 echo "	};
 
@@ -325,14 +355,14 @@
 			description = \"${PLATFORM}\";
 			rollback-index = <0x0>;
 			firmware = \"atf-1\";
-			loadables = \"uboot\"${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER};
+			loadables = ${LOADABLE_UBOOT}${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER};
 			${STANDALONE_MCU}
-			fdt = \"fdt\"${PROP_KERN_DTB};
+			${FDT}
 			signature {
-				algo = \"sha256,rsa2048\";
+				${ALGO_NAME}
 				${ALGO_PADDING}
 				key-name-hint = \"dev\";
-				sign-images = \"fdt\", \"firmware\", \"loadables\"${STANDALONE_SIGN};
+				sign-images = \"firmware\", \"loadables\"${FDT_SIGN}${STANDALONE_SIGN};
 			};
 		};
 	};
@@ -343,9 +373,24 @@
 function gen_arm_configurations()
 {
 PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'`
-if grep  -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
+if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
         ALGO_PADDING="                          padding = \"pss\";"
 fi
+if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then
+	ALGO_NAME="				algo = \"sha256,rsa4096\";"
+else
+	ALGO_NAME="				algo = \"sha256,rsa2048\";"
+fi
+if [ ! -z "${LOADABLE_UBOOT}" ] || [ ! -z "${LOADABLE_OTHER}" ]; then
+	LOADABLE_UBOOT="\"uboot\""
+	LOADABLES="loadables = ${LOADABLE_UBOOT}${LOADABLE_OTHER};"
+	if [ -z ${FIRMWARE_SIGN} ]; then
+		LOADABLES_SIGN="\"loadables\""
+	else
+		LOADABLES_SIGN=", \"loadables\""
+	fi
+fi
+
 echo "	};
 
 	configurations {
@@ -354,14 +399,14 @@
 			description = \"${PLATFORM}\";
 			rollback-index = <0x0>;
 			${FIRMWARE_OPTEE}
-			loadables = \"uboot\"${LOADABLE_OTHER};
+			${LOADABLES}
 			${STANDALONE_MCU}
-			fdt = \"fdt\"${PROP_KERN_DTB};
+			${FDT}
 			signature {
-				algo = \"sha256,rsa2048\";
+				${ALGO_NAME}
 				${ALGO_PADDING}
 				key-name-hint = \"dev\";
-				sign-images = \"fdt\", \"loadables\"${FIRMWARE_SIGN}${STANDALONE_SIGN};
+				sign-images = ${FIRMWARE_SIGN}${LOADABLES_SIGN}${FDT_SIGN}${STANDALONE_SIGN};
 			};
 		};
 	};
diff --git a/u-boot/arch/arm/mach-rockchip/hotkey.c b/u-boot/arch/arm/mach-rockchip/hotkey.c
index 37a03df..446547c 100644
--- a/u-boot/arch/arm/mach-rockchip/hotkey.c
+++ b/u-boot/arch/arm/mach-rockchip/hotkey.c
@@ -17,10 +17,10 @@
 #define CTRL_D		0x04	/* download mde */
 #define CTRL_F		0x06	/* fastboot mode */
 #define CTRL_I		0x09	/* inicall debug for kernel */
+#define CTRL_L		0x0c	/* late shell(cli) on BOOTM_STATE_OS_GO */
 #define CTRL_M		0x0d	/* memory(sysmem/bidram) */
 #define CTRL_P		0x10	/* parameter(cmdline) dump */
 #define CTRL_R		0x12	/* regulator initial state dump */
-#define CTRL_S		0x13	/* shell(cli) on BOOTM_STATE_OS_GO */
 #define CTRL_T		0x14	/* print fdt */
 
 bool is_hotkey(enum hotkey_t id)
@@ -75,7 +75,7 @@
 			cli_loop();
 		break;
 	case HK_CLI_OS_GO:
-		if (gd->console_evt == CTRL_S)
+		if (gd->console_evt == CTRL_L)
 			cli_loop();
 		break;
 	default:
diff --git a/u-boot/arch/arm/mach-rockchip/kernel_dtb.c b/u-boot/arch/arm/mach-rockchip/kernel_dtb.c
old mode 100755
new mode 100644
index 74da167..05e734f
--- a/u-boot/arch/arm/mach-rockchip/kernel_dtb.c
+++ b/u-boot/arch/arm/mach-rockchip/kernel_dtb.c
@@ -16,503 +16,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-
-#if 1
-struct display_fixup_data {
-	int type;
-
-	int delay_prepare;
-	int delay_enable;
-	int delay_disable;
-	int delay_unprepare;
-	int delay_reset;
-	int delay_init;
-	int size_width;
-	int size_height;
-
-	int clock_frequency;
-	int hactive;
-	int hfront_porch;
-	int hsync_len;
-	int hback_porch;
-	int vactive;
-	int vfront_porch;
-	int vsync_len;
-	int vback_porch;
-	int hsync_active;
-	int vsync_active;
-	int de_active;
-	int pixelclk_active;
-
-	/* for DSI Panel */
-	int flags;
-	int format;
-	int lanes;
-	int init_cmd_length;
-	u8 *init_cmd;
-	
-	int nodka_lvds;
-};
-enum {
-	PANEL_TYPE_DSI,
-	PANEL_TYPE_EDP,
-	PANEL_TYPE_LVDS,
-};
-
-#define CUSTOM_PARTITION_NAME	"baseparameter"
-#define LCD_PARAM_MAX_COUNT	27
-
-int lcdParam[LCD_PARAM_MAX_COUNT];
-char param_buf_temp[4*1024] = {0};
-
-void set_lcdparam_test_edp(struct display_fixup_data *data)
-{
-
-	data->type = PANEL_TYPE_DSI; 
-	data->delay_prepare = 100;
-	data->delay_enable = 100;
-	data->delay_disable = 100;
-	data->delay_unprepare = 100;
-	data->delay_reset = 100;
-	data->delay_init = 100;
-	data->size_width = 240;
-	data->size_height = 300;
-	data->clock_frequency = 60000000;
-	data->hactive = 1024;
-	data->hfront_porch = 12;
-	data->hsync_len = 16;
-	data->hback_porch = 48;
-	data->vactive = 600;
-	data->vfront_porch = 8;
-	data->vsync_len = 4;
-	data->vback_porch = 8;
-	data->hsync_active = 0;
-	data->vsync_active = 0;
-	data->de_active = 0;
-	data->pixelclk_active = 0;
-	data->flags = 0;
-	data->format = 0;
-	data->lanes = 4;
-	*(data->init_cmd  + 0) = 0x05; 
-	*(data->init_cmd  + 1) = 0x00; 
-	*(data->init_cmd  + 2) = 0x01; 
-	*(data->init_cmd  + 3) = 0x01; 
-
-	*(data->init_cmd  + 4) = 0x05; 
-	*(data->init_cmd  + 5) = 0x00; 
-	*(data->init_cmd  + 6) = 0x01; 
-	*(data->init_cmd  + 7) = 0x02; 
-
-	*(data->init_cmd  + 8) = 0x05; 
-	*(data->init_cmd  + 9) = 0x00; 
-	*(data->init_cmd  + 10) = 0x01; 
-	*(data->init_cmd  + 11) = 0x03; 
-
-	*(data->init_cmd  + 12) = 0x05; 
-	*(data->init_cmd  + 13) = 0x00; 
-	*(data->init_cmd  + 14) = 0x01; 
-	*(data->init_cmd  + 15) = 0x05; 
-
-}
-
-int get_lcdparam_info_from_custom_partition(struct display_fixup_data *data)
-{
-	
-	struct blk_desc *dev_desc;
-	disk_partition_t part_info;
-	char *boot_partname = CUSTOM_PARTITION_NAME;
-  int ret,i;
-  
-  dev_desc = rockchip_get_bootdev();
-  if (!dev_desc) {
-          printf("%s: dev_desc is NULL!\n", __func__);
-          return -ENODEV;
-  }
-
-  ret = part_get_info_by_name(dev_desc, boot_partname, &part_info);
-  if (ret < 0) {
-      printf("%s: failed to get %s part, ret=%d\n",
-             __func__, boot_partname, ret);
-      /* RKIMG can support part table without 'boot' */
-      return -1;
-  }
-  
-  printf("block num: %lu, name %s ,type %s,block size :%lu\n",part_info.size,part_info.name,part_info.type,part_info.blksz);
-
-  ret = blk_dread(dev_desc, part_info.start + 512, 1, param_buf_temp);
-  if (ret != 1) {
-      printf("%s: failed to read screen parameter, ret=%d\n",
-             __func__, ret);
-      return -1;
-  }
-
-	for (i = 0; i < LCD_PARAM_MAX_COUNT; i++) {
-		lcdParam[i] = param_buf_temp[i * 4];
-		lcdParam[i] =  (lcdParam[i] << 8) + param_buf_temp[i * 4 + 1];
-		lcdParam[i] =  (lcdParam[i] << 8) + param_buf_temp[i * 4 + 2];
-		lcdParam[i] =  (lcdParam[i] << 8) + param_buf_temp[i * 4 + 3];
-		if(lcdParam[i] < 0){
-			lcdParam[i] = -lcdParam[i];
-		}
-		if(lcdParam[i] > 100000 && i != 9){
-			lcdParam[i] = 0;
-		}
-		printf("--get-- lcd_param %d\n",lcdParam[i]);
-	}
-
-  if(lcdParam[14] == 0 || lcdParam[10] == 0){
-  	 return -1;
-  	}
-	printf("-get- crc32 = 0X%02X%02X%02X%02X\n",
-	       param_buf_temp[LCD_PARAM_MAX_COUNT * 4], param_buf_temp[LCD_PARAM_MAX_COUNT * 4 + 1],
-	       param_buf_temp[LCD_PARAM_MAX_COUNT * 4 + 2], param_buf_temp[LCD_PARAM_MAX_COUNT * 4 + 3]);
-
-	data->type = lcdParam[0]; 
-	data->delay_prepare = lcdParam[4];
-	data->delay_enable = lcdParam[2];
-	data->delay_disable = lcdParam[3];
-	data->delay_unprepare = lcdParam[1];
-	data->delay_reset = lcdParam[5];
-	data->delay_init = lcdParam[6];
-	data->size_width = lcdParam[7];
-	data->size_height = lcdParam[8];
-	data->clock_frequency = lcdParam[9];
-	data->hactive = lcdParam[10];
-	data->hfront_porch = lcdParam[11];
-	data->hsync_len = lcdParam[12];
-	data->hback_porch = lcdParam[13];
-	data->vactive = lcdParam[14];
-	data->vfront_porch = lcdParam[15];
-	data->vsync_len = lcdParam[16];
-	data->vback_porch = lcdParam[17];
-	data->hsync_active = lcdParam[18];
-	data->vsync_active = lcdParam[19];
-	data->de_active = lcdParam[20];
-	data->pixelclk_active = lcdParam[21];
-	data->flags = lcdParam[22];
-	data->format = lcdParam[23];
-	data->lanes = lcdParam[24];
-	data->init_cmd_length = lcdParam[25] = 16;
-	data->nodka_lvds = lcdParam[26];
-    data->init_cmd =  malloc(sizeof(*(data->init_cmd)) * data->init_cmd_length);
-    for(i = 0; i < data->init_cmd_length; i++){
-       *(data->init_cmd + i) = param_buf_temp[100 + i];
-     //  printf("init cmd = %x\n",param_buf_temp[100 + i]);
-	   
-	}
-	
-//	set_lcdparam_test_edp(data);
-
-	return 0;
-}
-
-#endif
-
-
-static int find_connector_node(const void *blob, int node)
-{
-	int phandle, remote;
-	int nodedepth;
-
-	phandle = fdt_getprop_u32_default_node(blob, node, 0,
-					       "remote-endpoint", -1);
-	remote = fdt_node_offset_by_phandle(blob, phandle);
-	nodedepth = fdt_node_depth(blob, remote);
-
-	return fdt_supernode_atdepth_offset(blob, remote,
-					    nodedepth - 3, NULL);
-}
-
-static int get_panel_node(const void *blob, int conn_node)
-{
-	int panel, ports, port, ep, remote, ph, nodedepth;
-	
-	panel = fdt_subnode_offset(blob, conn_node, "panel");
-		printf("panel_1=%d\n",panel);
-	if (panel > 0) {
-		return panel;
-	}
-
-	ports = fdt_subnode_offset(blob, conn_node, "ports");
-	if (ports < 0)
-	{
-		return -ENODEV;
-	}
-
-	fdt_for_each_subnode(port, blob, ports) {
-		fdt_for_each_subnode(ep, blob, port) {
-			ph = fdt_getprop_u32_default_node(blob, ep, 0,
-							  "remote-endpoint", 0);
-			if (!ph)
-				continue;
-
-			remote = fdt_node_offset_by_phandle(blob, ph);
-
-			nodedepth = fdt_node_depth(blob, remote);
-			if (nodedepth < 2)
-				continue;
-
-			panel = fdt_supernode_atdepth_offset(blob, remote,
-							     nodedepth - 2,
-							     NULL);
-			break;
-		}
-	}
-	printf("panel_2=%d\n",panel);
-	return panel;
-}
-
-static int fdt_fixup_node_status(void *blob, int node, enum fdt_status status)
-{
-	int ret;
-
-//	printf("My fixup %s %d\n", fdt_get_name(blob, node, NULL), status);
-
-set_status:
-	ret = fdt_set_node_status(blob, node, status, 0);
-	if (ret == -FDT_ERR_NOSPACE) {
-		ret = fdt_increase_size(blob, 512);
-		if (!ret)
-			goto set_status;
-		else
-			goto err_size;
-	} else if (ret < 0) {
-		printf("Can't set node status: %s\n", fdt_strerror(ret));
-		return ret;
-	}
-
-	return 0;
-
-err_size:
-	printf("Can't increase blob size: %s\n", fdt_strerror(ret));
-	return ret;
-}
-#if 0
-static int fdt_fixup_panel_init_sequence(void *fdt, int node,const struct display_fixup_data *data)
-{
-   #if 0
-	u8 init_buf[] = {0x05, 0x00, 0x01, 0x78, 0x15, 0x01, 0x02, 0x03, 0x04, 0x05, 0x05, 0x01, 0x14,0x39, 0x01, 0x03, 0x02, 0x29, 0x11};
-	u8 exit_buf[] = {0x05, 0x64, 0x01, 0x29, 0x05, 0x64, 0x01, 0x11};
-	#endif
-	int ret;
-
-add_seq:
-	ret = fdt_setprop(fdt, node, "panel-init-sequence", data->init_cmd, data->init_cmd_length);
-	if (ret == -FDT_ERR_NOSPACE) {
-		printf(" init sequence FDT_ERR_NOSPACE\n");
-		ret = fdt_increase_size(fdt, data->init_cmd_length * 4);//gln the length needs precision
-		if (!ret)
-			goto add_seq;
-		else
-			goto err_size;
-	} else if (ret < 0) {
-		printf("Can't add property: %s\n", fdt_strerror(ret));
-		return ret;
-	}
-
-#if 0
-add_init_seq:
-	ret = fdt_setprop(fdt, node, "panel-init-sequence", init_buf, sizeof(init_buf));
-	if (ret == -FDT_ERR_NOSPACE) {
-		printf(" init sequence FDT_ERR_NOSPACE\n");
-		ret = fdt_increase_size(fdt, 512);//gln the length needs precision
-		if (!ret)
-			goto add_init_seq;
-		else
-			goto err_size;
-	} else if (ret < 0) {
-		printf("Can't add property: %s\n", fdt_strerror(ret));
-		return ret;
-	}
-add_exit_seq:
-	ret = fdt_setprop(fdt, node, "panel-exit-sequence", exit_buf, sizeof(exit_buf));
-	if (ret == -FDT_ERR_NOSPACE) {
-		printf(" init sequence FDT_ERR_NOSPACE\n");
-		ret = fdt_increase_size(fdt, 512);//gln the length needs precision
-		if (!ret)
-			goto add_exit_seq;
-		else
-			goto err_size;
-	} else if (ret < 0) {
-		printf("Can't add property: %s\n", fdt_strerror(ret));
-		return ret;
-	}
-#endif
-
-	return 0;
-
-err_size:
-	printf("Can't increase blob size: %s\n", fdt_strerror(ret));
-	return ret;
-}
-#endif
-
-static int fdt_fixup_setprop_u32(void *fdt, int node, const char *name, u32 data)
-{
-	int ret;
-
-set_prop:
-	ret = fdt_setprop_u32(fdt, node, name, data);
-	if (ret == -FDT_ERR_NOSPACE) {
-		ret = fdt_increase_size(fdt, 512);
-		if (!ret)
-			goto set_prop;
-		else
-			goto err_size;
-	} else if (ret < 0) {
-		printf("Can't add property: %s\n", fdt_strerror(ret));
-		return ret;
-	}
-
-	return 0;
-
-err_size:
-	printf("Can't increase blob size: %s\n", fdt_strerror(ret));
-	return ret;
-}
-
-static void fdt_fixup_display_timing(void *blob, int node,
-				     const struct display_fixup_data *data)
-{
-	fdt_fixup_setprop_u32(blob, node, "clock-frequency", data->clock_frequency);
-	fdt_fixup_setprop_u32(blob, node, "hactive", data->hactive);
-	fdt_fixup_setprop_u32(blob, node, "hfront-porch", data->hfront_porch);
-	fdt_fixup_setprop_u32(blob, node, "hsync-len", data->hsync_len);
-	fdt_fixup_setprop_u32(blob, node, "hback-porch", data->hback_porch);
-	fdt_fixup_setprop_u32(blob, node, "vactive", data->vactive);
-	fdt_fixup_setprop_u32(blob, node, "vfront-porch", data->vfront_porch);
-	fdt_fixup_setprop_u32(blob, node, "vsync-len", data->vsync_len);
-	fdt_fixup_setprop_u32(blob, node, "vback-porch", data->vback_porch);
-	fdt_fixup_setprop_u32(blob, node, "hsync-active", data->hsync_active);
-	fdt_fixup_setprop_u32(blob, node, "vsync-active", data->vsync_active);
-	fdt_fixup_setprop_u32(blob, node, "de-active", data->de_active);
-	fdt_fixup_setprop_u32(blob, node, "pixelclk-active", data->pixelclk_active);
-}
-
-static void fdt_fixup_panel_node(void *blob, int node, const char *name,
-				 const struct display_fixup_data *data)
-{
-/*
-	if (!strcmp(name, "dsi")) {
-		fdt_setprop_u32(blob, node, "dsi,flags", data->flags);
-		fdt_setprop_u32(blob, node, "dsi,format", data->format);
-		fdt_setprop_u32(blob, node, "dsi,lanes", data->lanes);
-		fdt_fixup_panel_init_sequence(blob, node,data);
-	}
-*/
-	fdt_fixup_setprop_u32(blob, node, "prepare-delay-ms", data->delay_prepare);
-	fdt_fixup_setprop_u32(blob, node, "enable-delay-ms", data->delay_enable);
-	fdt_fixup_setprop_u32(blob, node, "disable-delay-ms", data->delay_disable);
-	fdt_fixup_setprop_u32(blob, node, "unprepare-delay-ms", data->delay_unprepare);
-	fdt_fixup_setprop_u32(blob, node, "reset-delay-ms", data->delay_reset);
-	fdt_fixup_setprop_u32(blob, node, "init-delay-ms", data->delay_init);
-	fdt_fixup_setprop_u32(blob, node, "width-mm", data->size_width);
-	fdt_fixup_setprop_u32(blob, node, "height-mm", data->size_height);
-	
-}
-static void fdt_fixup_nodka_lvds(void *blob, int node,
-				     const struct display_fixup_data *data)
-{
-	if ( data->nodka_lvds != 0 )
-		fdt_fixup_setprop_u32(blob, node, "nodka-lvds", data->nodka_lvds);
-}
-
-
-static int fdt_fixup_display_sub_route(void *blob, const char *name,
-				       enum fdt_status status,
-				       const struct display_fixup_data *data)
-{
-	int route, phandle, connect, connector, panel, dt, timing, route_lvds;
-	char path[64];
-	char path_lvds[16] = "/panel";
-	int ret;
-	sprintf(path, "/display-subsystem/route/route-%s", name);
-	
-	
-	route = fdt_path_offset(blob, path);
-	printf("route : %d \n",route);
-	if (route < 0)
-		return route;
-	
-	route_lvds = fdt_path_offset(blob, path_lvds);
-	if (route_lvds < 0)
-	{
-		printf("can not get route_lvds = %d\n",route_lvds);
-		return route_lvds;
-	}
-	/* fixup lvds gpio channel*/
-	fdt_fixup_nodka_lvds(blob, route_lvds, data);
-	
-	/* fixup route status */
-	ret = fdt_fixup_node_status(blob, route, status);
-	if (ret < 0)
-		return ret;
-	phandle = fdt_getprop_u32_default_node(blob, route, 0, "connect", -1);
-	if (phandle < 0)
-		return phandle;
-	connect = fdt_node_offset_by_phandle(blob, phandle);
-	if (connect < 0)
-		return connect;
-	connector = find_connector_node(blob, connect);
-	if (connector < 0)
-		return connector;
-	/* fixup connector status */
-	ret = fdt_fixup_node_status(blob, connector, status);
-	if (ret < 0)
-		return ret;
-	if (status != FDT_STATUS_OKAY) {
-		return 0;
-	}
-	panel = get_panel_node(blob, connector);
-	if (panel < 0)
-		return panel;
-	/* fixup panel info */
-	fdt_fixup_panel_node(blob, panel, name, data);	
-	dt = fdt_subnode_offset(blob, panel, "display-timings");
-	if (dt < 0) {
-		return dt;
-	}
-	timing = fdt_subnode_offset(blob, dt, "timing");
-	if (timing < 0) {
-		phandle = fdt_getprop_u32_default_node(blob, dt, 0, "native-mode", -1);
-		if (phandle < 0)
-			return phandle;
-
-		timing = fdt_node_offset_by_phandle(blob, phandle);
-		if (timing < 0)
-			return timing;
-	}
-
-	/* fixup panel display timing */
-	fdt_fixup_display_timing(blob, timing, data);
-	return 0;
-}
-
-static void fdt_fixup_display_route(void *blob, const struct display_fixup_data *data)
-{
-	if (data->type == PANEL_TYPE_DSI) {
-		fdt_fixup_display_sub_route(blob, "dsi1", FDT_STATUS_OKAY, data);
-		fdt_fixup_display_sub_route(blob, "edp", FDT_STATUS_DISABLED, data);
-		fdt_fixup_display_sub_route(blob, "lvds", FDT_STATUS_DISABLED, data);
-	} else if (data->type == PANEL_TYPE_EDP) {
-		fdt_fixup_display_sub_route(blob, "dsi1", FDT_STATUS_DISABLED, data);
-		fdt_fixup_display_sub_route(blob, "edp", FDT_STATUS_OKAY, data);
-		fdt_fixup_display_sub_route(blob, "lvds", FDT_STATUS_DISABLED, data);
-	} else if (data->type == PANEL_TYPE_LVDS) {
-		fdt_fixup_display_sub_route(blob, "lvds", FDT_STATUS_OKAY, data);
-	  	fdt_fixup_display_sub_route(blob, "dsi1", FDT_STATUS_DISABLED, data);
-		fdt_fixup_display_sub_route(blob, "edp", FDT_STATUS_DISABLED, data);
-	}
-}
-
-
-
-
-
-
-
-
-
 #ifdef CONFIG_USING_KERNEL_DTB_V2
 static int dm_rm_kernel_dev(void)
 {
@@ -798,7 +301,6 @@
 #endif
 	ulong fdt_addr = 0;
 	int ret = -ENODEV;
-	struct display_fixup_data fix_data;
 
 	printf("DM: v%d\n", IS_ENABLED(CONFIG_USING_KERNEL_DTB_V2) ? 2 : 1);
 
@@ -815,12 +317,10 @@
 		return -ENODEV;
 	}
 
-	if (IS_ENABLED(CONFIG_EMBED_KERNEL_DTB_ALWAYS)) {
-		resource_init_list();
-		printf("Always embed kernel dtb\n");
-		goto dtb_embed;
-	}
-
+#ifdef CONFIG_EMBED_KERNEL_DTB_ALWAYS
+	printf("Always embed kernel dtb\n");
+	goto dtb_embed;
+#endif
 	ret = rockchip_read_dtb_file((void *)fdt_addr);
 	if (!ret) {
 		if (!dtb_check_ok((void *)fdt_addr, (void *)gd->fdt_blob)) {
@@ -831,7 +331,10 @@
 		}
 	}
 
+#ifdef CONFIG_EMBED_KERNEL_DTB
+#ifdef CONFIG_EMBED_KERNEL_DTB_ALWAYS
 dtb_embed:
+#endif
 	if (gd->fdt_blob_kern) {
 		if (!dtb_check_ok((void *)gd->fdt_blob_kern, (void *)gd->fdt_blob)) {
 			printf("Embedded kernel dtb mismatch this platform!\n");
@@ -850,7 +353,9 @@
 		memcpy((void *)fdt_addr, gd->fdt_blob_kern,
 		       fdt_totalsize(gd->fdt_blob_kern));
 		printf("DTB: %s\n", CONFIG_EMBED_KERNEL_DTB_PATH);
-	} else {
+	} else
+#endif
+	{
 		printf("Failed to get kernel dtb, ret=%d\n", ret);
 		return -ENOENT;
 	}
@@ -870,8 +375,6 @@
 	phandles_fixup_cru((void *)gd->fdt_blob);
 	phandles_fixup_gpio((void *)gd->fdt_blob, (void *)ufdt_blob);
 #endif
-	if (!get_lcdparam_info_from_custom_partition(&fix_data))
-				fdt_fixup_display_route((void *)fdt_addr, &fix_data);
 
 	gd->flags |= GD_FLG_KDTB_READY;
 	gd->of_root_f = gd->of_root;
diff --git a/u-boot/arch/arm/mach-rockchip/make_fit_uboot.sh b/u-boot/arch/arm/mach-rockchip/make_fit_uboot.sh
deleted file mode 100755
index f7ca5e2..0000000
--- a/u-boot/arch/arm/mach-rockchip/make_fit_uboot.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2022 Rockchip Electronics Co., Ltd
-#
-# SPDX-License-Identifier:     GPL-2.0+
-#
-
-source ./${srctree}/arch/arm/mach-rockchip/fit_nodes.sh
-gen_header
-gen_uboot_node
-gen_mcu_node
-gen_kfdt_node
-gen_fdt_node
-gen_loadable_node
-gen_arm_configurations
-
diff --git a/u-boot/arch/arm/mach-rockchip/pstore.c b/u-boot/arch/arm/mach-rockchip/pstore.c
index 6fc371f..18e452c 100644
--- a/u-boot/arch/arm/mach-rockchip/pstore.c
+++ b/u-boot/arch/arm/mach-rockchip/pstore.c
@@ -103,6 +103,8 @@
 		gd->pstore_addr = t->u.pstore.buf[LOG_UBOOT].addr;
 		gd->pstore_size = t->u.pstore.buf[LOG_UBOOT].size - sizeof(struct persistent_ram_buffer);
 	}
+#elif (CONFIG_PERSISTENT_RAM_ADDR == 0 || CONFIG_PERSISTENT_RAM_SIZE == 0)
+	#error: CONFIG_PERSISTENT_RAM_SIZE and CONFIG_PERSISTENT_RAM_ADDR value should not be 0.
 #else
 	gd->pstore_addr = CONFIG_PERSISTENT_RAM_ADDR;
 	gd->pstore_size = CONFIG_PERSISTENT_RAM_SIZE - sizeof(struct persistent_ram_buffer);
diff --git a/u-boot/arch/arm/mach-rockchip/resource_hwid.c b/u-boot/arch/arm/mach-rockchip/resource_hwid.c
index 200160b..81e9b20 100644
--- a/u-boot/arch/arm/mach-rockchip/resource_hwid.c
+++ b/u-boot/arch/arm/mach-rockchip/resource_hwid.c
@@ -267,13 +267,8 @@
 
 	hwid_init_data();
 
-	if (list_empty(&entrys_head)) {
-		if (resource_init_list())
-			return NULL;
-	}
-
-	list_for_each(node, &entrys_dtbs_head) {
-		file = list_entry(node, struct resource_file, dtbs);
+	list_for_each(node, &entry_head) {
+		file = list_entry(node, struct resource_file, link);
 		if (!strstr(file->name, DTB_SUFFIX))
 			continue;
 
diff --git a/u-boot/arch/arm/mach-rockchip/resource_img.c b/u-boot/arch/arm/mach-rockchip/resource_img.c
index 03557d7..c2f0989 100644
--- a/u-boot/arch/arm/mach-rockchip/resource_img.c
+++ b/u-boot/arch/arm/mach-rockchip/resource_img.c
@@ -4,28 +4,21 @@
  * SPDX-License-Identifier:     GPL-2.0+
  */
 #include <common.h>
-#include <adc.h>
-#include <android_ab.h>
-#include <android_bootloader.h>
-#include <android_image.h>
 #include <boot_rkimg.h>
 #include <bmp_layout.h>
 #include <malloc.h>
-#include <asm/io.h>
 #include <asm/unaligned.h>
-#include <dm/ofnode.h>
+#include <linux/libfdt.h>
 #include <linux/list.h>
-#include <asm/arch/fit.h>
-#include <asm/arch/uimage.h>
 #include <asm/arch/resource_img.h>
+#include <asm/arch/uimage.h>
+#include <asm/arch/fit.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 #define PART_RESOURCE			"resource"
 #define RESOURCE_MAGIC			"RSCE"
 #define RESOURCE_MAGIC_SIZE		4
-#define RESOURCE_VERSION		0
-#define CONTENT_VERSION			0
 #define ENTRY_TAG			"ENTR"
 #define ENTRY_TAG_SIZE			4
 #define MAX_FILE_NAME_LEN		220
@@ -70,7 +63,7 @@
  */
 
 /**
- * struct resource_image_header
+ * struct resource_img_hdr
  *
  * @magic: should be "RSCE"
  * @version: resource image version, current is 0
@@ -80,7 +73,6 @@
  * @e_blks: the size(by block) of the entry in the contents
  * @e_num: numbers of the entrys.
  */
-
 struct resource_img_hdr {
 	char		magic[4];
 	uint16_t	version;
@@ -96,499 +88,406 @@
 	char		name[MAX_FILE_NAME_LEN];
 	char		hash[MAX_HASH_LEN];
 	uint32_t	hash_size;
-	uint32_t	f_offset;	/* Sector offset */
-	uint32_t	f_size;		/* Bytes */
+	uint32_t	blk_offset;
+	uint32_t	size;		/* in byte */
 };
 
-LIST_HEAD(entrys_head);
-LIST_HEAD(entrys_dtbs_head);
+LIST_HEAD(entry_head);
 
-__weak int board_resource_dtb_accepted(char *dtb_name)
+static int resource_check_header(struct resource_img_hdr *hdr)
 {
-	return 1;
+	return memcmp(RESOURCE_MAGIC, hdr->magic, RESOURCE_MAGIC_SIZE);
 }
 
-int resource_image_check_header(void *rsce_hdr)
+static void resource_dump(struct resource_file *f)
 {
-	struct resource_img_hdr *hdr = rsce_hdr;
-	int ret;
-
-	ret = memcmp(RESOURCE_MAGIC, hdr->magic, RESOURCE_MAGIC_SIZE);
-	if (ret) {
-		debug("bad resource image magic: %s\n",
-		      hdr->magic ? hdr->magic : "none");
-		ret = -EINVAL;
-	}
-
-	debug("resource image header:\n");
-	debug("magic:%s\n", hdr->magic);
-	debug("version:%d\n", hdr->version);
-	debug("c_version:%d\n", hdr->c_version);
-	debug("blks:%d\n", hdr->blks);
-	debug("c_offset:%d\n", hdr->c_offset);
-	debug("e_blks:%d\n", hdr->e_blks);
-	debug("e_num:%d\n", hdr->e_nums);
-
-	return ret;
+	printf("%s\n", f->name);
+	printf("  blk_start:  0x%08lx\n", (ulong)f->blk_start);
+	printf("  blk_offset: 0x%08lx\n", (ulong)f->blk_offset);
+	printf("  size:       0x%08x\n", f->size);
+	printf("  in_ram:     %d\n", f->in_ram);
+	printf("  hash_size:  %d\n\n", f->hash_size);
 }
 
-static int add_file_to_list(struct resource_entry *entry, int rsce_base, bool ram)
+static int resource_add_file(const char *name, u32 size,
+			     u32 blk_start,  u32 blk_offset,
+			     char *hash, u32 hash_size,
+			     bool in_ram)
 {
-	struct resource_file *file;
-
-	if (memcmp(entry->tag, ENTRY_TAG, ENTRY_TAG_SIZE)) {
-		debug("invalid entry tag\n");
-		return -ENOENT;
-	}
-
-	file = malloc(sizeof(*file));
-	if (!file) {
-		debug("out of memory\n");
-		return -ENOMEM;
-	}
-
-	strcpy(file->name, entry->name);
-	file->rsce_base = rsce_base;
-	file->f_offset = entry->f_offset;
-	file->f_size = entry->f_size;
-	file->hash_size = entry->hash_size;
-	file->ram = ram;
-	memcpy(file->hash, entry->hash, entry->hash_size);
-	INIT_LIST_HEAD(&file->dtbs);
-	list_add_tail(&file->link, &entrys_head);
-	if (strstr(file->name, DTB_SUFFIX) && board_resource_dtb_accepted(file->name))
-		list_add_tail(&file->dtbs, &entrys_dtbs_head);
-	debug("ENTRY: addr: %p, name: %18s, base: 0x%08x, offset: 0x%08x, size: 0x%08x\n",
-	      entry, file->name, file->rsce_base, file->f_offset, file->f_size);
-
-	return 0;
-}
-
-int resource_replace_entry(const char *f_name, uint32_t base,
-			   uint32_t f_offset, uint32_t f_size)
-{
-	struct resource_entry *entry;
-	struct resource_file *file;
+	struct resource_file *f;
 	struct list_head *node;
+	bool _new = true;
 
-	if (!f_name || !f_size)
-		return -EINVAL;
-
-	entry = calloc(1, sizeof(*entry));
-	if (!entry)
-		return -ENOMEM;
-
-	strcpy(entry->tag, ENTRY_TAG);
-	strcpy(entry->name, f_name);
-	entry->f_offset = f_offset;
-	entry->f_size = f_size;
-	entry->hash_size = 0;
-
-	/* Delete exist entry, then add this new */
-	list_for_each(node, &entrys_head) {
-		file = list_entry(node, struct resource_file, link);
-		if (!strcmp(file->name, entry->name)) {
-			list_del(&file->link);
-			list_del(&file->dtbs);
-			free(file);
+	/* old one ? */
+	list_for_each(node, &entry_head) {
+		f = list_entry(node, struct resource_file, link);
+		if (!strcmp(f->name, name)) {
+			_new = false;
 			break;
 		}
 	}
 
-	add_file_to_list(entry, base, false);
-	free(entry);
+	if (_new) {
+		f = calloc(1, sizeof(*f));
+		if (!f)
+			return -ENOMEM;
+
+		list_add_tail(&f->link, &entry_head);
+	}
+
+	strcpy(f->name, name);
+	f->size       = size;
+	f->in_ram     = in_ram;
+	f->blk_start  = blk_start;
+	f->blk_offset = blk_offset;
+	f->hash_size  = hash_size;
+	memcpy(f->hash, hash, hash_size);
+#ifdef DEBUG
+	resource_dump(f);
+#endif
+	return 0;
+}
+
+static int resource_setup_list(struct blk_desc *desc, ulong blk_start,
+			       void *resc_hdr, bool in_ram)
+{
+	struct resource_img_hdr *hdr = resc_hdr;
+	struct resource_entry *et;
+	u32 i, stride;
+	void *pos;
+
+	pos = (void *)hdr + hdr->c_offset * desc->blksz;
+	stride = hdr->e_blks * desc->blksz;
+
+	for (i = 0; i < hdr->e_nums; i++) {
+		et = pos + (i * stride);
+		if (memcmp(et->tag, ENTRY_TAG, ENTRY_TAG_SIZE))
+			continue;
+
+		resource_add_file(et->name, et->size,
+				  blk_start, et->blk_offset,
+				  et->hash, et->hash_size, in_ram);
+	}
 
 	return 0;
 }
 
-int resource_create_ram_list(struct blk_desc *dev_desc, void *rsce_hdr)
+int resource_setup_ram_list(struct blk_desc *desc, void *hdr)
 {
-	struct resource_img_hdr *hdr = rsce_hdr;
-	struct resource_entry *entry;
-	int e_num, size;
-	void *data;
-	int ret = 0;
+	if (!desc)
+		return -ENODEV;
 
-	if (resource_image_check_header(hdr)) {
-		ret = -EINVAL;
-		goto out;
+	if (resource_check_header(hdr)) {
+		printf("RESC: invalid\n");
+		return -EINVAL;
 	}
 
-	list_del_init(&entrys_head);
-	list_del_init(&entrys_dtbs_head);
-	data = (void *)((ulong)hdr + hdr->c_offset * dev_desc->blksz);
-	for (e_num = 0; e_num < hdr->e_nums; e_num++) {
-		size = e_num * hdr->e_blks * dev_desc->blksz;
-		entry = (struct resource_entry *)(data + size);
-		add_file_to_list(entry, (ulong)hdr, true);
+	/* @blk_start: set as 'hdr' point addr, to be used in byte */
+	return resource_setup_list(desc, (ulong)hdr, hdr, true);
+}
+
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+/*
+ * Add logo.bmp and logo_kernel.bmp from "logo" parititon
+ *
+ * Provide a "logo" partition for user to store logo.bmp and
+ * logo_kernel.bmp, so that the user can update them from
+ * kernel or user-space dynamically.
+ *
+ * "logo" partition layout, do not change order:
+ *
+ *   |----------------------| 0x00
+ *   | raw logo.bmp	    |
+ *   |----------------------| -> 512-byte aligned
+ *   | raw logo_kernel.bmp  |
+ *   |----------------------|
+ *
+ * N: the sector count of logo.bmp
+ *
+ * How to generate:
+ * 	cat logo.bmp > logo.img && truncate -s %512 logo.img && cat logo_kernel.bmp >> logo.img
+ */
+static int resource_setup_logo_bmp(struct blk_desc *desc)
+{
+	struct bmp_header *header;
+	const char *name[] = { "logo.bmp", "logo_kernel.bmp" };
+	disk_partition_t part;
+	u32 blk_offset = 0;
+	u32 filesz;
+	int ret, i;
+
+	if (part_get_info_by_name(desc, PART_LOGO, &part) < 0)
+		return 0;
+
+	header = memalign(ARCH_DMA_MINALIGN, desc->blksz);
+	if (!header)
+		return -ENOMEM;
+
+	for (i = 0; i < ARRAY_SIZE(name); i++) {
+		if (blk_dread(desc, part.start + blk_offset, 1, header) != 1) {
+			ret = -EIO;
+			break;
+		}
+
+		if (header->signature[0] != 'B' || header->signature[1] != 'M') {
+			ret = -EINVAL;
+			break;
+		}
+
+		filesz = get_unaligned_le32(&header->file_size);
+		ret = resource_add_file(name[i], filesz, part.start, blk_offset,
+					NULL, 0, false);
+		if (ret)
+			break;
+
+		/* move to next file */
+		blk_offset += DIV_ROUND_UP(filesz, desc->blksz);
+
+		printf("LOGO: %s\n", name[i]);
+
 	}
-out:
-	resource_read_logo_bmps();
+
+	free(header);
 
 	return ret;
 }
 
-static int resource_create_list(struct blk_desc *dev_desc, int rsce_base)
+static int resource_setup_blk_list(struct blk_desc *desc, ulong blk_start)
 {
 	struct resource_img_hdr *hdr;
-	struct resource_entry *entry;
-	int blknum, e_num;
-	void *data = NULL;
+	int blk_cnt;
 	int ret = 0;
-	int size;
+	void *buf;
 
-	hdr = memalign(ARCH_DMA_MINALIGN, dev_desc->blksz);
+	hdr = memalign(ARCH_DMA_MINALIGN, desc->blksz);
 	if (!hdr)
 		return -ENOMEM;
 
-	if (blk_dread(dev_desc, rsce_base, 1, hdr) != 1) {
-		printf("Failed to read resource hdr\n");
+	if (blk_dread(desc, blk_start, 1, hdr) != 1) {
 		ret = -EIO;
-		goto err;
+		goto out;
 	}
 
-	if (resource_image_check_header(hdr)) {
+	if (resource_check_header(hdr)) {
+		printf("RESC: invalid\n");
 		if (fdt_check_header(hdr)) {
-			printf("No valid resource or dtb file\n");
 			ret = -EINVAL;
-			goto err;
+			goto out;
 		} else {
-			free(hdr);
-			return resource_replace_entry(DEFAULT_DTB_FILE, rsce_base,
-						      0, fdt_totalsize(hdr));
+			/* this is a dtb file */
+			printf("RESC: this is dtb\n");
+			ret = resource_add_file(DEFAULT_DTB_FILE,
+						fdt_totalsize(hdr),
+						blk_start, 0, NULL, 0, false);
+			goto out;
 		}
 	}
 
-	blknum = hdr->e_blks * hdr->e_nums;
-	data = memalign(ARCH_DMA_MINALIGN, blknum * dev_desc->blksz);
-	if (!data) {
+	blk_cnt = hdr->e_blks * hdr->e_nums;
+	hdr = realloc(hdr, (1 + blk_cnt) * desc->blksz);
+	if (!hdr) {
 		ret = -ENOMEM;
-		goto err;
+		goto out;
 	}
 
-	if (blk_dread(dev_desc, rsce_base + hdr->c_offset,
-		      blknum, data) != blknum) {
-		printf("Failed to read resource entries\n");
+	buf = (void *)hdr + desc->blksz;
+	if (blk_dread(desc, blk_start + hdr->c_offset, blk_cnt, buf) != blk_cnt) {
 		ret = -EIO;
-		goto err;
+		goto out;
 	}
 
-	/*
-	 * Add all file into resource file list, and load what we want from
-	 * storage when we really need it.
-	 */
-	for (e_num = 0; e_num < hdr->e_nums; e_num++) {
-		size = e_num * hdr->e_blks * dev_desc->blksz;
-		entry = (struct resource_entry *)(data + size);
-		add_file_to_list(entry, rsce_base, false);
-	}
-
-err:
-	if (data)
-		free(data);
-	if (hdr)
-		free(hdr);
-
-	resource_read_logo_bmps();
+	resource_setup_list(desc, blk_start, hdr, false);
+	resource_setup_logo_bmp(desc);
+out:
+	free(hdr);
 
 	return ret;
 }
 
-static int read_dtb_from_android(struct blk_desc *dev_desc,
-				 struct andr_img_hdr *hdr,
-				 ulong rsce_base)
+static int resource_init(struct blk_desc *desc,
+			 disk_partition_t *part,
+			 ulong blk_offset)
 {
-	ulong dtb_offset = 0;
-	ulong dtb_size = 0;
+	printf("RESC: '%s', blk@0x%08lx\n", part->name, part->start + blk_offset);
 
-	if (!hdr || hdr->header_version <= 1) {
-		return 0;
-	} else if (hdr->header_version == 2) {
-		dtb_offset += hdr->page_size;
-		dtb_offset += ALIGN(hdr->kernel_size, hdr->page_size);
-		dtb_offset += ALIGN(hdr->ramdisk_size, hdr->page_size);
-		dtb_offset += ALIGN(hdr->recovery_dtbo_size, hdr->page_size) +
-			      ALIGN(hdr->second_size, hdr->page_size);
-		dtb_size = hdr->dtb_size;
-	} else if (hdr->header_version >= 3) {
-		ulong vendor_boot_hdr_size = (hdr->header_version == 3) ?
-			VENDOR_BOOT_HDRv3_SIZE : VENDOR_BOOT_HDRv4_SIZE;
+#ifdef CONFIG_ANDROID_AVB
+	char hdr[512];
+	ulong resc_buf = 0;
+	int ret;
 
-		dtb_offset += ALIGN(vendor_boot_hdr_size,
-				    hdr->vendor_page_size) +
-			      ALIGN(hdr->vendor_ramdisk_size,
-				    hdr->vendor_page_size);
-		dtb_size = hdr->dtb_size;
+	if (blk_dread(desc, part->start, 1, hdr) != 1)
+		return -EIO;
+
+	/* only handle android boot/recovery.img and resource.img, ignore fit */
+	if (!android_image_check_header((void *)hdr) ||
+	    !resource_check_header((void *)hdr)) {
+		ret = android_image_verify_resource((const char *)part->name, &resc_buf);
+		if (ret) {
+			printf("RESC: '%s', avb verify fail: %d\n", part->name, ret);
+			return ret;
+		}
+
+		/*
+		 * unlock=0: resc_buf is valid and file was already full load in ram.
+		 * unlock=1: resc_buf is 0.
+		 */
+		if (resc_buf && !resource_check_header((void *)resc_buf))
+			return resource_setup_ram_list(desc, (void *)resc_buf);
 	}
+#endif
 
-	if (!dtb_size)
-		return 0;
+	return resource_setup_blk_list(desc, part->start + blk_offset);
+}
 
-	/*
-	 * boot_img_hdr_v234 feature.
-	 *
-	 * If dtb position is present, replace the old with new one if
-	 * we don't need to verify DTB hash from resource.img file entry.
-	 */
-	dtb_offset = DIV_ROUND_UP(dtb_offset, dev_desc->blksz);
-	env_update("bootargs", "androidboot.dtb_idx=0");
+static int resource_default(struct blk_desc *desc,
+			    disk_partition_t *out_part,
+			    ulong *out_blk_offset)
+{
+	disk_partition_t part;
+
+	if (part_get_info_by_name(desc, PART_RESOURCE, &part) < 0)
+		return -ENODEV;
+
+	*out_part = part;
+	*out_blk_offset = 0;
 
 	return 0;
 }
+#endif
 
-static int get_resource_base_sector(struct blk_desc *dev_desc,
-				    struct andr_img_hdr **ret_hdr)
+static int resource_scan(void)
 {
+	struct blk_desc *desc = rockchip_get_bootdev();
+	__maybe_unused int ret;
+
+	if (!desc) {
+		printf("RESC: No bootdev\n");
+		return -ENODEV;
+	}
+
+	if (!list_empty(&entry_head))
+		return 0;
+
+#ifdef CONFIG_ROCKCHIP_FIT_IMAGE
+	ret = fit_image_init_resource(desc);
+	if (!ret || ret != -EAGAIN)
+		return ret;
+#endif
+#ifdef CONFIG_ROCKCHIP_UIMAGE
+	ret = uimage_init_resource(desc);
+	if (!ret || ret != -EAGAIN)
+		return ret;
+#endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
 	disk_partition_t part;
-	int rsce_base = 0;
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-	struct andr_img_hdr *hdr;
-	u32 os_ver = 0, os_lvl;
-	const char *part_boot = PART_BOOT;
+	ulong blk_offset;
+	char hdr[512];
+	char name[32];
 
-	/*
-	 * Anyway, we must read android hdr firstly from boot/recovery partition
-	 * to get the 'os_version' for android_bcb_msg_sector_offset(), in order
-	 * to confirm BCB message offset of *MISC* partition.
-	 */
-#ifdef CONFIG_ANDROID_AB
-	part_boot = ab_can_find_recovery_part() ? PART_RECOVERY : PART_BOOT;
-#endif
+	/* partition priority: boot/recovery > resource */
+	if (!android_image_init_resource(desc, &part, &blk_offset)) {
+		if (blk_dread(desc, part.start + blk_offset, 1, hdr) != 1)
+			return -EIO;
 
-	if (part_get_info_by_name(dev_desc, part_boot, &part) < 0)
-		goto resource_part;
+		if (resource_check_header((void *)hdr)) {
+			strcpy(name, (char *)part.name);
+			if (resource_default(desc, &part, &blk_offset))
+				return -ENOENT;
 
-	hdr = populate_andr_img_hdr(dev_desc, &part);
-	if (hdr) {
-		os_ver = hdr->os_version >> 11;
-		os_lvl = hdr->os_version & ((1U << 11) - 1);
-		if (os_ver)
-			gd->bd->bi_andr_version = hdr->os_version;
-	}
-
-#ifndef CONFIG_ANDROID_AB
-	/* Get boot mode from misc and read if recovery mode */
-	if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY) {
-		if (hdr)
-			free(hdr);
-
-		if (part_get_info_by_name(dev_desc, PART_RECOVERY, &part) < 0)
-			goto resource_part;
-
-		hdr = populate_andr_img_hdr(dev_desc, &part);
-		if (!hdr)
-			goto resource_part;
-	}
-#endif
-	/* If Android v012, getting resource from second position ! */
-	if (hdr) {
-		if (os_ver)
-			printf("Android %u.%u, Build %u.%u, v%d\n",
-			       (os_ver >> 14) & 0x7F, (os_ver >> 7) & 0x7F,
-			       (os_lvl >> 4) + 2000, os_lvl & 0x0F,
-			       hdr->header_version);
-		*ret_hdr = hdr;
-		if (hdr->header_version < 3) {
-			rsce_base = part.start * dev_desc->blksz;
-			rsce_base += hdr->page_size;
-			rsce_base += ALIGN(hdr->kernel_size, hdr->page_size);
-			rsce_base += ALIGN(hdr->ramdisk_size, hdr->page_size);
-			rsce_base = DIV_ROUND_UP(rsce_base, dev_desc->blksz);
-			goto finish;
+			printf("RESC: '%s' -> '%s'\n", name, part.name);
 		}
-	}
-resource_part:
-#endif
-	/* resource partition */
-	if (part_get_info_by_name(dev_desc, PART_RESOURCE, &part) < 0) {
-		printf("No resource partition\n");
-		return -ENODEV;
 	} else {
-		rsce_base = part.start;
+		if (resource_default(desc, &part, &blk_offset))
+			return -ENOENT;
 	}
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-finish:
+
+	/* now, 'part' can be boot/recovery/resource */
+	return resource_init(desc, &part, blk_offset);
 #endif
-	printf("Found DTB in %s part\n", part.name);
-
-	return rsce_base;
+	return -ENOENT;
 }
 
-/*
- * There are: logo/battery pictures and dtb file in the resource image by default.
- *
- * This function does:
- *
- * 1. Get resource image base sector from: boot/recovery(AOSP) > resource(RK)
- * 2. Create resource files list(addition: add logo bmps)
- * 3. Add dtb from android v2 dtb pos, override the old one from resource file
- */
-int resource_init_list(void)
+static struct resource_file *resource_get_file(const char *name)
 {
-	struct andr_img_hdr *hdr = NULL;
-	struct blk_desc *dev_desc;
-	int rsce_base;
-
-	dev_desc = rockchip_get_bootdev();
-	if (!dev_desc) {
-		printf("No dev_desc!\n");
-		return -ENODEV;
-	}
-
-	rsce_base = get_resource_base_sector(dev_desc, &hdr);
-	if (rsce_base > 0) {
-		if (resource_create_list(dev_desc, rsce_base))
-			printf("Failed to create resource list\n");
-	}
-
-	/* override the resource dtb with android dtb if need */
-	return read_dtb_from_android(dev_desc, hdr, rsce_base);
-}
-
-int resource_is_empty(void)
-{
-	return list_empty(&entrys_head);
-}
-
-static struct resource_file *get_file_info(const char *name)
-{
-	struct resource_file *file;
+	struct resource_file *f;
 	struct list_head *node;
 
-	if (list_empty(&entrys_head)) {
-		if (resource_init_list())
-			return NULL;
-	}
+	if (resource_scan())
+		return NULL;
 
-	list_for_each(node, &entrys_head) {
-		file = list_entry(node, struct resource_file, link);
-		if (!strcmp(file->name, name))
-			return file;
+	list_for_each(node, &entry_head) {
+		f = list_entry(node, struct resource_file, link);
+		if (!strcmp(f->name, name))
+			return f;
 	}
 
 	return NULL;
 }
 
-/*
- * read file from resource partition
- * @buf: destination buf to store file data;
- * @name: file name
- * @offset: blocks offset in the file, 1 block = 512 bytes
- * @len: the size(by bytes) of file to read.
- */
-int rockchip_read_resource_file(void *buf, const char *name, int offset, int len)
+int rockchip_read_resource_file(void *buf, const char *name, int blk_offset, int len)
 {
-	struct resource_file *file;
-	struct blk_desc *dev_desc;
-	int ret = 0;
-	int blks;
-	ulong src;
+	struct blk_desc *desc = rockchip_get_bootdev();
+	struct resource_file *f;
+	int blk_cnt;
+	ulong pos;
 
-	file = get_file_info(name);
-	if (!file) {
-		printf("No file: %s\n", name);
+	if (!desc)
+		return -ENODEV;
+
+	f = resource_get_file(name);
+	if (!f) {
+		printf("No resource file: %s\n", name);
 		return -ENOENT;
 	}
 
-	dev_desc = rockchip_get_bootdev();
-	if (!dev_desc) {
-		printf("No dev_desc!\n");
-		return -ENODEV;
-	}
+	if (len <= 0 || len > f->size)
+		len = f->size;
 
-	if (len <= 0 || len > file->f_size)
-		len = file->f_size;
-
-	if (file->ram) {
-		src = file->rsce_base +
-			(file->f_offset + offset) * dev_desc->blksz;
-		memcpy(buf, (char *)src, len);
-		ret = len;
+	if (f->in_ram) {
+		pos = f->blk_start + (f->blk_offset + blk_offset) * desc->blksz;
+		memcpy(buf, (char *)pos, len);
 	} else {
-		blks = DIV_ROUND_UP(len, dev_desc->blksz);
-		ret = blk_dread(dev_desc,
-				file->rsce_base + file->f_offset + offset,
-				blks, buf);
-		ret = (ret != blks) ? -EIO : len;
+		blk_cnt = DIV_ROUND_UP(len, desc->blksz);
+		if (blk_dread(desc,
+			      f->blk_start + f->blk_offset + blk_offset,
+			      blk_cnt, buf) != blk_cnt)
+			len = -EIO;
 	}
 
-	return ret;
+	return len;
 }
 
-static struct resource_file *get_default_dtb(void)
-{
-	struct resource_file *target_file = NULL;
-	struct resource_file *file;
-	struct list_head *node;
-	int num = 0;
-
-	if (list_empty(&entrys_head)) {
-		if (resource_init_list())
-			return NULL;
-	}
-
-	list_for_each(node, &entrys_dtbs_head) {
-		num++;
-		file = list_entry(node, struct resource_file, dtbs);
-		if (strcmp(file->name, DEFAULT_DTB_FILE))
-			target_file = file;
-	}
-
-	/*
-	 * two possible case:
-	 *	case 1. rk-kernel.dtb only
-	 *	case 2. targe_file(s) + rk-kernel.dtb(maybe they are the same),
-	 *		use (last)target_file as result one.
-	 */
-	if (num > 2)
-		printf("Error: find duplicate(%d) dtbs\n", num);
-
-	return target_file ? : get_file_info(DEFAULT_DTB_FILE);
-}
+extern struct resource_file *resource_read_hwid_dtb(void);
 
 int rockchip_read_resource_dtb(void *fdt_addr, char **hash, int *hash_size)
 {
-	struct resource_file *file = NULL;
+	struct resource_file *f = NULL;
 	int ret;
 
 #ifdef CONFIG_ROCKCHIP_HWID_DTB
-	file = resource_read_hwid_dtb();
-#endif
-	/* If no dtb matches hardware id(GPIO/ADC), use the default */
-	if (!file)
-		file = get_default_dtb();
+	if (resource_scan())
+		return -ENOENT;
 
-	if (!file)
+	f = resource_read_hwid_dtb();
+#endif
+	/* If no dtb match hardware id(GPIO/ADC), use the default */
+	if (!f)
+		f = resource_get_file(DEFAULT_DTB_FILE);
+
+	if (!f)
 		return -ENODEV;
 
-	ret = rockchip_read_resource_file(fdt_addr, file->name, 0, 0);
+	ret = rockchip_read_resource_file(fdt_addr, f->name, 0, 0);
 	if (ret < 0)
 		return ret;
 
 	if (fdt_check_header(fdt_addr))
 		return -EBADF;
 
-	*hash = file->hash;
-	*hash_size = file->hash_size;
-	printf("DTB: %s\n", file->name);
+	*hash = f->hash;
+	*hash_size = f->hash_size;
 
-	return 0;
-}
-
-int resource_traverse_init_list(void)
-{
-	if (!resource_is_empty())
-		return 0;
-
-#ifdef CONFIG_ROCKCHIP_FIT_IMAGE
-	if (!fit_image_init_resource())
-		return 0;
-#endif
-#ifdef CONFIG_ROCKCHIP_UIMAGE
-	if (!uimage_init_resource())
-		return 0;
-#endif
-	/* Android image is default supported within resource core */
+	printf("DTB: %s\n", f->name);
 
 	return 0;
 }
@@ -596,30 +495,20 @@
 static int do_dump_resource(cmd_tbl_t *cmdtp, int flag,
 			    int argc, char *const argv[])
 {
-	struct resource_file *file;
+	struct resource_file *f;
 	struct list_head *node;
 
-	printf("Resources:\n");
-	list_for_each(node, &entrys_head) {
-		file = list_entry(node, struct resource_file, link);
-		printf("	%s: 0x%08x(sector), 0x%08x(bytes)\n",
-		       file->name, file->rsce_base + file->f_offset, file->f_size);
+	list_for_each(node, &entry_head) {
+		f = list_entry(node, struct resource_file, link);
+		resource_dump(f);
 	}
 
-#ifdef CONFIG_ROCKCHIP_HWID_DTB
-	printf("DTBs:\n");
-	list_for_each(node, &entrys_dtbs_head) {
-		file = list_entry(node, struct resource_file, dtbs);
-		printf("	%s: 0x%08x(sector),0x%08x(bytes)\n",
-		       file->name, file->rsce_base + file->f_offset, file->f_size);
-	}
-#endif
 	return 0;
 }
 
 U_BOOT_CMD(
 	dump_resource, 1, 1, do_dump_resource,
-	"dump resource list",
+	"dump resource files",
 	""
 );
 
diff --git a/u-boot/arch/arm/mach-rockchip/resource_logo.c b/u-boot/arch/arm/mach-rockchip/resource_logo.c
deleted file mode 100644
index 7d40ddf..0000000
--- a/u-boot/arch/arm/mach-rockchip/resource_logo.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * (C) Copyright 2021 Rockchip Electronics Co., Ltd
- *
- * SPDX-License-Identifier:     GPL-2.0+
- */
-#include <common.h>
-#include <adc.h>
-#include <boot_rkimg.h>
-#include <bmp_layout.h>
-#include <malloc.h>
-#include <asm/io.h>
-#include <asm/unaligned.h>
-#include <asm/arch/resource_img.h>
-#include <dm/ofnode.h>
-
-static int read_bmp(struct blk_desc *dev_desc, const char *name,
-		    disk_partition_t *part, uint32_t offset,
-		    uint32_t *size)
-{
-	struct bmp_header *header;
-	u32 blk_offset;
-	u32 filesz;
-	int ret;
-
-	blk_offset = DIV_ROUND_UP(offset, dev_desc->blksz);
-	header = memalign(ARCH_DMA_MINALIGN, dev_desc->blksz);
-	if (!header) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	if (blk_dread(dev_desc, part->start + blk_offset, 1, header) != 1) {
-		ret = -EIO;
-		goto out;
-	}
-
-	if (header->signature[0] != 'B' || header->signature[1] != 'M') {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	filesz = get_unaligned_le32(&header->file_size);
-	ret = resource_replace_entry(name, part->start, blk_offset, filesz);
-	if (!ret) {
-		printf("LOGO: %s\n", name);
-		if (size)
-			*size = filesz;
-	}
-out:
-	free(header);
-
-	return ret;
-}
-
-/*
- * Add logo.bmp and logo_kernel.bmp from "logo" parititon
- *
- * Provide a "logo" partition for user to store logo.bmp and
- * logo_kernel.bmp, so that the user can update them from
- * kernel or user-space dynamically.
- *
- * "logo" partition layout, do not change order:
- *
- *   |----------------------| 0x00
- *   | raw logo.bmp	    |
- *   |----------------------| N*512-byte aligned
- *   | raw logo_kernel.bmp  |
- *   |----------------------|
- *
- * N: the sector count of logo.bmp
- *
- * How to generate:
- * 	cat logo.bmp > logo.img && truncate -s %512 logo.img && cat logo_kernel.bmp >> logo.img
- */
-int resource_read_logo_bmps(void)
-{
-	struct blk_desc *dev_desc;
-	disk_partition_t part;
-	u32 filesz;
-
-	dev_desc = rockchip_get_bootdev();
-	if (!dev_desc) {
-		printf("No dev_desc!\n");
-		return -ENODEV;
-	}
-
-	if (part_get_info_by_name(dev_desc, PART_LOGO, &part) < 0)
-		return -ENODEV;
-
-	if (!read_bmp(dev_desc, "logo.bmp", &part, 0, &filesz))
-		read_bmp(dev_desc, "logo_kernel.bmp", &part, filesz, NULL);
-
-	return 0;
-}
-
diff --git a/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c b/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c
index 965afde..ea14298 100644
--- a/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c
+++ b/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c
@@ -18,4 +18,7 @@
 	.name = "rk3036_syscon",
 	.id = UCLASS_SYSCON,
 	.of_match = rk3036_syscon_ids,
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.bind = dm_scan_fdt_dev,
+#endif
 };
diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/Kconfig b/u-boot/arch/arm/mach-rockchip/rk3528/Kconfig
new file mode 100644
index 0000000..d1ab9f2
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3528/Kconfig
@@ -0,0 +1,17 @@
+if ROCKCHIP_RK3528
+
+config TARGET_EVB_RK3528
+	bool "EVB_RK3528"
+	select BOARD_LATE_INIT
+	help
+	  RK3528 EVB is a evaluation board for Rockchp RK3528.
+
+config SYS_SOC
+	default "rockchip"
+
+config SYS_MALLOC_F_LEN
+	default 0x400
+
+source board/rockchip/evb_rk3528/Kconfig
+
+endif
diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/Makefile b/u-boot/arch/arm/mach-rockchip/rk3528/Makefile
new file mode 100644
index 0000000..81f6939
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3528/Makefile
@@ -0,0 +1,11 @@
+#
+# (C) Copyright 2020 Rockchip Electronics Co., Ltd
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+ifneq ($(CONFIG_TPL_BUILD)$(CONFIG_TPL_TINY_FRAMEWORK),yy)
+obj-y += syscon_rk3528.o
+endif
+obj-y += rk3528.o
+obj-y += clk_rk3528.o
diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c b/u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c
new file mode 100644
index 0000000..639bf73
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c
@@ -0,0 +1,41 @@
+/*
+ * (C) Copyright 2020 Rockchip Electronics Co., Ltd.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/cru_rk3528.h>
+
+int rockchip_get_clk(struct udevice **devp)
+{
+	return uclass_get_device_by_driver(UCLASS_CLK,
+			DM_GET_DRIVER(rockchip_rk3528_cru), devp);
+}
+
+#if CONFIG_IS_ENABLED(CLK_SCMI)
+int rockchip_get_scmi_clk(struct udevice **devp)
+{
+	return uclass_get_device_by_driver(UCLASS_CLK,
+			DM_GET_DRIVER(scmi_clock), devp);
+}
+#endif
+
+void *rockchip_get_cru(void)
+{
+	struct rk3528_clk_priv *priv;
+	struct udevice *dev;
+	int ret;
+
+	ret = rockchip_get_clk(&dev);
+	if (ret)
+		return ERR_PTR(ret);
+
+	priv = dev_get_priv(dev);
+
+	return priv->cru;
+}
+
diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c b/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c
new file mode 100644
index 0000000..3aae2e8
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c
@@ -0,0 +1,494 @@
+/*
+ * Copyright (c) 2020 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/grf_rk3528.h>
+#include <asm/arch/ioc_rk3528.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define FIREWALL_DDR_BASE	0xff2e0000
+#define FW_DDR_MST1_REG 	0x44
+#define FW_DDR_MST6_REG 	0x58
+#define FW_DDR_MST7_REG 	0x5c
+#define FW_DDR_MST11_REG 	0x6c
+#define FW_DDR_MST14_REG	0x78
+#define FW_DDR_MST16_REG 	0x80
+#define FW_DDR_MST_REG		0xf0
+
+#define VENC_GRF_BASE		0xff320000
+#define VENC_GRF_CON1		0x4
+
+#define VPU_GRF_BASE		0xff340000
+#define VPU_GRF_CON4		0x14
+
+#define PMU_SGRF_BASE		0xff440000
+#define PMU_SGRF_SOC_CON4	0x10
+#define PMU_SGRF_SOC_CON5	0x14
+#define PMU_SGRF_SOC_CON6	0x18
+#define PMU_SGRF_SOC_CON8	0x20
+#define PMU_SGRF_SOC_CON11	0x2c
+
+#define PMU_CRU_BASE		0xff4b0000
+#define PMU_CRU_GATE_CON00	0x800
+#define PMU_CRU_SOFTRST_CON00	0xa00
+
+#define GPIO1C_IOMUX_SEL_H	0x034
+#define GPIO1D_IOMUX_SEL_L	0x038
+#define GPIO1D_IOMUX_SEL_H	0x03c
+
+#define CPU_PRIORITY_REG	0xff210008
+#define QOS_PRIORITY_LEVEL(h, l)	((((h) & 7) << 8) | ((l) & 7))
+
+#ifdef CONFIG_ARM64
+#include <asm/armv8/mmu.h>
+
+static struct mm_region rk3528_mem_map[] = {
+	{
+		.virt = 0x0UL,
+		.phys = 0x0UL,
+		.size = 0xfc000000UL,
+		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+			 PTE_BLOCK_INNER_SHARE
+	}, {
+		.virt = 0xfc000000UL,
+		.phys = 0xfc000000UL,
+		.size = 0x04000000UL,
+		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+			 PTE_BLOCK_NON_SHARE |
+			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
+	}, {
+		/* List terminator */
+		0,
+	}
+};
+
+struct mm_region *mem_map = rk3528_mem_map;
+#endif
+
+#define	GPIO0_IOC_BASE			0xFF540000
+#define	GPIO1_IOC_BASE			0xFF560000
+#define	GPIO2_IOC_BASE			0xFF570000
+#define	GPIO3_IOC_BASE			0xFF560000
+#define	GPIO4_IOC_BASE			0xFF550000
+
+#define GPIO1_IOC_GPIO1D_IOMUX_SEL_L	(GPIO1_IOC_BASE + 0x38)
+#define GPIO1_IOC_GPIO1C_DS_2		(GPIO1_IOC_BASE + 0x148)
+#define GPIO1_IOC_GPIO1C_DS_3		(GPIO1_IOC_BASE + 0x14C)
+#define GPIO1_IOC_GPIO1D_DS_0		(GPIO1_IOC_BASE + 0x150)
+#define GPIO1_IOC_GPIO1D_DS_1		(GPIO1_IOC_BASE + 0x154)
+#define GPIO1_IOC_GPIO1D_DS_2		(GPIO1_IOC_BASE + 0x158)
+
+/* uart0 iomux */
+/* gpio4c7 */
+#define UART0_RX_M0			1
+#define UART0_RX_M0_OFFSET		12
+#define UART0_RX_M0_ADDR		(GPIO4_IOC_BASE + 0x94)
+/* gpio4d0 */
+#define UART0_TX_M0			1
+#define UART0_TX_M0_OFFSET		0
+#define UART0_TX_M0_ADDR		(GPIO4_IOC_BASE + 0x98)
+
+/* gpio2a0 */
+#define UART0_RX_M1			2
+#define UART0_RX_M1_OFFSET		0
+#define UART0_RX_M1_ADDR		(GPIO2_IOC_BASE + 0x40)
+/* gpio2a1 */
+#define UART0_TX_M1			2
+#define UART0_TX_M1_OFFSET		4
+#define UART0_TX_M1_ADDR		(GPIO2_IOC_BASE + 0x40)
+
+/* uart1 iomux */
+/* gpio4a7 */
+#define UART1_RX_M0			2
+#define UART1_RX_M0_OFFSET		12
+#define UART1_RX_M0_ADDR		(GPIO1_IOC_BASE + 0x84)
+/* gpio4a6 */
+#define UART1_TX_M0			2
+#define UART1_TX_M0_OFFSET		8
+#define UART1_TX_M0_ADDR		(GPIO1_IOC_BASE + 0x84)
+
+/* gpio4c6 */
+#define UART1_RX_M1			2
+#define UART1_RX_M1_OFFSET		8
+#define UART1_RX_M1_ADDR		(GPIO4_IOC_BASE + 0x94)
+/* gpio4c5 */
+#define UART1_TX_M1			2
+#define UART1_TX_M1_OFFSET		4
+#define UART1_TX_M1_ADDR		(GPIO4_IOC_BASE + 0x94)
+
+/* uart2 iomux */
+/* gpio3a0 */
+#define UART2_RX_M0			1
+#define UART2_RX_M0_OFFSET		0
+#define UART2_RX_M0_ADDR		(GPIO3_IOC_BASE + 0x60)
+/* gpio3a1 */
+#define UART2_TX_M0			1
+#define UART2_TX_M0_OFFSET		4
+#define UART2_TX_M0_ADDR		(GPIO3_IOC_BASE + 0x60)
+
+/* gpio1b0 */
+#define UART2_RX_M1			1
+#define UART2_RX_M1_OFFSET		0
+#define UART2_RX_M1_ADDR		(GPIO1_IOC_BASE + 0x28)
+/* gpio1b1 */
+#define UART2_TX_M1			1
+#define UART2_TX_M1_OFFSET		4
+#define UART2_TX_M1_ADDR		(GPIO1_IOC_BASE + 0x28)
+
+/* uart3 iomux */
+/* gpio4b0 */
+#define UART3_RX_M0			2
+#define UART3_RX_M0_OFFSET		0
+#define UART3_RX_M0_ADDR		(GPIO4_IOC_BASE + 0x88)
+/* gpio4b1 */
+#define UART3_TX_M0			2
+#define UART3_TX_M0_OFFSET		4
+#define UART3_TX_M0_ADDR		(GPIO4_IOC_BASE + 0x88)
+
+/* gpio4b7 */
+#define UART3_RX_M1			3
+#define UART3_RX_M1_OFFSET		12
+#define UART3_RX_M1_ADDR		(GPIO4_IOC_BASE + 0x8C)
+/* gpio4c0 */
+#define UART3_TX_M1			3
+#define UART3_TX_M1_OFFSET		0
+#define UART3_TX_M1_ADDR		(GPIO4_IOC_BASE + 0x90)
+
+/* uart4 iomux */
+/* gpio2a2 */
+#define UART4_RX_M0			3
+#define UART4_RX_M0_OFFSET		8
+#define UART4_RX_M0_ADDR		(GPIO2_IOC_BASE + 0x40)
+/* gpio2a3 */
+#define UART4_TX_M0			3
+#define UART4_TX_M0_OFFSET		12
+#define UART4_TX_M0_ADDR		(GPIO2_IOC_BASE + 0x40)
+
+/* uart5 iomux */
+/* gpio1a2 */
+#define UART5_RX_M0			2
+#define UART5_RX_M0_OFFSET		8
+#define UART5_RX_M0_ADDR		(GPIO1_IOC_BASE + 0x20)
+/* gpio1a3 */
+#define UART5_TX_M0			2
+#define UART5_TX_M0_OFFSET		12
+#define UART5_TX_M0_ADDR		(GPIO1_IOC_BASE + 0x20)
+
+/* gpio1d4 */
+#define UART5_RX_M1			2
+#define UART5_RX_M1_OFFSET		0
+#define UART5_RX_M1_ADDR		(GPIO1_IOC_BASE + 0x3c)
+/* gpio1d7 */
+#define UART5_TX_M1			2
+#define UART5_TX_M1_OFFSET		12
+#define UART5_TX_M1_ADDR		(GPIO1_IOC_BASE + 0x3c)
+
+/* uart6 iomux */
+/* gpio3a7 */
+#define UART6_RX_M0			4
+#define UART6_RX_M0_OFFSET		12
+#define UART6_RX_M0_ADDR		(GPIO3_IOC_BASE + 0x64)
+/* gpio3a6 */
+#define UART6_TX_M0			4
+#define UART6_TX_M0_OFFSET		8
+#define UART6_TX_M0_ADDR		(GPIO3_IOC_BASE + 0x64)
+
+/* gpio3c3 */
+#define UART6_RX_M1			4
+#define UART6_RX_M1_OFFSET		12
+#define UART6_RX_M1_ADDR		(GPIO3_IOC_BASE + 0x70)
+/* gpio3c1 */
+#define UART6_TX_M1			4
+#define UART6_TX_M1_OFFSET		4
+#define UART6_TX_M1_ADDR		(GPIO3_IOC_BASE + 0x70)
+
+/* uart7 iomux */
+/* gpio3b3 */
+#define UART7_RX_M0			4
+#define UART7_RX_M0_OFFSET		12
+#define UART7_RX_M0_ADDR		(GPIO3_IOC_BASE + 0x68)
+/* gpio3b2 */
+#define UART7_TX_M0			4
+#define UART7_TX_M0_OFFSET		8
+#define UART7_TX_M0_ADDR		(GPIO3_IOC_BASE + 0x68)
+
+/* gpio1b3 */
+#define UART7_RX_M1			4
+#define UART7_RX_M1_OFFSET		12
+#define UART7_RX_M1_ADDR		(GPIO1_IOC_BASE + 0x28)
+/* gpio1b2 */
+#define UART7_TX_M1			4
+#define UART7_TX_M1_OFFSET		8
+#define UART7_TX_M1_ADDR		(GPIO1_IOC_BASE + 0x28)
+
+
+#define set_uart_iomux(bits_offset, bits_val, addr) \
+	writel(GENMASK(bits_offset + 19, bits_offset + 16) | (bits_val << bits_offset) , addr)
+
+#define set_uart_iomux_rx(ID, MODE) \
+	set_uart_iomux(UART##ID##_RX_M##MODE##_OFFSET, UART##ID##_RX_M##MODE, UART##ID##_RX_M##MODE##_ADDR);
+#define set_uart_iomux_tx(ID, MODE) \
+	set_uart_iomux(UART##ID##_TX_M##MODE##_OFFSET, UART##ID##_TX_M##MODE, UART##ID##_TX_M##MODE##_ADDR);
+
+void board_debug_uart_init(void)
+{
+/* UART 0 */
+#if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff9f0000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART0_M0 Switch iomux */
+	set_uart_iomux_rx(0, 0);
+	set_uart_iomux_tx(0, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART0_M1 Switch iomux */
+	set_uart_iomux_rx(0, 1);
+	set_uart_iomux_tx(0, 1);
+#endif
+/* UART 1 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff9f8000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART1_M0 Switch iomux */
+	set_uart_iomux_rx(1, 0);
+	set_uart_iomux_tx(1, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART1_M1 Switch iomux */
+	set_uart_iomux_rx(1, 1);
+	set_uart_iomux_tx(1, 1);
+#endif
+/* UART 2 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa00000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART2_M0 Switch iomux */
+	set_uart_iomux_rx(2, 0);
+	set_uart_iomux_tx(2, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART2_M1 Switch iomux */
+	set_uart_iomux_rx(2, 1);
+	set_uart_iomux_tx(2, 1);
+#endif
+/* UART 3 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa08000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART3_M0 Switch iomux */
+	set_uart_iomux_rx(3, 0);
+	set_uart_iomux_tx(3, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART3_M1 Switch iomux */
+	set_uart_iomux_rx(3, 1);
+	set_uart_iomux_tx(3, 1);
+#endif
+/* UART 4 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa10000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART4_M0 Switch iomux */
+	set_uart_iomux_rx(4, 0);
+	set_uart_iomux_tx(4, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART4_M1 Switch iomux */
+	set_uart_iomux_rx(4, 1);
+	set_uart_iomux_tx(4, 1);
+#endif
+/* UART 5 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa18000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART5_M0 Switch iomux */
+	set_uart_iomux_rx(5, 0);
+	set_uart_iomux_tx(5, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART5_M1 Switch iomux */
+	set_uart_iomux_rx(5, 1);
+	set_uart_iomux_tx(5, 1);
+#endif
+/* UART 6 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa20000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART6_M0 Switch iomux */
+	set_uart_iomux_rx(6, 0);
+	set_uart_iomux_tx(6, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART6_M1 Switch iomux */
+	set_uart_iomux_rx(6, 1);
+	set_uart_iomux_tx(6, 1);
+#endif
+/* UART 7 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa28000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART7_M0 Switch iomux */
+	set_uart_iomux_rx(7, 0);
+	set_uart_iomux_tx(7, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART7_M1 Switch iomux */
+	set_uart_iomux_rx(7, 1);
+	set_uart_iomux_tx(7, 1);
+#endif
+#endif
+}
+
+#ifdef CONFIG_SPL_BUILD
+void rockchip_stimer_init(void)
+{
+	/* If Timer already enabled, don't re-init it */
+	u32 reg = readl(CONFIG_ROCKCHIP_STIMER_BASE + 0x4);
+
+	if (reg & 0x1)
+		return;
+
+	asm volatile("msr CNTFRQ_EL0, %0" : : "r" (COUNTER_FREQUENCY));
+	writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 0x14);
+	writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 0x18);
+	dsb();
+	writel(0x1, CONFIG_ROCKCHIP_STIMER_BASE + 0x4);
+}
+#endif
+
+int arch_cpu_init(void)
+{
+#if defined(CONFIG_SPL_BUILD)
+	u32 val;
+
+	/*
+	 * Select clk_tx source as default for i2s2/i2s3
+	 * Set I2Sx_MCLK as input default
+	 *
+	 * It's safe to set mclk as input default to avoid high freq glitch
+	 * which may make devices work unexpected. And then enabled by
+	 * kernel stage or any state where user use it.
+	 */
+	writel(0x00020002, VPU_GRF_BASE + VPU_GRF_CON4);
+	writel(0x40004000, VENC_GRF_BASE + VENC_GRF_CON1);
+
+	/* Set the emmc to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
+	writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
+
+	/* Set the sdmmc to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST14_REG);
+	writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST14_REG);
+
+	/* Set the crypto to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST1_REG);
+	writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST1_REG);
+
+#if defined(CONFIG_ROCKCHIP_SFC)
+	/* Set the fspi to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST7_REG);
+	writel(val & 0xffff0000, FIREWALL_DDR_BASE + FW_DDR_MST7_REG);
+#endif
+
+#ifndef CONFIG_TPL_BUILD
+	/* Set cpu qos priority, then
+	 * Peri > VOP > CPU = RKVDEC/RKVENC/VPU > GPU/RGA/Other
+	 */
+	writel(QOS_PRIORITY_LEVEL(2, 2), CPU_PRIORITY_REG);
+#endif
+
+	if (readl(GPIO1_IOC_GPIO1D_IOMUX_SEL_L) == 0x1111) {
+	       /*
+		* set the emmc io drive strength:
+		* data and cmd: level 3
+		* clock: level 5
+		*/
+	       writel(0x3F3F0F0F, GPIO1_IOC_GPIO1C_DS_2);
+	       writel(0x3F3F0F0F, GPIO1_IOC_GPIO1C_DS_3);
+	       writel(0x3F3F0F0F, GPIO1_IOC_GPIO1D_DS_0);
+	       writel(0x3F3F0F0F, GPIO1_IOC_GPIO1D_DS_1);
+	       writel(0x3F3F3F0F, GPIO1_IOC_GPIO1D_DS_2);
+	}
+
+#elif defined(CONFIG_SUPPORT_USBPLUG)
+	u32 val;
+
+	/* Set the usb to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST16_REG);
+	writel(val & 0xffff0000, FIREWALL_DDR_BASE + FW_DDR_MST16_REG);
+
+	/* Set the emmc to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
+	writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
+
+	/* Set emmc iomux */
+	writel(0xffff1111, GPIO1_IOC_BASE + GPIO1C_IOMUX_SEL_H);
+	writel(0xffff1111, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_L);
+	writel(0xffff1111, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_H);
+
+#if defined(CONFIG_ROCKCHIP_SFC)
+	/* Set the fspi to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST7_REG);
+	writel(val & 0xFFFF0000uL, FIREWALL_DDR_BASE + FW_DDR_MST7_REG);
+
+	/* Set fspi iomux */
+	writel(0xffff2222, GPIO1_IOC_BASE + GPIO1C_IOMUX_SEL_H);
+	writel(0x000f0002, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_L);
+	writel(0x00f00020, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_H);
+#endif
+
+#endif
+	return 0;
+}
+
+#ifdef CONFIG_SPL_BUILD
+int spl_fit_standalone_release(char *id, uintptr_t entry_point)
+{
+	u32 val;
+
+	/* open clk_pmu_mcu_jtag / clk_mcu_32k_en / fclk_mcu_en */
+	writel(0x05800000, PMU_CRU_BASE + PMU_CRU_GATE_CON00);
+	/* set the mcu to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST11_REG);
+	writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST11_REG);
+	/* writel(0x00000000, FIREWALL_DDR_BASE + FW_DDR_MST_REG); */
+	/* set the mcu to secure */
+	writel(0x00200000, PMU_SGRF_BASE + PMU_SGRF_SOC_CON4);
+	/* open mcu_debug_en / mcu_dclk_en / mcu_hclk_en / mcu_sclk_en */
+	writel(0x000f000f, PMU_SGRF_BASE + PMU_SGRF_SOC_CON5);
+	/* set start addr, mcu_code_addr_start */
+	writel(0xffff0000 | (entry_point >> 16), PMU_SGRF_BASE + PMU_SGRF_SOC_CON6);
+	/* mcu_tcm_addr_start, multiplex pmu sram address */
+	writel(0xffffff10, PMU_SGRF_BASE + PMU_SGRF_SOC_CON11);
+	/* jtag_mcu_m0 gpio2a4/gpio2a5 iomux */
+	/* writel(0x00ff0022, GPIO2_IOC_BASE + 0x44); */
+	/* release the mcu */
+	writel(0x00800000, PMU_CRU_BASE + PMU_CRU_SOFTRST_CON00);
+
+	return 0;
+}
+#endif
+
diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c b/u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c
new file mode 100644
index 0000000..d8d40ee
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c
@@ -0,0 +1,24 @@
+/*
+ * (C) Copyright 2020 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch/clock.h>
+
+static const struct udevice_id rk3528_syscon_ids[] = {
+	{ .compatible = "rockchip,rk3528-grf", .data = ROCKCHIP_SYSCON_GRF },
+	{ }
+};
+
+U_BOOT_DRIVER(syscon_rk3528) = {
+	.name = "rk3528_syscon",
+	.id = UCLASS_SYSCON,
+	.of_match = rk3528_syscon_ids,
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.bind = dm_scan_fdt_dev,
+#endif
+};
diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/Kconfig b/u-boot/arch/arm/mach-rockchip/rk3562/Kconfig
new file mode 100644
index 0000000..9ee97e8
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3562/Kconfig
@@ -0,0 +1,17 @@
+if ROCKCHIP_RK3562
+
+config TARGET_EVB_RK3562
+	bool "EVB_RK3562"
+	select BOARD_LATE_INIT
+	help
+	  RK3562 EVB is a evaluation board for Rockchp RK3562.
+
+config SYS_SOC
+	default "rockchip"
+
+config SYS_MALLOC_F_LEN
+	default 0x400
+
+source board/rockchip/evb_rk3562/Kconfig
+
+endif
diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/Makefile b/u-boot/arch/arm/mach-rockchip/rk3562/Makefile
new file mode 100644
index 0000000..e643f8c
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3562/Makefile
@@ -0,0 +1,11 @@
+#
+# (C) Copyright 2022 Rockchip Electronics Co., Ltd
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+ifneq ($(CONFIG_TPL_BUILD)$(CONFIG_TPL_TINY_FRAMEWORK),yy)
+obj-y += syscon_rk3562.o
+endif
+obj-y += rk3562.o
+obj-y += clk_rk3562.o
diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c b/u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c
new file mode 100644
index 0000000..ff059b7
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c
@@ -0,0 +1,41 @@
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/cru_rk3562.h>
+
+int rockchip_get_clk(struct udevice **devp)
+{
+	return uclass_get_device_by_driver(UCLASS_CLK,
+			DM_GET_DRIVER(rockchip_rk3562_cru), devp);
+}
+
+#if CONFIG_IS_ENABLED(CLK_SCMI)
+int rockchip_get_scmi_clk(struct udevice **devp)
+{
+	return uclass_get_device_by_driver(UCLASS_CLK,
+			DM_GET_DRIVER(scmi_clock), devp);
+}
+#endif
+
+void *rockchip_get_cru(void)
+{
+	struct rk3562_clk_priv *priv;
+	struct udevice *dev;
+	int ret;
+
+	ret = rockchip_get_clk(&dev);
+	if (ret)
+		return ERR_PTR(ret);
+
+	priv = dev_get_priv(dev);
+
+	return priv->cru;
+}
+
diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c b/u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c
new file mode 100644
index 0000000..e417dee
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c
@@ -0,0 +1,661 @@
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+#include <common.h>
+#include <clk.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/grf_rk3562.h>
+#include <asm/arch/ioc_rk3562.h>
+#include <asm/arch/rk_atags.h>
+#include <linux/libfdt.h>
+#include <fdt_support.h>
+#include <asm/arch/clock.h>
+#include <dt-bindings/clock/rk3562-cru.h>
+#include <asm/arch-rockchip/rockchip_smccc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define FIREWALL_DDR_BASE	0xfef00000
+#define FW_DDR_MST3_REG		0x2c	/* usb */
+#define FW_DDR_MST4_REG		0x30	/* emmc */
+#define FW_DDR_MST5_REG		0x34	/* fspi */
+#define FW_DDR_MST6_REG		0x38	/* sdmmc mcu */
+#define FW_DDR_CON_REG		0x80
+
+#define PMU_GRF_BASE		0xff010000
+#define PMU_GRF_SOC_CON9	0x0124
+
+#define SYS_GRF_BASE		0xff030000
+#define SYS_GRF_SOC_CON5	0x0414
+#define SYS_GRF_SOC_CON6	0x0418
+
+#define PERI_GRF_BASE		0xff040000
+#define PERI_GRF_AUDIO_CON	0x0070
+
+#define PIPEPHY_GRF_BASE	0xff098000
+#define PIPEPHY_PIPE_CON5	0x0014
+
+#define TOP_CRU_BASE		0xff100000
+#define TOP_CRU_GATE_CON23	0x035c
+#define TOP_CRU_SOFTRST_CON23	0x045c
+#define TOP_CRU_CM0_GATEMASK	0x0680
+
+#define PMU0_CRU_BASE		0xff110000
+
+#define PMU1_CRU_BASE		0xff118000
+#define PMU1_CRU_GATE_CON02	0x0188
+#define PMU1_CRU_SOFTRST_CON02	0x0208
+#define PMU1_CRU_CM0_GATEMASK	0x0420
+
+#define PMU_BASE_ADDR		0xff258000
+#define PMU2_BIU_IDLE_SFTCON0	0x110
+#define PMU2_BIU_IDLE_ACK_STS0	0x120
+#define PMU2_BIT_IDLE_STS0	0x128
+#define PMU2_PWR_GATE_SFTCON0	0x210
+#define PMU2_PWR_GATE_STS0	0x230
+#define PMU2_MEM_SD_SFTCON0	0x300
+/* PMU2_PWR_GATE_SFTCON0 */
+#define PD_GPU_DWN_SFTENA	BIT(0)
+#define PD_VI_DWN_SFTENA	BIT(5)
+#define PD_VO_DWN_SFTENA	BIT(6)
+/* PMU2_BIU_IDLE_SFTCON0 */
+#define IDLE_REQ_GPU_SFTENA	BIT(1)
+#define IDLE_REQ_VI_SFTENA	BIT(3)
+#define IDLE_REQ_VO_SFTENA	BIT(4)
+/* PMU2_BIU_IDLE_ACK_STS0 */
+#define IDLE_ACK_GPU		BIT(1)
+#define IDLE_ACK_VI		BIT(3)
+#define IDLE_ACK_VO		BIT(4)
+/* PMU2_BIT_IDLE_STS0 */
+#define IDLE_GPU		BIT(1)
+#define IDLE_VI			BIT(3)
+#define IDLE_VO			BIT(4)
+
+#define CRYPTO_PRIORITY_REG	0xfeeb0108
+#define DCF_PRIORITY_REG	0xfee10408
+#define DMA2DDR_PRIORITY_REG	0xfee03808
+#define DMAC_PRIORITY_REG	0xfeeb0208
+#define EMMC_PRIORITY_REG	0xfeeb0308
+#define FSPI_PRIORITY_REG	0xfeeb0408
+#define GMAC_PRIORITY_REG	0xfee10208
+#define GPU_PRIORITY_REG	0xfee30008
+#define ISP_PRIORITY_REG	0xfee70008
+#define MAC100_PRIORITY_REG	0xfee10308
+#define MCU_PRIORITY_REG	0xfee10008
+#define PCIE_PRIORITY_REG	0xfeea0008
+#define RKDMA_PRIORITY_REG	0xfeeb0508
+#define SDMMC0_PRIORITY_REG	0xfeeb0608
+#define SDMMC1_PRIORITY_REG	0xfeeb0708
+#define USB2_PRIORITY_REG	0xfeeb0808
+#define USB3_PRIORITY_REG	0xfeea0108
+#define VICAP_PRIORITY_REG	0xfee70108
+#define VOP_PRIORITY_REG	0xfee80008
+
+#define QOS_PRIORITY_LEVEL(h, l)	((((h) & 7) << 8) | ((l) & 7))
+
+#ifdef CONFIG_ARM64
+#include <asm/armv8/mmu.h>
+
+static struct mm_region rk3562_mem_map[] = {
+	{
+		.virt = 0x0UL,
+		.phys = 0x0UL,
+		.size = 0xfc000000UL,
+		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+			 PTE_BLOCK_INNER_SHARE
+	}, {
+		.virt = 0xfc000000UL,
+		.phys = 0xfc000000UL,
+		.size = 0x04000000UL,
+		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+			 PTE_BLOCK_NON_SHARE |
+			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
+	}, {
+		/* List terminator */
+		0,
+	}
+};
+
+struct mm_region *mem_map = rk3562_mem_map;
+#endif
+
+#define	GPIO0_IOC_BASE			0xFF080000
+#define	GPIO1_IOC_BASE			0xFF060000
+#define	GPIO1A_IOMUX_SEL_L		0x0
+#define	GPIO1A_IOMUX_SEL_H		0x4
+#define	GPIO1B_IOMUX_SEL_L		0x8
+#define	GPIO1_IOC_GPIO1A_DS0		0x200
+#define	GPIO1_IOC_GPIO1A_DS1		0x204
+#define	GPIO1_IOC_GPIO1B_DS0		0x210
+
+#define	GPIO2_IOC_BASE			0xFF060000
+#define	GPIO2_IOC_IO_VSEL0		0x300
+/* GPIO2_IOC_IO_VSEL0 */
+#define	POC_VCCIO2_VD_3V3		BIT(12)
+
+#define	GPIO3_IOC_BASE			0xFF070000
+#define	GPIO4_IOC_BASE			0xFF070000
+
+/* UART0 iomux */
+/* gpio0d0_sel */
+#define UART0_RX_M0			1
+#define UART0_RX_M0_OFFSET		0
+#define UART0_RX_M0_ADDR		(GPIO0_IOC_BASE + 0x18)
+/* gpio0d1_sel */
+#define UART0_TX_M0			1
+#define UART0_TX_M0_OFFSET		4
+#define UART0_TX_M0_ADDR		(GPIO0_IOC_BASE + 0x18)
+
+/* gpio1b3_sel */
+#define UART0_RX_M1			2
+#define UART0_RX_M1_OFFSET		12
+#define UART0_RX_M1_ADDR		(GPIO1_IOC_BASE + 0x08)
+/* gpio1b4_sel */
+#define UART0_TX_M1			2
+#define UART0_TX_M1_OFFSET		0
+#define UART0_TX_M1_ADDR		(GPIO1_IOC_BASE + 0x0C)
+
+/* UART1 iomux */
+/* gpio1d1_sel */
+#define UART1_RX_M0			1
+#define UART1_RX_M0_OFFSET		4
+#define UART1_RX_M0_ADDR		(GPIO1_IOC_BASE + 0x18)
+/* gpio1d2_sel */
+#define UART1_TX_M0			1
+#define UART1_TX_M0_OFFSET		8
+#define UART1_TX_M0_ADDR		(GPIO1_IOC_BASE + 0x18)
+
+/* gpio4a6_sel */
+#define UART1_RX_M1			4
+#define UART1_RX_M1_OFFSET		8
+#define UART1_RX_M1_ADDR		(GPIO4_IOC_BASE + 0x64)
+/* gpio4a5_sel */
+#define UART1_TX_M1			4
+#define UART1_TX_M1_OFFSET		4
+#define UART1_TX_M1_ADDR		(GPIO4_IOC_BASE + 0x64)
+
+/* UART2 iomux */
+/* gpio0c1_sel */
+#define UART2_RX_M0			1
+#define UART2_RX_M0_OFFSET		4
+#define UART2_RX_M0_ADDR		(GPIO0_IOC_BASE + 0x10)
+/* gpio0c0_sel */
+#define UART2_TX_M0			1
+#define UART2_TX_M0_OFFSET		0
+#define UART2_TX_M0_ADDR		(GPIO0_IOC_BASE + 0x10)
+
+/* gpio3a1_sel */
+#define UART2_RX_M1			2
+#define UART2_RX_M1_OFFSET		4
+#define UART2_RX_M1_ADDR		(GPIO3_IOC_BASE + 0x40)
+/* gpio3a0_sel */
+#define UART2_TX_M1			2
+#define UART2_TX_M1_OFFSET		0
+#define UART2_TX_M1_ADDR		(GPIO3_IOC_BASE + 0x40)
+
+/* UART3 iomux */
+/* gpio4b5_sel */
+#define UART3_RX_M0			7
+#define UART3_RX_M0_OFFSET		4
+#define UART3_RX_M0_ADDR		(GPIO4_IOC_BASE + 0x6C)
+/* gpio4b4_sel */
+#define UART3_TX_M0			7
+#define UART3_TX_M0_OFFSET		0
+#define UART3_TX_M0_ADDR		(GPIO4_IOC_BASE + 0x6C)
+
+/* gpio3c0_sel */
+#define UART3_RX_M1			3
+#define UART3_RX_M1_OFFSET		0
+#define UART3_RX_M1_ADDR		(GPIO3_IOC_BASE + 0x50)
+/* gpio3b7_sel */
+#define UART3_TX_M1			3
+#define UART3_TX_M1_OFFSET		12
+#define UART3_TX_M1_ADDR		(GPIO3_IOC_BASE + 0x4C)
+
+/* UART4 iomux */
+/* gpio3d1_sel */
+#define UART4_RX_M0			4
+#define UART4_RX_M0_OFFSET		4
+#define UART4_RX_M0_ADDR		(GPIO3_IOC_BASE + 0x58)
+/* gpio3d0_sel */
+#define UART4_TX_M0			4
+#define UART4_TX_M0_OFFSET		0
+#define UART4_TX_M0_ADDR		(GPIO3_IOC_BASE + 0x58)
+
+/* gpio1d5_sel */
+#define UART4_RX_M1			3
+#define UART4_RX_M1_OFFSET		4
+#define UART4_RX_M1_ADDR		(GPIO1_IOC_BASE + 0x1C)
+/* gpio1d6_sel */
+#define UART4_TX_M1			3
+#define UART4_TX_M1_OFFSET		8
+#define UART4_TX_M1_ADDR		(GPIO1_IOC_BASE + 0x1C)
+
+/* UART5 iomux */
+/* gpio1b7_sel */
+#define UART5_RX_M0			3
+#define UART5_RX_M0_OFFSET		12
+#define UART5_RX_M0_ADDR		(GPIO1_IOC_BASE + 0xC)
+/* gpio1c0_sel */
+#define UART5_TX_M0			3
+#define UART5_TX_M0_OFFSET		0
+#define UART5_TX_M0_ADDR		(GPIO1_IOC_BASE + 0x10)
+
+/* gpio3a7_sel */
+#define UART5_RX_M1			5
+#define UART5_RX_M1_OFFSET		12
+#define UART5_RX_M1_ADDR		(GPIO3_IOC_BASE + 0x44)
+/* gpio3a6_sel */
+#define UART5_TX_M1			5
+#define UART5_TX_M1_OFFSET		8
+#define UART5_TX_M1_ADDR		(GPIO3_IOC_BASE + 0x44)
+
+/* UART6 iomux */
+/* gpio0c7_sel */
+#define UART6_RX_M0			1
+#define UART6_RX_M0_OFFSET		12
+#define UART6_RX_M0_ADDR		(GPIO0_IOC_BASE + 0x14)
+/* gpio0c6_sel */
+#define UART6_TX_M0			1
+#define UART6_TX_M0_OFFSET		8
+#define UART6_TX_M0_ADDR		(GPIO0_IOC_BASE + 0x14)
+
+/* gpio4b0_sel */
+#define UART6_RX_M1			6
+#define UART6_RX_M1_OFFSET		0
+#define UART6_RX_M1_ADDR		(GPIO4_IOC_BASE + 0x68)
+/* gpio4a7_sel */
+#define UART6_TX_M1			6
+#define UART6_TX_M1_OFFSET		12
+#define UART6_TX_M1_ADDR		(GPIO4_IOC_BASE + 0x64)
+
+/* UART7 iomux */
+/* gpio3c7_sel */
+#define UART7_RX_M0			4
+#define UART7_RX_M0_OFFSET		12
+#define UART7_RX_M0_ADDR		(GPIO3_IOC_BASE + 0x54)
+/* gpio3c4_sel */
+#define UART7_TX_M0			4
+#define UART7_TX_M0_OFFSET		0
+#define UART7_TX_M0_ADDR		(GPIO3_IOC_BASE + 0x54)
+
+/* gpio1b3_sel */
+#define UART7_RX_M1			3
+#define UART7_RX_M1_OFFSET		12
+#define UART7_RX_M1_ADDR		(GPIO1_IOC_BASE + 0x08)
+/* gpio1b4_sel */
+#define UART7_TX_M1			3
+#define UART7_TX_M1_OFFSET		0
+#define UART7_TX_M1_ADDR		(GPIO1_IOC_BASE + 0x0C)
+
+/* UART8 iomux */
+/* gpio3b3_sel */
+#define UART8_RX_M0			3
+#define UART8_RX_M0_OFFSET		12
+#define UART8_RX_M0_ADDR		(GPIO3_IOC_BASE + 0x48)
+/* gpio3b2_sel */
+#define UART8_TX_M0			3
+#define UART8_TX_M0_OFFSET		8
+#define UART8_TX_M0_ADDR		(GPIO3_IOC_BASE + 0x48)
+
+/* gpio3d5_sel */
+#define UART8_RX_M1			4
+#define UART8_RX_M1_OFFSET		4
+#define UART8_RX_M1_ADDR		(GPIO3_IOC_BASE + 0x5C)
+/* gpio3d4_sel */
+#define UART8_TX_M1			4
+#define UART8_TX_M1_OFFSET		0
+#define UART8_TX_M1_ADDR		(GPIO3_IOC_BASE + 0x5C)
+
+/* UART9 iomux */
+/* gpio4b3_sel */
+#define UART9_RX_M0			4
+#define UART9_RX_M0_OFFSET		12
+#define UART9_RX_M0_ADDR		(GPIO4_IOC_BASE + 0x68)
+/* gpio4b2_sel */
+#define UART9_TX_M0			4
+#define UART9_TX_M0_OFFSET		8
+#define UART9_TX_M0_ADDR		(GPIO4_IOC_BASE + 0x68)
+
+/* gpio3c3_sel */
+#define UART9_RX_M1			3
+#define UART9_RX_M1_OFFSET		12
+#define UART9_RX_M1_ADDR		(GPIO3_IOC_BASE + 0x50)
+/* gpio3c2_sel */
+#define UART9_TX_M1			3
+#define UART9_TX_M1_OFFSET		8
+#define UART9_TX_M1_ADDR		(GPIO3_IOC_BASE + 0x50)
+
+#define set_uart_iomux(bits_offset, bits_val, addr) \
+	writel(GENMASK(bits_offset + 19, bits_offset + 16) | (bits_val << bits_offset) , addr)
+
+#define set_uart_iomux_rx(ID, MODE) \
+	set_uart_iomux(UART##ID##_RX_M##MODE##_OFFSET, UART##ID##_RX_M##MODE, UART##ID##_RX_M##MODE##_ADDR);
+#define set_uart_iomux_tx(ID, MODE) \
+	set_uart_iomux(UART##ID##_TX_M##MODE##_OFFSET, UART##ID##_TX_M##MODE, UART##ID##_TX_M##MODE##_ADDR);
+
+void board_debug_uart_init(void)
+{
+/* UART 0 */
+#if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff210000)
+
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART0_M0 Switch iomux */
+	set_uart_iomux_rx(0, 0);
+	set_uart_iomux_tx(0, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART0_M1 Switch iomux */
+	set_uart_iomux_rx(0, 1);
+	set_uart_iomux_tx(0, 1);
+#endif
+/* UART 1 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff670000)
+
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART1_M0 Switch iomux */
+	set_uart_iomux_rx(1, 0);
+	set_uart_iomux_tx(1, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART1_M1 Switch iomux */
+	set_uart_iomux_rx(1, 1);
+	set_uart_iomux_tx(1, 1);
+#endif
+/* UART 2 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff680000)
+
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART2_M0 Switch iomux */
+	set_uart_iomux_rx(2, 0);
+	set_uart_iomux_tx(2, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART2_M1 Switch iomux */
+	set_uart_iomux_rx(2, 1);
+	set_uart_iomux_tx(2, 1);
+#endif
+/* UART 3 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff690000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART3_M0 Switch iomux */
+	set_uart_iomux_rx(3, 0);
+	set_uart_iomux_tx(3, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART3_M1 Switch iomux */
+	set_uart_iomux_rx(3, 1);
+	set_uart_iomux_tx(3, 1);
+#endif
+/* UART 4 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6a0000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART4_M0 Switch iomux */
+	set_uart_iomux_rx(4, 0);
+	set_uart_iomux_tx(4, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART4_M1 Switch iomux */
+	set_uart_iomux_rx(4, 1);
+	set_uart_iomux_tx(4, 1);
+#endif
+/* UART 5 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6b0000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART5_M0 Switch iomux */
+	set_uart_iomux_rx(5, 0);
+	set_uart_iomux_tx(5, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART5_M1 Switch iomux */
+	set_uart_iomux_rx(5, 1);
+	set_uart_iomux_tx(5, 1);
+#endif
+/* UART 6 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6c0000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART6_M0 Switch iomux */
+	set_uart_iomux_rx(6, 0);
+	set_uart_iomux_tx(6, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART6_M1 Switch iomux */
+	set_uart_iomux_rx(6, 1);
+	set_uart_iomux_tx(6, 1);
+#endif
+/* UART 7 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6d0000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART7_M0 Switch iomux */
+	set_uart_iomux_rx(7, 0);
+	set_uart_iomux_tx(7, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART7_M1 Switch iomux */
+	set_uart_iomux_rx(7, 1);
+	set_uart_iomux_tx(7, 1);
+#endif
+/* UART 8 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6e0000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART8_M0 Switch iomux */
+	set_uart_iomux_rx(8, 0);
+	set_uart_iomux_tx(8, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART8_M1 Switch iomux */
+	set_uart_iomux_rx(8, 1);
+	set_uart_iomux_tx(8, 1);
+#endif
+/* UART 9 */
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6f0000)
+#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0)
+
+	/* UART9_M0 Switch iomux */
+	set_uart_iomux_rx(9, 0);
+	set_uart_iomux_tx(9, 0);
+#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \
+	(CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1)
+
+	/* UART9_M1 Switch iomux */
+	set_uart_iomux_rx(9, 1);
+	set_uart_iomux_tx(9, 1);
+#endif
+#endif
+}
+
+int fit_standalone_release(char *id, uintptr_t entry_point)
+{
+	/* bus m0 configuration: */
+	/* open hclk_dcache / hclk_icache / clk_bus m0 rtc / fclk_bus_m0_core */
+	writel(0x03180000, TOP_CRU_BASE + TOP_CRU_GATE_CON23);
+
+	/* open bus m0 sclk / bus m0 hclk / bus m0 dclk */
+	writel(0x00070000, TOP_CRU_BASE + TOP_CRU_CM0_GATEMASK);
+
+	/* mcu_cache_peripheral_addr */
+	writel(0xa0000000, SYS_GRF_BASE + SYS_GRF_SOC_CON5);
+	writel(0xffb40000, SYS_GRF_BASE + SYS_GRF_SOC_CON6);
+
+	sip_smc_mcu_config(ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID,
+			   ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR,
+			   0xffff0000 | (entry_point >> 16));
+	sip_smc_mcu_config(ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID,
+			   ROCKCHIP_SIP_CONFIG_MCU_EXPERI_START_ADDR, 0xffffa000);
+
+	/* release dcache / icache / bus m0 jtag / bus m0 */
+	writel(0x03280000, TOP_CRU_BASE + TOP_CRU_SOFTRST_CON23);
+
+	/* release pmu m0 jtag / pmu m0 */
+	/* writel(0x00050000, PMU1_CRU_BASE + PMU1_CRU_SOFTRST_CON02); */
+
+	return 0;
+}
+
+#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
+static void qos_priority_init(void)
+{
+	u32 delay;
+	u32 i;
+
+	/* power up vo,vi,gpu */
+	rk_clrreg(PMU_BASE_ADDR + PMU2_PWR_GATE_SFTCON0,
+		  PD_VO_DWN_SFTENA | PD_VI_DWN_SFTENA);
+	delay = 1000;
+	do {
+		udelay(1);
+		delay--;
+		if (delay == 0) {
+			printf("Fail to set domain. PMU2_PWR_GATE_STS0=0x%x\n",
+			       readl(PMU_BASE_ADDR + PMU2_PWR_GATE_STS0));
+			hang();
+		}
+	} while (readl(PMU_BASE_ADDR + PMU2_PWR_GATE_STS0) &
+		 (PD_VO_DWN_SFTENA | PD_VI_DWN_SFTENA));
+	/* power up vop memory */
+	for (i = 0; i < 16; i++)
+		rk_clrreg(PMU_BASE_ADDR + PMU2_MEM_SD_SFTCON0, BIT(i));
+
+	/* release vo,vi,gpu idle request */
+	rk_clrreg(PMU_BASE_ADDR + PMU2_BIU_IDLE_SFTCON0,
+		  (IDLE_REQ_VO_SFTENA | IDLE_REQ_VI_SFTENA));
+
+	delay = 1000;
+	/* wait ack status */
+	do {
+		udelay(1);
+		delay--;
+		if (delay == 0) {
+			printf("Fail to get ack on domain. PMU2_BIU_IDLE_ACK_STS0=0x%x\n",
+			       readl(PMU_BASE_ADDR + PMU2_BIU_IDLE_ACK_STS0));
+			hang();
+		}
+	} while (readl(PMU_BASE_ADDR + PMU2_BIU_IDLE_ACK_STS0) &
+		 (IDLE_ACK_VO | IDLE_ACK_VI));
+
+	delay = 1000;
+	/* wait idle status */
+	do {
+		udelay(1);
+		delay--;
+		if (delay == 0) {
+			printf("Fail to set idle on domain. PMU2_BIT_IDLE_STS0=0x%x\n",
+			       readl(PMU_BASE_ADDR + PMU2_BIT_IDLE_STS0));
+			hang();
+		}
+	} while (readl(PMU_BASE_ADDR + PMU2_BIT_IDLE_STS0) &
+		 (IDLE_VO | IDLE_VI));
+
+	/*
+	 * modify default qos priority setting, then
+	 * Peri > VOP/ISP/VICAP > CPU > GPU/NPU/RKVDEC/RGA/Other
+	 * (5)    (4)             (3)   (2)
+	 *
+	 * NOTE: GPU qos init is in kernel, in case that vdd gpu is off now.
+	 */
+	writel(QOS_PRIORITY_LEVEL(5, 5), CRYPTO_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), DMAC_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), EMMC_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), FSPI_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), GMAC_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), MAC100_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), MCU_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), RKDMA_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), SDMMC0_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), SDMMC1_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), USB2_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(5, 5), USB3_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(4, 4), ISP_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(4, 4), VICAP_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(4, 4), VOP_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(2, 2), DCF_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(2, 2), DMA2DDR_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(2, 2), PCIE_PRIORITY_REG);
+}
+
+int arch_cpu_init(void)
+{
+	u32 val;
+
+	/* Set the emmc to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST4_REG);
+	writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST4_REG);
+
+	/* Set the sdmmc to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
+	writel(val & 0xff0000ff, FIREWALL_DDR_BASE + FW_DDR_MST6_REG);
+
+	/*
+	 * Set SAIx_MCLK as input default
+	 *
+	 * It's safe to set mclk as input default to avoid high freq glitch
+	 * which may make devices work unexpected. And then enabled by
+	 * kernel stage or any state where user use it.
+	 */
+	writel(0x0a100000, PERI_GRF_BASE + PERI_GRF_AUDIO_CON);
+
+	/* Assert reset the pipe phy to save power and de-assert when in use */
+	writel(0x00030001, PIPEPHY_GRF_BASE + PIPEPHY_PIPE_CON5);
+
+#if defined(CONFIG_ROCKCHIP_SFC)
+	/* Set the fspi to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST5_REG);
+	writel(val & 0x00ffffff, FIREWALL_DDR_BASE + FW_DDR_MST5_REG);
+
+	/*
+	 * Fix fspi io ds level:
+	 *
+	 * level 2 for 1V8
+	 * level 3 for 3V3
+	 */
+	if (readl(GPIO1_IOC_BASE + GPIO1A_IOMUX_SEL_L) == 0x2222) {
+		if (readl(GPIO2_IOC_BASE + GPIO2_IOC_IO_VSEL0) & POC_VCCIO2_VD_3V3) {
+			writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS0);
+			writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS1);
+			writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1B_DS0);
+		} else {
+			writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS0);
+			writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS1);
+			writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1B_DS0);
+		}
+	}
+#endif
+
+	qos_priority_init();
+
+	return 0;
+}
+#endif
diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c b/u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c
new file mode 100644
index 0000000..811c4e3
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c
@@ -0,0 +1,26 @@
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch/clock.h>
+
+static const struct udevice_id rk3562_syscon_ids[] = {
+	{ .compatible = "rockchip,rk3562-sys-grf", .data = ROCKCHIP_SYSCON_GRF },
+	{ .compatible = "rockchip,rk3562-pmu-grf", .data = ROCKCHIP_SYSCON_PMUGRF },
+	{ .compatible = "rockchip,rk3562-ioc-grf", .data = ROCKCHIP_SYSCON_IOC },
+	{ }
+};
+
+U_BOOT_DRIVER(syscon_rk3562) = {
+	.name = "rk3562_syscon",
+	.id = UCLASS_SYSCON,
+	.of_match = rk3562_syscon_ids,
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.bind = dm_scan_fdt_dev,
+#endif
+};
diff --git a/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c b/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c
index debd642..ef6df66 100644
--- a/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c
+++ b/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c
@@ -777,6 +777,23 @@
 #endif
 }
 
+int fit_standalone_release(char *id, uintptr_t entry_point)
+{
+	/* risc-v configuration: */
+	/* Reset the scr1 */
+	writel(0x04000400, CRU_BASE + CRU_SOFTRST_CON26);
+	udelay(100);
+
+	/* set the scr1 addr */
+	writel((0xffff0000) | (entry_point >> 16), GRF_BASE + GRF_SOC_CON4);
+	udelay(10);
+
+	/* release the scr1 */
+	writel(0x04000000, CRU_BASE + CRU_SOFTRST_CON26);
+
+	return 0;
+}
+
 #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
 static void qos_priority_init(void)
 {
diff --git a/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c b/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c
index 7323d96..678d558 100644
--- a/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c
+++ b/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c
@@ -19,20 +19,31 @@
 #define FIREWALL_DDR_BASE		0xfe030000
 #define FW_DDR_MST5_REG			0x54
 #define FW_DDR_MST13_REG		0x74
+#define FW_DDR_MST19_REG		0x8c
 #define FW_DDR_MST21_REG		0x94
 #define FW_DDR_MST26_REG		0xa8
 #define FW_DDR_MST27_REG		0xac
 #define FIREWALL_SYSMEM_BASE		0xfe038000
 #define FW_SYSM_MST5_REG		0x54
 #define FW_SYSM_MST13_REG		0x74
+#define FW_SYSM_MST19_REG		0x8c
 #define FW_SYSM_MST21_REG		0x94
 #define FW_SYSM_MST26_REG		0xa8
 #define FW_SYSM_MST27_REG		0xac
+#define PMU1_SGRF_BASE			0xfd582000
+#define PMU1_SGRF_SOC_CON0		0x0
+#define PMU1_SGRF_SOC_CON6		0x18
+#define PMU1_SGRF_SOC_CON7		0x1c
+#define PMU1_SGRF_SOC_CON8		0x20
+#define PMU1_SGRF_SOC_CON9		0x24
+#define PMU1_SGRF_SOC_CON10		0x28
+#define PMU1_SGRF_SOC_CON13		0x34
 #define SYS_GRF_BASE			0xfd58c000
 #define SYS_GRF_SOC_CON6		0x0318
 #define USBGRF_BASE			0xfd5ac000
 #define USB_GRF_USB3OTG0_CON1		0x001c
 #define BUS_SGRF_BASE			0xfd586000
+#define BUS_SGRF_SOC_CON2		0x08
 #define BUS_SGRF_FIREWALL_CON18		0x288
 #define PMU_BASE			0xfd8d0000
 #define PMU_PWR_GATE_SFTCON1		0x8150
@@ -66,14 +77,21 @@
 #define EMMC_IOC_GPIO2D_DS_H		0x5c
 
 #define CRU_BASE			0xfd7c0000
+#define CRU_GPLL_CON1			0x01c4
 #define CRU_SOFTRST_CON77		0x0b34
+#define CRU_GLB_RST_CON			0x0c10
 
 #define PMU1CRU_BASE			0xfd7f0000
+#define PMU1CRU_SOFTRST_CON00		0x0a00
 #define PMU1CRU_SOFTRST_CON03		0x0a0c
 #define PMU1CRU_SOFTRST_CON04		0x0a10
 
 #define HDMIRX_NODE_FDT_PATH		"/hdmirx-controller@fdee0000"
 #define RK3588_PHY_CONFIG		0xfdee00c0
+
+#define VOP_M0_PRIORITY_REG		0xfdf82008
+#define VOP_M1_PRIORITY_REG		0xfdf82208
+#define QOS_PRIORITY_LEVEL(h, l)	((((h) & 7) << 8) | ((l) & 7))
 
 #ifdef CONFIG_ARM64
 #include <asm/armv8/mmu.h>
@@ -865,8 +883,15 @@
 	secure_reg &= 0xffff0000;
 	writel(secure_reg, FIREWALL_SYSMEM_BASE + FW_SYSM_MST27_REG);
 
-	/* Select clk_tx source as default for i2s2/i2s3 */
-	writel(0x03400340, SYS_GRF_BASE + SYS_GRF_SOC_CON6);
+	/*
+	 * Select clk_tx source as default for i2s2/i2s3
+	 * Set I2Sx_MCLK as input default
+	 *
+	 * It's safe to set mclk as input default to avoid high freq glitch
+	 * which may make devices work unexpected. And then enabled by
+	 * kernel stage or any state where user use it.
+	 */
+	writel(0x03c703c7, SYS_GRF_BASE + SYS_GRF_SOC_CON6);
 
 	if (readl(BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_L) == 0x2222) {
 		/* Set the fspi m0 io ds level to 55ohm */
@@ -922,7 +947,14 @@
 	writel(0xffff1111, BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_L);
 	writel(0xffff1111, BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_H);
 #endif
-
+	/*
+	 * set VOP M0 and VOP M1 to priority 0x303,then
+	 * Peri > VOP/MCU > ISP/VICAP > other
+	 * Note: VOP priority can only be modified during the u-boot stage,
+	 * 	 as VOP default power down, and power up after trust.
+	 */
+	writel(QOS_PRIORITY_LEVEL(3, 3), VOP_M0_PRIORITY_REG);
+	writel(QOS_PRIORITY_LEVEL(3, 3), VOP_M1_PRIORITY_REG);
 #endif
 
 	/* Select usb otg0 phy status to 0 that make rockusb can work at high-speed */
@@ -1245,31 +1277,36 @@
 #ifdef CONFIG_SPL_BUILD
 int spl_fit_standalone_release(char *id, uintptr_t entry_point)
 {
-	/* gpll enable */
-	writel(0x00f00042, 0xfd7c01c4);
+	u32 val;
+
+	/* pmu m0 configuration: */
+	/* set gpll */
+	writel(0x00f00042, CRU_BASE + CRU_GPLL_CON1);
+	/* set pmu mcu to access ddr memory */
+	val = readl(FIREWALL_DDR_BASE + FW_DDR_MST19_REG);
+	writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST19_REG);
+	/* set pmu mcu to access system memory */
+	val = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST19_REG);
+	writel(val & 0x000000ff, FIREWALL_SYSMEM_BASE + FW_SYSM_MST19_REG);
+	/* set pmu mcu to secure */
+	writel(0x00080000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON0);
 	/* set start addr, pmu_mcu_code_addr_start */
-	writel(0xFFFF0000 | (entry_point >> 16), 0xFD582024);
-	/* pmu_mcu_sram_addr_start */
-	writel(0xFFFF2000, 0xFD582028);
-	/* pmu_mcu_tcm_addr_start */
-	writel(0xFFFF2000, 0xFD582034);
-	/* set mcu secure */
-	writel(0x00080000, 0xFD582000);
+	writel(0xFFFF0000 | (entry_point >> 16), PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON9);
+	/* set pmu_mcu_sram_addr_start */
+	writel(0xFFFF2000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON10);
+	/* set pmu_mcu_tcm_addr_start */
+	writel(0xFFFF2000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON13);
 	/* set cache cache_peripheral_addr */
-	writel(0xffff0000, 0xFD582018);
-	writel(0xffffee00, 0xFD58201c);
-	writel(0x00ff00ff, 0xFD582020);  /* 0xf0000000 ~ 0xfee00000 */
-	/* mcupmu access DDR secure control, each bit for a region. */
-	writel(0x0000ffff, 0xFE03008C);
-	/* mcupmu access DDR secure control, each bit for a region. */
-	writel(0x000000ff, 0xFE03808C);
-	/* PMU WDT reset system enable */
-	writel(0x02000200, 0xFD586008);
-	/* WDT trigger global reset. */
-	writel(0x08400840, 0xFD7C0C10);
-	/* Spl helps to load the mcu image, but not need to release
-	 * mcu for rk3588.
-	 */
+	/* 0xf0000000 ~ 0xfee00000 */
+	writel(0xffff0000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON6);
+	writel(0xffffee00, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON7);
+	writel(0x00ff00ff, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON8);
+	/* enable PMU WDT reset system */
+	writel(0x02000200, BUS_SGRF_BASE + BUS_SGRF_SOC_CON2);
+	/* select WDT trigger global reset. */
+	writel(0x08400840, CRU_BASE + CRU_GLB_RST_CON);
+	/* release pmu mcu */
+	/* writel(0x20000000, PMU1CRU_BASE + PMU1CRU_SOFTRST_CON00); */
 
 	return 0;
 }
diff --git a/u-boot/arch/arm/mach-rockchip/rk_meta.c b/u-boot/arch/arm/mach-rockchip/rk_meta.c
index e35391f..8c0cce9 100644
--- a/u-boot/arch/arm/mach-rockchip/rk_meta.c
+++ b/u-boot/arch/arm/mach-rockchip/rk_meta.c
@@ -50,6 +50,7 @@
 	ulong sector;
 	char *data;
 	u64 len;
+	int meta_iq_item_size = 0;
 
 	if (part_get_info_by_name(info->dev, part_name, &part_info) <= 0) {
 		debug("%s: no partition\n", __func__);
@@ -91,32 +92,31 @@
 
 	/* load compress data */
 	data = (char *)COMPRESS_LOAD_ADDR;
+	meta_iq_item_size = meta_p->iq_item_size + meta.comp_size;
 	if (meta_p->comp_type == META_COMPRESS_TYPE_GZ) {
 		if (info->read(info, sector + (MAX_META_SEGMENT_SIZE / info->bl_len),
-			       DIV_ROUND_UP(meta.comp_size, info->bl_len), data)
-			       != DIV_ROUND_UP(meta.comp_size, info->bl_len)) {
-			debug("%s: Failed to read compress data.\n", __func__);
+			       DIV_ROUND_UP(meta_iq_item_size, info->bl_len), data)
+			       != DIV_ROUND_UP(meta_iq_item_size, info->bl_len)) {
+			printf("%s: Failed to read compress data.\n", __func__);
 			return -EIO;
 		}
+
+		memcpy((void *)(meta_p->load + SENSOR_IQ_BIN_OFFSET), data, meta_p->iq_item_size);
 
 		if (rk_meta_iq_decom((meta_p->load + meta_p->comp_off),
 				     (unsigned long)(data + meta_p->comp_off -
 							MAX_META_SEGMENT_SIZE),
 					 meta.comp_size, &len)) {
-			debug("%s: Failed to decompress.\n", __func__);
+			printf("%s: Failed to decompress.\n", __func__);
 			return -EIO;
 		}
-		/* update decompress gz's file size */
-		unsigned int *p_len = (unsigned int *)
-			(meta_p->load + MAX_META_SEGMENT_SIZE + MAX_HEAD_SIZE);
-		*p_len = (u32)len;
-		/* TODO: update decompress gz's file crc32 */
+
 	} else {
 		if (info->read(info, sector + (MAX_META_SEGMENT_SIZE / info->bl_len),
-			       DIV_ROUND_UP(meta.comp_size, info->bl_len),
+			       DIV_ROUND_UP(meta_iq_item_size, info->bl_len),
 		   (void *)(meta_p->load + MAX_META_SEGMENT_SIZE))
-		   != DIV_ROUND_UP(meta.comp_size, info->bl_len)) {
-			debug("%s: Failed to read\n", __func__);
+		   != DIV_ROUND_UP(meta_iq_item_size, info->bl_len)) {
+			printf("%s: Failed to read\n", __func__);
 			return -EIO;
 		}
 	}
@@ -125,6 +125,7 @@
 	flush_cache(meta_p->load, meta_p->size);
 	rk_meta_process();
 
+	printf("\nMeta: ok\n");
 	return 0;
 }
 
diff --git a/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c b/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c
index 0cff596..cd02914 100644
--- a/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c
+++ b/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c
@@ -61,6 +61,15 @@
 	return res.a0;
 }
 
+int sip_smc_remotectl_config(unsigned long func, unsigned long data)
+{
+	struct arm_smccc_res res;
+
+	res = __invoke_sip_fn_smc(SIP_REMOTECTL_CFG, func, data, 0);
+
+	return res.a0;
+}
+
 int sip_smc_amp_cfg(unsigned long func, unsigned long arg0, unsigned long arg1,
 		    unsigned long arg2)
 {
@@ -142,3 +151,11 @@
 
 	return 0;
 }
+
+int sip_smc_mcu_config(unsigned long mcu_id, unsigned long func, unsigned long arg2)
+{
+	struct arm_smccc_res res;
+
+	res = __invoke_sip_fn_smc(SIP_MCU_CFG, mcu_id, func, arg2);
+	return res.a0;
+}
diff --git a/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c b/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c
index 76d3d51..cbbd106 100644
--- a/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c
+++ b/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c
@@ -7,6 +7,9 @@
 #include <boot_rkimg.h>
 #include <cli.h>
 #include <debug_uart.h>
+#include <miiphy.h>
+#include <syscon.h>
+#include <asm/arch/clock.h>
 #include <asm/io.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/grf_rv1106.h>
@@ -538,15 +541,65 @@
 }
 #endif
 
-int rk_board_late_init(void)
-{
-#if defined(CONFIG_CMD_SCRIPT_UPDATE)
-	struct blk_desc *desc;
+#if (defined CONFIG_MII || defined CONFIG_CMD_MII || defined CONFIG_PHYLIB)
+#define GMAC_NODE_FDT_PATH		"/ethernet@ffa80000"
+#define RK630_MII_NAME			"ethernet@ffa80000"
+#define	PHY_ADDR			2
+#define	PAGE_SWITCH			0x1f
+#define	DISABLE_APS_REG			0x12
+#define	DISABLE_APS_VAL			0x4824
+#define	PHYAFE_PDCW_REG			0x1c
+#define	PHYAFE_PDCW_VAL			0x8880
+#define	PD_ANALOG_REG			0x0
+#define PD_ANALOG_VAL			0x3900
+#define RV1106_MACPHY_SHUTDOWN		BIT(1)
+#define RV1106_MACPHY_ENABLE_MASK	BIT(1)
 
-	desc = rockchip_get_bootdev();
-	if (desc && desc->if_type == IF_TYPE_MMC && desc->devnum == 1)
-		run_command("sd_update", 0);
-#endif
+static int rk_board_fdt_pwrdn_gmac(const void *blob)
+{
+	void *fdt = (void *)gd->fdt_blob;
+	struct rv1106_grf *grf;
+	int gmac_node;
+
+	/* Turn off GMAC FEPHY to reduce chip power consumption at uboot level,
+	 * if the gmac node is disabled at kernel dtb. RV1106/1103 has the
+	 * internal gmac phy, u-boot.dtb defines and enables the gmac node
+	 * by default, so even if the gmac node of the kernel dts is disabled,
+	 * U-Boot will enable and initialize the gmac phy. So it is not okay
+	 * to turn off gmac phy by default in arch_cpu_init(), need to turn off
+	 * gmac phy in the current function.
+	 */
+	gmac_node = fdt_path_offset(gd->fdt_blob, GMAC_NODE_FDT_PATH);
+	if (fdt_stringlist_search(fdt, gmac_node, "status", "disabled") >= 0) {
+		/* switch to page 1 */
+		miiphy_write(RK630_MII_NAME, PHY_ADDR, PAGE_SWITCH, 0x0100);
+		miiphy_write(RK630_MII_NAME, PHY_ADDR, DISABLE_APS_REG,
+			     DISABLE_APS_VAL);
+		/* switch to pae 6 */
+		miiphy_write(RK630_MII_NAME, PHY_ADDR, PAGE_SWITCH, 0x0600);
+		miiphy_write(RK630_MII_NAME, PHY_ADDR, PHYAFE_PDCW_REG,
+			     PHYAFE_PDCW_VAL);
+		/* switch to page 0 */
+		miiphy_write(RK630_MII_NAME, PHY_ADDR, PAGE_SWITCH, 0x0000);
+		miiphy_write(RK630_MII_NAME, PHY_ADDR, PD_ANALOG_REG,
+			     PD_ANALOG_VAL);
+
+		grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+		if (grf)
+			rk_clrsetreg(&grf->macphy_con0,
+				     RV1106_MACPHY_ENABLE_MASK,
+				     RV1106_MACPHY_SHUTDOWN);
+	}
+
 	return 0;
 }
+#endif
 
+int rk_board_fdt_fixup(const void *blob)
+{
+#if (defined CONFIG_MII || defined CONFIG_CMD_MII || defined CONFIG_PHYLIB)
+	rk_board_fdt_pwrdn_gmac(blob);
+#endif
+
+	return 0;
+}
diff --git a/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c b/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c
index 311310d..2f712e2 100644
--- a/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c
+++ b/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c
@@ -63,6 +63,9 @@
 #define PMU_PWR_DWN_ST		(0x108)
 #define PMU_PWR_GATE_SFTCON	(0x110)
 
+#define PMU_BUS_IDLE_NPU	BIT(18)
+#define PMU_BUS_IDLE_VEPU	BIT(9)
+
 #define CRU_BASE		0xFF490000
 #define CRU_CLKSEL_CON02	0x108
 #define CRU_CLKSEL_CON03	0x10c
@@ -548,6 +551,7 @@
 	 * CONFIG_DM_RAMDISK: for ramboot that without SPL.
 	 */
 #if defined(CONFIG_SPL_BUILD) || defined(CONFIG_DM_RAMDISK)
+	u32 pd_st, idle_st;
 	int delay;
 
 	/*
@@ -624,11 +628,7 @@
 	do {
 		udelay(1);
 		delay--;
-		if (delay == 0) {
-			printf("Fail to set domain.");
-			hang();
-		}
-	} while (readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST));
+	} while (delay && readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST));
 
 	/* release all idle request */
 	writel(0xffff0000, PMU_BASE_ADDR + PMU_BUS_IDLE_SFTCON(0));
@@ -639,22 +639,30 @@
 	do {
 		udelay(1);
 		delay--;
-		if (delay == 0) {
-			printf("Fail to get ack on domain.\n");
-			hang();
-		}
-	} while (readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ACK));
+	} while (delay && readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ACK));
 
 	delay = 1000;
 	/* wait idle status */
 	do {
 		udelay(1);
 		delay--;
-		if (delay == 0) {
-			printf("Fail to set idle on domain.\n");
-			hang();
-		}
-	} while (readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST));
+	} while (delay && readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST));
+
+	pd_st = readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST);
+	idle_st = readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST);
+
+	if (pd_st || idle_st) {
+		printf("PMU_PWR_DOWN_ST: 0x%08x\n", pd_st);
+		printf("PMU_BUS_IDLE_ST: 0x%08x\n", idle_st);
+
+		if (idle_st & PMU_BUS_IDLE_NPU)
+			printf("Failed to enable PD_NPU, please check VDD_NPU is supplied\n");
+
+		if (idle_st & PMU_BUS_IDLE_VEPU)
+			printf("Failed to enable PD_VEPU, please check VDD_VEPU is supplied\n");
+
+		hang();
+	}
 
 	writel(0x303, USB_HOST_PRIORITY_REG);
 	writel(0x303, USB_OTG_PRIORITY_REG);
diff --git a/u-boot/arch/arm/mach-rockchip/spl.c b/u-boot/arch/arm/mach-rockchip/spl.c
index 6ee6933..0bf425c 100644
--- a/u-boot/arch/arm/mach-rockchip/spl.c
+++ b/u-boot/arch/arm/mach-rockchip/spl.c
@@ -19,6 +19,7 @@
 #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
 #include <asm/arch/rk_atags.h>
 #endif
+#include <asm/arch/pcie_ep_boot.h>
 #include <asm/arch/sdram.h>
 #include <asm/arch/boot_mode.h>
 #include <asm/arch-rockchip/sys_proto.h>
@@ -175,6 +176,9 @@
 	printascii("U-Boot SPL board init");
 #endif
 	gd->sys_start_tick = get_ticks();
+#ifdef CONFIG_SPL_PCIE_EP_SUPPORT
+	rockchip_pcie_ep_init();
+#endif
 #ifdef CONFIG_SPL_FRAMEWORK
 	ret = spl_early_init();
 	if (ret) {
@@ -197,6 +201,9 @@
 
 	arch_cpu_init();
 	rk_board_init_f();
+#ifdef CONFIG_SPL_RAM_DEVICE
+	rockchip_pcie_ep_get_firmware();
+#endif
 #if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT)
 	back_to_bootrom(BROM_BOOT_NEXTSTAGE);
 #endif
@@ -368,7 +375,10 @@
 		spl->next_stage = SPL_NEXT_STAGE_KERNEL;
 		break;
 	default:
-		spl->next_stage = SPL_NEXT_STAGE_UBOOT;
+		if ((reg_boot_mode & REBOOT_FLAG) != REBOOT_FLAG)
+			spl->next_stage = SPL_NEXT_STAGE_KERNEL;
+		else
+			spl->next_stage = SPL_NEXT_STAGE_UBOOT;
 	}
 }
 #endif
diff --git a/u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c b/u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c
new file mode 100644
index 0000000..9d3a6a1
--- /dev/null
+++ b/u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c
@@ -0,0 +1,689 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2023 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <spl.h>
+#include <asm/io.h>
+#include <asm/arch/cpu.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/ioc_rk3588.h>
+#include <dt-bindings/clock/rk3588-cru.h>
+#include <pci.h>
+#include <asm/arch/rk_atags.h>
+
+#ifndef CONFIG_SPL_LOAD_FIT_ADDRESS
+#error "SPL_LOAD_FIT_ADDRESS not defined!"
+#endif
+
+#define printep(fmt, ...) \
+		do { \
+			printf("RKEP: %d - ", readl(CONFIG_ROCKCHIP_STIMER_BASE + 0x2c) / 24); \
+			printf(fmt, ##__VA_ARGS__); \
+		} while (0)
+
+#ifdef CONFIG_ROCKCHIP_RK3588
+#define PCIE_SNPS_DBI_BASE	0xf5000000
+#define PCIE_SNPS_APB_BASE	0xfe150000
+#define PCIE_SNPS_IATU_BASE	0xa40300000
+
+#define PCI_RESBAR		0x2e8
+#elif CONFIG_ROCKCHIP_RK3568
+#define PCIE_SNPS_DBI_BASE	0xf6000000
+#define PCIE_SNPS_APB_BASE	0xfe280000
+#define PCIE_SNPS_IATU_BASE	0x3c0b00000
+
+#define PCI_RESBAR		0x2b8
+#else
+#error "this soc is not support pcie ep!"
+#endif
+
+#define RKEP_BAR0_ADDR		0x3c000000
+#define RKEP_BAR2_ADDR		CONFIG_SPL_LOAD_FIT_ADDRESS
+#define RKEP_BAR0_CMD_ADDR	(RKEP_BAR0_ADDR + 0x400)
+#define RKEP_BOOT_MAGIC		0x524b4550 /* RKEP */
+#define RKEP_CMD_LOADER_RUN	0x524b4501
+
+#define PCI_EXP_LNKCAP		12	/* Link Capabilities */
+#define PCI_EXP_LNKCTL2		48	/* Link Control 2 */
+#define PCI_EXP_LNKCTL2_TLS		0x000f
+#define PCI_EXP_LNKCAP_SLS		0x0000000f
+
+#define PCI_EXP_LNKCTL2_TLS_2_5GT	0x0001 /* Supported Speed 2.5GT/s */
+#define PCI_EXP_LNKCTL2_TLS_5_0GT	0x0002 /* Supported Speed 5GT/s */
+#define PCI_EXP_LNKCTL2_TLS_8_0GT	0x0003 /* Supported Speed 8GT/s */
+
+/* Synopsys-specific PCIe configuration registers */
+#define PCIE_PORT_LINK_CONTROL		0x710
+#define PORT_LINK_MODE_MASK		(0x3f << 16)
+#define PORT_LINK_MODE_1_LANES		(0x1 << 16)
+#define PORT_LINK_MODE_2_LANES		(0x3 << 16)
+#define PORT_LINK_MODE_4_LANES		(0x7 << 16)
+#define PORT_LINK_MODE_8_LANES		(0xf << 16)
+
+#define PCIE_LINK_WIDTH_SPEED_CONTROL	0x80C
+#define PORT_LOGIC_SPEED_CHANGE		(0x1 << 17)
+#define PORT_LOGIC_LINK_WIDTH_MASK	(0x1f << 8)
+#define PORT_LOGIC_LINK_WIDTH_1_LANES	(0x1 << 8)
+#define PORT_LOGIC_LINK_WIDTH_2_LANES	(0x2 << 8)
+#define PORT_LOGIC_LINK_WIDTH_4_LANES	(0x4 << 8)
+#define PORT_LOGIC_LINK_WIDTH_8_LANES	(0x8 << 8)
+
+#define PCIE_DIRECT_SPEED_CHANGE	(0x1 << 17)
+
+#define LINK_WAIT_IATU			10000
+#define PCIE_ATU_ENABLE			(0x1 << 31)
+#define PCIE_ATU_BAR_MODE_ENABLE	(0x1 << 30 | 1 << 19)
+#define PCIE_ATU_UNR_REGION_CTRL1	0x00
+#define PCIE_ATU_UNR_REGION_CTRL2	0x04
+#define PCIE_ATU_CPU_ADDR_LOW		0x14
+#define PCIE_ATU_CPU_ADDR_HIGH		0x18
+
+/* SRNS: Use Separate refclk(internal clock) instead of from RC */
+// #define PCIE_ENABLE_SRNS_PLL_REFCLK
+
+struct rkpcie_cmd {
+	u32 cmd;
+	u32 size;
+	u32 data[6];
+};
+
+/* rkep device mode status definition */
+#define RKEP_MODE_BOOTROM	1
+#define RKEP_MODE_LOADER	2
+#define RKEP_MODE_KERNEL	3
+
+/* Common status */
+#define RKEP_SMODE_INIT		0
+#define RKEP_SMODE_LNKRDY	1
+#define RKEP_SMODE_LNKUP	2
+#define RKEP_SMODE_ERR		0xff
+/* Firmware download status */
+#define RKEP_SMODE_FWDLRDY	0x10
+#define RKEP_SMODE_FWDLDONE	0x11
+/* Application status*/
+#define RKEP_SMODE_APPRDY	0x20
+
+struct rkpcie_boot {
+	/* magic: "RKEP" */
+	u32 magic;
+	u32 version;
+	struct {
+		u16 mode;
+		u16 submode;
+	} devmode;
+	/* Size of ATAGS for cap */
+	u32 cap_size;
+	struct {
+		u8 cmd;
+		u8 status;
+		/* Error code for current CMD */
+		u16 opcode;
+	} cmd_status;
+	u32 reserved[2];
+	/* RK ATAGS, for mem and other info */
+	struct tag cap;
+	/* offset 0x400 */
+	struct rkpcie_cmd cmd;
+};
+
+static void pcie_inbound_config(void)
+{
+	u64 base = PCIE_SNPS_IATU_BASE + 0x100;
+	u32 val;
+	char i;
+
+	/* BAR0: RKEP_BAR0_ADDR */
+	writel(RKEP_BAR0_ADDR, base + PCIE_ATU_CPU_ADDR_LOW);
+	writel(0, base + PCIE_ATU_CPU_ADDR_HIGH);
+	writel(0, base + PCIE_ATU_UNR_REGION_CTRL1);
+	/* PCIE_ATU_UNR_REGION_CTRL2 */
+	writel(PCIE_ATU_ENABLE | PCIE_ATU_BAR_MODE_ENABLE | (0 << 8),
+	       base + PCIE_ATU_UNR_REGION_CTRL2);
+	for (i = 0; i < 5; i++) {
+		val = readl(base + PCIE_ATU_UNR_REGION_CTRL2);
+		if (val & PCIE_ATU_ENABLE)
+			break;
+		udelay(LINK_WAIT_IATU);
+	}
+	printep("BAR0: 0x%x\n", RKEP_BAR0_ADDR);
+
+	/* BAR2: RKEP_BAR2_ADDR */
+	writel(RKEP_BAR2_ADDR, base + PCIE_ATU_CPU_ADDR_LOW + 0x200);
+	writel(0, base + PCIE_ATU_CPU_ADDR_HIGH + 0x200);
+	writel(0, base + PCIE_ATU_UNR_REGION_CTRL1 + 0x200);
+	writel(PCIE_ATU_ENABLE | PCIE_ATU_BAR_MODE_ENABLE | (2 << 8),
+	       base + PCIE_ATU_UNR_REGION_CTRL2 + 0x200);
+	for (i = 0; i < 5; i++) {
+		val = readl(base + PCIE_ATU_UNR_REGION_CTRL2 + 0x200);
+		if (val & PCIE_ATU_ENABLE)
+			break;
+		udelay(LINK_WAIT_IATU);
+	}
+	printep("BAR2: 0x%x%x\n", 0, RKEP_BAR2_ADDR);
+
+	/* BAR4 is wired reg, no need iATU */
+}
+
+static int rockchip_pcie_ep_set_bar_flag(void *dbi_base, u32 barno, int flags)
+{
+	u32 reg;
+
+	reg = PCI_BASE_ADDRESS_0 + (4 * barno);
+
+	/* Disabled the upper 32bits BAR to make a 64bits bar pair */
+	if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64)
+		writel(0, dbi_base + reg + 0x100000 + 4);
+
+	writel(flags, dbi_base + reg);
+	if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64)
+		writel(0, dbi_base + reg + 4);
+
+	return 0;
+}
+
+static void pcie_bar_init(void *dbi_base)
+{
+	void *resbar_base;
+
+	writel(0, dbi_base + 0x10);
+	writel(0, dbi_base + 0x14);
+	writel(0, dbi_base + 0x18);
+	writel(0, dbi_base + 0x1c);
+	writel(0, dbi_base + 0x20);
+	writel(0, dbi_base + 0x24);
+
+	/* Resize BAR0 to support 4M 32bits */
+	resbar_base = dbi_base + PCI_RESBAR;
+	writel(0xfffff0, resbar_base + 0x4);
+	writel(0x2c0, resbar_base + 0x8);
+	/* BAR2: 64M 64bits */
+	writel(0xfffff0, resbar_base + 0x14);
+	writel(0x6c0, resbar_base + 0x18);
+	/* BAR4: Fixed for EP wired register, 1M 32bits */
+	writel(0xfffff0, resbar_base + 0x24);
+	writel(0xc0, resbar_base + 0x28);
+	/* Set flags */
+	rockchip_pcie_ep_set_bar_flag(dbi_base, 0, PCI_BASE_ADDRESS_MEM_TYPE_32);
+	rockchip_pcie_ep_set_bar_flag(dbi_base, 2,
+				      PCI_BASE_ADDRESS_MEM_PREFETCH | PCI_BASE_ADDRESS_MEM_TYPE_64);
+	rockchip_pcie_ep_set_bar_flag(dbi_base, 4, PCI_BASE_ADDRESS_MEM_TYPE_32);
+
+	/* Close bar1 bar3 bar5 */
+	writel(0x0, dbi_base + 0x100000 + 0x14);
+	//writel(0x0, dbi_base + 0x100000 + 0x18);
+	writel(0x0, dbi_base + 0x100000 + 0x1c);
+	//writel(0x0, dbi_base + 0x100000 + 0x20);
+	writel(0x0, dbi_base + 0x100000 + 0x24);
+	/* Close ROM BAR */
+	writel(0x0, dbi_base + 0x100000 + 0x30);
+}
+
+static void pcie_bar0_header_init(void)
+{
+	struct rkpcie_boot *bh = (struct rkpcie_boot *)RKEP_BAR0_ADDR;
+
+	bh->magic = RKEP_BOOT_MAGIC;
+	bh->version = 0x100;
+	bh->devmode.mode = RKEP_MODE_LOADER;
+	bh->devmode.submode = RKEP_SMODE_INIT;
+	bh->cap_size = 0;
+
+	memset((char *)RKEP_BAR0_CMD_ADDR, 0, sizeof(struct rkpcie_cmd));
+}
+
+static void pcie_link_set_max_speed(void *dbi_base, u32 link_gen)
+{
+	u32 cap, ctrl2, link_speed;
+	u8 offset = 0x70;
+
+	cap = readl(dbi_base + offset + PCI_EXP_LNKCAP);
+	ctrl2 = readl(dbi_base + offset + PCI_EXP_LNKCTL2);
+	ctrl2 &= ~PCI_EXP_LNKCTL2_TLS;
+
+	link_speed = link_gen;
+
+	cap &= ~((u32)PCI_EXP_LNKCAP_SLS);
+	writel(ctrl2 | link_speed, dbi_base + offset + PCI_EXP_LNKCTL2);
+	writel(cap | link_speed, dbi_base + offset + PCI_EXP_LNKCAP);
+}
+
+static void pcie_link_set_lanes(void *dbi_base, u32 lanes)
+{
+	u32 val;
+
+	/* Set the number of lanes */
+	val = readl(dbi_base + PCIE_PORT_LINK_CONTROL);
+	val &= ~PORT_LINK_MODE_MASK;
+	switch (lanes) {
+	case 1:
+		val |= PORT_LINK_MODE_1_LANES;
+		break;
+	case 2:
+		val |= PORT_LINK_MODE_2_LANES;
+		break;
+	case 4:
+		val |= PORT_LINK_MODE_4_LANES;
+		break;
+	default:
+		printf("RKEP: num-lanes %u: invalid value\n", lanes);
+		return;
+	}
+	writel(val, dbi_base + PCIE_PORT_LINK_CONTROL);
+
+	/* Set link width speed control register */
+	val = readl(dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
+	val &= ~PORT_LOGIC_LINK_WIDTH_MASK;
+	switch (lanes) {
+	case 1:
+		val |= PORT_LOGIC_LINK_WIDTH_1_LANES;
+		break;
+	case 2:
+		val |= PORT_LOGIC_LINK_WIDTH_2_LANES;
+		break;
+	case 4:
+		val |= PORT_LOGIC_LINK_WIDTH_4_LANES;
+		break;
+	}
+
+	val |= PCIE_DIRECT_SPEED_CHANGE;
+
+	writel(val, dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
+}
+
+static void pcie_devmode_update(int mode, int submode)
+{
+	struct rkpcie_boot *bh = (struct rkpcie_boot *)RKEP_BAR0_ADDR;
+
+	bh->devmode.mode = mode;
+	bh->devmode.submode = submode;
+	flush_dcache_range(RKEP_BAR0_ADDR, RKEP_BAR0_ADDR + 64);
+}
+
+#ifdef CONFIG_SPL_RAM_DEVICE
+static void pcie_wait_for_fw(void)
+{
+	struct rkpcie_cmd *cmd = (struct rkpcie_cmd *)(RKEP_BAR0_CMD_ADDR);
+	int val;
+	int i = 0;
+
+	printep("Link ready! Waiting RC to download Firmware:\n");
+	printep("Download uboot.img  to BAR2+0\n");
+	printep("Download boot.img   to BAR2+0x400000\n");
+	printep("Send CMD_LOADER_RUN to BAR0+0x400\n");
+	while (1) {
+		invalidate_dcache_range(RKEP_BAR0_CMD_ADDR,
+					RKEP_BAR0_CMD_ADDR + 32);
+		val = readl(&cmd->cmd);
+		if (val == RKEP_CMD_LOADER_RUN)
+			break;
+		i++;
+		if (!(i % 10))
+			printep("Waiting for FW, CMD: %x\n", val);
+		mdelay(100);
+	}
+	/* Invalidate Cache for firmware area: BAR2, 64MB */
+	invalidate_dcache_range(RKEP_BAR2_ADDR, RKEP_BAR2_ADDR + 0x4000000);
+	printep("Firmware Download complete!\n");
+}
+
+static void pcie_update_atags(void)
+{
+	struct tag_ram_partition t_ram_part;
+
+	if (!atags_is_available()) {
+		printf("RKEP: No ATAGS data found, create new!\n");
+		atags_destroy();
+	}
+
+	/* ram partition */
+	memset(&t_ram_part, 0, sizeof(t_ram_part));
+	t_ram_part.version = 0;
+	t_ram_part.count = 1;
+	strcpy(t_ram_part.part[0].name, "boot");
+	t_ram_part.part[0].start = RKEP_BAR2_ADDR + 0x400000;	/* 4M offset */
+	t_ram_part.part[0].size  = 0x3c00000;	/* 60M size */
+	atags_set_tag(ATAG_RAM_PARTITION, &t_ram_part);
+}
+
+void rockchip_pcie_ep_get_firmware(void)
+{
+	pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_FWDLRDY);
+	pcie_wait_for_fw();
+	pcie_update_atags();
+	pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_FWDLDONE);
+}
+#endif
+
+#ifdef CONFIG_ROCKCHIP_RK3588
+#define BUS_IOC_GPIO3D_IOMUX_SEL_H	0xfd5f807c
+#define GPIO3_BASE			0xfec40000
+#define GPIO3_SWPORT_DR_H		(GPIO3_BASE + 0x4)
+#define GPIO3_SWPORT_DDR_H		(GPIO3_BASE + 0xc)
+
+static void pcie_board_init(void)
+{
+	/* Enable AU5426 buffer chip on EVB4v10 */
+	/* Set GPIO3D4 to gpio output HIGH mode PCIE20_CLK_PWREN */
+	writel(0xf << 16, BUS_IOC_GPIO3D_IOMUX_SEL_H);
+	writel(0x10001000, GPIO3_SWPORT_DDR_H);
+	writel(0x10001000, GPIO3_SWPORT_DR_H);
+	udelay(100);
+}
+
+#define PHY_MODE_PCIE_AGGREGATION 4	/* PCIe3x4 */
+#define PHY_MODE_PCIE_NANBNB	0	/* P1:PCIe3x2  +  P0:PCIe3x2 */
+#define PHY_MODE_PCIE_NANBBI	1	/* P1:PCIe3x2  +  P0:PCIe3x1*2 */
+#define PHY_MODE_PCIE_NABINB	2	/* P1:PCIe3x1*2 + P0:PCIe3x2 */
+#define PHY_MODE_PCIE_NABIBI	3	/* P1:PCIe3x1*2 + P0:PCIe3x1*2 */
+
+#define CRU_BASE_ADDR			0xfd7c0000
+#define CRU_SOFTRST_CON32		(CRU_BASE_ADDR + 0x0a80)
+#define CRU_SOFTRST_CON33		(CRU_BASE_ADDR + 0x0a84)
+#define CRU_SOFTRST_CON34		(CRU_BASE_ADDR + 0x0a88)
+#define CRU_GATE_CON32			(CRU_BASE_ADDR + 0x0880)
+#define CRU_GATE_CON33			(CRU_BASE_ADDR + 0x0884)
+#define CRU_GATE_CON34			(CRU_BASE_ADDR + 0x0888)
+#define CRU_GATE_CON38			(CRU_BASE_ADDR + 0x0898)
+#define CRU_GATE_CON39			(CRU_BASE_ADDR + 0x089c)
+#define PHPTOPCRU_BASE_ADDR		0xfd7c8000
+#define PHPTOPCRU_SOFTRST_CON00		(PHPTOPCRU_BASE_ADDR + 0x0a00)
+#define PHPTOPCRU_GATE_CON00		(PHPTOPCRU_BASE_ADDR + 0x0800)
+#define PCIE3PHY_GRF_BASE		0xfd5b8000
+#define RK3588_PCIE3PHY_GRF_CMN_CON0	(PCIE3PHY_GRF_BASE + 0x0000)
+#define PCIE3PHY_GRF_PHY0_CON6		(PCIE3PHY_GRF_BASE + 0x0118)
+#define PCIE3PHY_GRF_PHY1_CON6		(PCIE3PHY_GRF_BASE + 0x0218)
+#define PCIE3PHY_GRF_PHY0_LN0_CON1	(PCIE3PHY_GRF_BASE + 0x1004)
+#define PCIE3PHY_GRF_PHY0_LN1_CON1	(PCIE3PHY_GRF_BASE + 0x1104)
+#define PCIE3PHY_GRF_PHY1_LN0_CON1	(PCIE3PHY_GRF_BASE + 0x2004)
+#define PCIE3PHY_GRF_PHY1_LN1_CON1	(PCIE3PHY_GRF_BASE + 0x2104)
+#define FIREWALL_PCIE_MASTER_SEC	0xfe0300f0
+#define FIREWALL_PCIE_ACCESS		0xfe586040
+#define CRU_PHYREF_ALT_GATE_CON		(CRU_BASE_ADDR + 0x0c38)
+#define PMU_PWR_GATE_SFTCON1		0xfd8d8150
+static void pcie_cru_init(void)
+{
+	u32 phy0_mplla, phy1_mplla, t0 = 0, t1 = 0;
+	u32 i, timeout = 500;
+
+	/* Enable power domain: PD_PCIE & PD_PHP */
+	writel(0x1 << 23 | 0x1 << 21, PMU_PWR_GATE_SFTCON1);
+
+	/* FixMe init 3.0 PHY */
+	/* Phy mode: Aggregation NBNB */
+	writel((0x7 << 16) | PHY_MODE_PCIE_AGGREGATION, RK3588_PCIE3PHY_GRF_CMN_CON0);
+	printep("PHY Mode 0x%x\n", readl(RK3588_PCIE3PHY_GRF_CMN_CON0) & 7);
+	/* Enable clock and sfreset for Controller and PHY */
+	writel(0xffff0000, CRU_SOFTRST_CON32);
+	writel(0xffff0000, CRU_SOFTRST_CON33);
+	writel(0xffff0000, CRU_SOFTRST_CON34);
+	writel(0xffff0000, CRU_GATE_CON32);
+	writel(0xffff0000, CRU_GATE_CON33);
+	writel(0xffff0000, CRU_GATE_CON34);
+	writel(0xffff0000, CRU_GATE_CON38);
+	writel(0xffff0000, CRU_GATE_CON39);
+
+	writel((0x1 << 24), PHPTOPCRU_SOFTRST_CON00);
+	writel(0xffff0000, PHPTOPCRU_GATE_CON00);
+
+	/* PHY Reset */
+	writel((0x1 << 10) | (0x1 << 26), PHPTOPCRU_SOFTRST_CON00);
+
+	udelay(1);
+
+#ifdef PCIE_ENABLE_SRNS_PLL_REFCLK
+	writel(0x000f0000, CRU_PHYREF_ALT_GATE_CON);
+
+	/* PHY0 & PHY1  use internal clock */
+	writel(0x0 | (0x1 << 18), PCIE3PHY_GRF_PHY0_CON6);
+	writel(0x0 | (0x1 << 18), PCIE3PHY_GRF_PHY1_CON6);
+
+	/* phy0_rx0_cmn_refclk_mod */
+	writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY0_LN0_CON1);
+	/* phy1_rx0_cmn_refclk_mod */
+	writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY0_LN1_CON1);
+	/* phy0_rx0_cmn_refclk_mod */
+	writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY1_LN0_CON1);
+	/* phy1_rx0_cmn_refclk_mod */
+	writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY1_LN1_CON1);
+#endif
+
+	udelay(1000);
+
+	/* Deassert PCIe PMA output clamp mode */
+	writel((0x1 << 8) | (0x1 << 24), RK3588_PCIE3PHY_GRF_CMN_CON0);
+
+	/* Deassert PHY Reset */
+	writel((0x1 << 26), PHPTOPCRU_SOFTRST_CON00);
+
+	/* S-Phy: waiting for phy locked */
+	for (i = 0; i < timeout; i++) {
+		phy0_mplla = readl(PCIE3PHY_GRF_BASE + 0x904);
+		phy1_mplla = readl(PCIE3PHY_GRF_BASE + 0xA04);
+
+		if (phy0_mplla != t0 || phy1_mplla != t1) {
+			printf("RKEP: GRF:904=%x, a04=%x...\n", phy0_mplla, phy1_mplla);
+
+			t0 = phy0_mplla;
+			t1 = phy1_mplla;
+			if (phy0_mplla == 0xF && phy1_mplla == 0xF)
+				break;
+		}
+
+		udelay(10);
+	}
+
+	/* PHY config: no config need for snps3.0phy */
+
+	/* Enable PCIe Access in firewall and master secure mode */
+	writel(0xffff0000, FIREWALL_PCIE_MASTER_SEC);
+	writel(0x01800000, FIREWALL_PCIE_ACCESS);
+}
+#elif CONFIG_ROCKCHIP_RK3568
+
+static void pcie_board_init(void)
+{
+	/* to-do */
+}
+
+static const u16 phy_fw[] = {
+	#include "./../../../drivers/phy/phy-rockchip-snps-pcie3.fw"
+};
+
+#define GRF_PCIE30PHY_RK3568_CON1 0x4
+#define GRF_PCIE30PHY_RK3568_CON3 0xC
+#define GRF_PCIE30PHY_RK3568_CON4 0x10
+#define GRF_PCIE30PHY_RK3568_CON5 0x14
+#define GRF_PCIE30PHY_RK3568_CON6 0x18
+#define GRF_PCIE30PHY_RK3568_CON9 0x24
+#define GRF_PCIE30PHY_RK3568_STATUS0 0x80
+#define RK3568_SRAM_INIT_DONE(reg) ((reg) & BIT(14))
+
+#define PMUCRU_BASE			0xFDD00000
+#define PMUCRU_PMUGATE_CON02		(PMUCRU_BASE + 0x188)
+
+#define CRU_BASE			0xFDD20000
+#define CRU_GATE_CON12			(CRU_BASE + 0x330)
+#define CRU_GATE_CON13			(CRU_BASE + 0x334)
+#define CRU_GATE_CON33			(CRU_BASE + 0x384)
+#define CRU_SOFTRST_CON12		(CRU_BASE + 0x430)
+#define CRU_SOFTRST_CON27		(CRU_BASE + 0x46c)
+
+#define PCIE30_PHY_GRF			0xFDCB8000
+
+void pcie_cru_init(void)
+{
+	u32 i, reg;
+	void __iomem *mmio = (void __iomem *)0xFE8C0000;
+
+	/* Enable phy and controoler clk */
+	writel(0xffff0000, PMUCRU_PMUGATE_CON02);
+	writel(0xffff0000, CRU_GATE_CON12);
+	writel(0xffff0000, CRU_GATE_CON13);
+	writel(0xffff0000, CRU_GATE_CON33);
+	writel(0xffff0000, CRU_SOFTRST_CON27);
+
+	writel(0x40004000, CRU_SOFTRST_CON27);
+	writel(0x80008000, PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9);
+
+	writel((0x1 << 15) | (0x1 << 31),
+	       PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9); //map to access sram
+
+#ifdef PCIE_ENABLE_SRNS_PLL_REFCLK
+	/* use internal clock */
+	writel(0x0 | (0x1 << 31), PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON3);
+
+	/* rx0_cmn_refclk_mode disabled */
+	writel((0x0) | (0x1 << 25), PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON5);
+	/* rx1_cmn_refclk_mode disabled */
+	writel((0x0) | (0x1 << 25), PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON6);
+#endif
+
+	writel((0x0 << 14) | (0x1 << (14 + 16)),
+	       PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON4); //sdram_ld_done
+	writel((0x0 << 13) | (0x1 << (13 + 16)),
+	       PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON4); //sdram_bypass
+
+	writel(0x40000000, CRU_SOFTRST_CON27);
+
+	udelay(5);
+	printf("RKEP: sram initial\n");
+	while (1) {
+		reg = readl(PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_STATUS0);
+		if (RK3568_SRAM_INIT_DONE(reg))
+			break;
+	}
+	printf("RKEP: sram init done\n");
+
+	writel((0x3 << 8) | (0x3 << (8 + 16)),
+	       PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9); //map to access sram
+	for (i = 0; i < ARRAY_SIZE(phy_fw); i++)
+		writel(phy_fw[i], mmio + (i << 2));
+
+	printf("RKEP: snps pcie3phy FW update! size %ld\n", ARRAY_SIZE(phy_fw));
+	writel((0x0 << 8) | (0x3 << (8 + 16)),
+	       PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9);
+	writel((0x1 << 14) | (0x1 << (14 + 16)),
+	       PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON4); //sdram_ld_done
+
+	writel(0xffff0000, CRU_SOFTRST_CON12);
+	writel(0x100010, PCIE_SNPS_APB_BASE + 0x180);
+
+	udelay(1);
+}
+#endif
+
+static void pcie_ep_init(void)
+{
+	u32 val;
+	void *dbi_base = (void *)PCIE_SNPS_DBI_BASE;
+	u64 apb_base = PCIE_SNPS_APB_BASE;
+	int i, retries = 0;
+
+#ifdef PCIE_ENABLE_SRNS_PLL_REFCLK
+	printep("RefClock in SRNS clock mode\n");
+#else
+	printep("RefClock in common clock_mode\n");
+#endif
+
+	/*
+	 * ltssm_enable enhance mode and enable delaying the link training
+	 * after Hot Reset
+	 */
+	writel(0x120012, apb_base + 0x180);
+
+	/* Unmask pm_turnoff_int */
+	writel(0x04000000, apb_base + 0x18);
+
+	/* PortLorgic DBI_RO_WR_EN */
+	val = readl((dbi_base + 0x8bc));
+	val |= 0x1;
+	writel(val, dbi_base + 0x8bc);
+
+reinit:
+	pcie_bar_init(dbi_base);
+	pcie_inbound_config();
+
+	/* Device PID, DID */
+	writel(0x1d87, dbi_base + 0x00);
+	writel(0x356a, dbi_base + 0x02);
+	/* Device Class: Processing accelerators */
+	writel(0x1200, dbi_base + 0x0a);
+
+	pcie_link_set_max_speed(dbi_base, PCI_EXP_LNKCTL2_TLS_8_0GT);
+
+#ifdef	CONFIG_ROCKCHIP_RK3588
+	pcie_link_set_lanes(dbi_base, 4);
+#elif	CONFIG_ROCKCHIP_RK3568
+	pcie_link_set_lanes(dbi_base, 2);
+#endif
+
+	/* EP mode */
+	writel(0xf00000, apb_base);
+	udelay(100);
+
+	/* Enable EP mem/io access */
+	val = readl(dbi_base + 0x4);
+	writel(val | 0x6, dbi_base + 0x4);
+
+	if (retries)	/* Set app_dly2_done to enable app_ltssm_enable */
+		writel(0x80008, apb_base + 0x180);
+	else		/* Enable LTSSM */
+		writel(0xc000c, apb_base);
+	printep("init PCIe fast Link up\n");
+	pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_LNKRDY);
+
+	/* Waiting for Link up */
+	while (1) {
+		val = readl(apb_base + 0x300);
+		if (((val & 0x3ffff) & ((0x3 << 16) | 0x11)) == 0x30011)
+			break;
+		mdelay(1);
+	}
+	printep("Link up %x\n", val);
+	mdelay(3);
+
+	/* Wait for link stable */
+	for (i = 0; i < 10000; i++) {
+		val = readl(apb_base + 0x10);
+		if (val & 0x4) {
+			writel(0x4, apb_base + 0x10);
+			printep("Link is reset, int status misc=%x\n", val);
+			if (retries < 3) {
+				retries++;
+				goto reinit;
+			} else {
+				break;
+			}
+		}
+		udelay(1);
+	}
+	printep("Done\n");
+	pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_LNKUP);
+}
+
+void rockchip_pcie_ep_init(void)
+{
+	u32 val;
+
+	printf("\nRKEP: Init PCIe EP\n");
+	pcie_bar0_header_init();
+
+#ifdef CONFIG_ROCKCHIP_RK3588
+	writel(0x1 << 23 | 0x1 << 21, PMU_PWR_GATE_SFTCON1);
+	udelay(10);
+#endif
+	/* Re-in pcie initial */
+	val = readl(PCIE_SNPS_APB_BASE + 0x300);
+	if (((val & 0x3ffff) & ((0x3 << 16))) == 0x30000) {
+		printf("RKEP: already link up\n");
+		return;
+	}
+
+	pcie_board_init();
+	/* CRU and PHY Init */
+	pcie_cru_init();
+
+	pcie_ep_init();
+}
diff --git a/u-boot/arch/arm/mach-rockchip/uimage.c b/u-boot/arch/arm/mach-rockchip/uimage.c
index e805b12..e5f8416 100644
--- a/u-boot/arch/arm/mach-rockchip/uimage.c
+++ b/u-boot/arch/arm/mach-rockchip/uimage.c
@@ -12,8 +12,8 @@
 #include <asm/arch/resource_img.h>
 #include <asm/arch/uimage.h>
 
-static int uimage_load_one(struct blk_desc *dev_desc, disk_partition_t *part,
-			   int pos_off, int size, void *dst)
+int uimage_load_one(struct blk_desc *dev_desc, disk_partition_t *part,
+		    int pos_off, int size, void *dst)
 {
 	u32 blknum, blkoff;
 	u32 unused;
@@ -183,31 +183,23 @@
 	return 0;
 }
 
-int uimage_init_resource(void)
-{
-	struct blk_desc *dev_desc;
-	disk_partition_t part;
-	image_header_t *hdr;
-	char *part_name;
-	ulong data, offset;
-	ulong size;
 #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
-	ulong dst;
-	int idx = 3;
-#endif
-	int ret;
+int uimage_init_resource(struct blk_desc *dev_desc)
+{
+	disk_partition_t part;
+	ulong data, offset, size;
+	image_header_t *hdr;
+	char *part_name = PART_BOOT;
+	int ret, idx = 3;
+	void *buf;
 
-	dev_desc = rockchip_get_bootdev();
-	if (!dev_desc) {
-		printf("No dev_desc!\n");
-		return ENODEV;
-	}
+	if (!dev_desc)
+		return -ENODEV;
 
+#ifndef CONFIG_ANDROID_AB
 	if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY)
 		part_name = PART_RECOVERY;
-	else
-		part_name = PART_BOOT;
-
+#endif
 	if (part_get_info_by_name(dev_desc, part_name, &part) < 0) {
 		UIMG_I("No %s partition\n", part_name);
 		return -ENODEV;
@@ -215,35 +207,28 @@
 
 	hdr = uimage_get_hdr(dev_desc, &part);
 	if (!hdr)
-		return -ENODEV;
+		return -EAGAIN;
 
 	image_multi_getimg(hdr, idx, &data, &size);
 	offset = data - (ulong)hdr;
 	free(hdr);
 
-#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
-	ulong fdt_addr;
-
-	/* reserve enough space before fdt */
-	fdt_addr = env_get_ulong("fdt_addr_r", 16, 0);
-	dst = (ulong)fdt_addr -
-		   ALIGN(size, dev_desc->blksz) - CONFIG_SYS_FDT_PAD;
-	ret = uimage_load_one(dev_desc, &part, offset, size, (void *)dst);
-	if (ret) {
-		UIMG_I("Failed to load resource file, ret=%d\n", ret);
-		return ret;
-	}
-
-	if (!sysmem_alloc_base(MEM_RESOURCE, (phys_addr_t)dst,
-			       ALIGN(size, RK_BLK_SIZE)))
+	buf = memalign(ARCH_DMA_MINALIGN, ALIGN(size, dev_desc->blksz));
+	if (!buf)
 		return -ENOMEM;
 
-	ret = resource_create_ram_list(dev_desc, (void *)dst);
+	printf("RESC: '%s', blk@0x%08lx\n", part.name,
+	       part.start + (offset / dev_desc->blksz));
+	ret = uimage_load_one(dev_desc, &part, offset, size, buf);
+	if (ret)
+		return ret;
+
+	ret = resource_setup_ram_list(dev_desc, buf);
 	if (ret) {
-		UIMG_I("Failed to create resource list, ret=%d\n", ret);
+		UIMG_I("Failed to setup resource ram list, ret=%d\n", ret);
 		return ret;
 	}
-#endif
 
 	return 0;
 }
+#endif
diff --git a/u-boot/arch/arm/mach-rockchip/vendor.c b/u-boot/arch/arm/mach-rockchip/vendor.c
index fce520d..2a146b7 100644
--- a/u-boot/arch/arm/mach-rockchip/vendor.c
+++ b/u-boot/arch/arm/mach-rockchip/vendor.c
@@ -10,6 +10,7 @@
 #include <boot_rkimg.h>
 #include <nand.h>
 #include <part.h>
+#include <fdt_support.h>
 
 /* tag for vendor check */
 #define VENDOR_TAG		0x524B5644
@@ -20,6 +21,9 @@
 /* align to 64 bytes */
 #define VENDOR_BTYE_ALIGN	0x3F
 #define VENDOR_BLOCK_SIZE	512
+
+#define PAGE_ALGIN_SIZE		(4096uL)
+#define PAGE_ALGIN_MASK		(~(PAGE_ALGIN_SIZE - 1))
 
 /* --- Emmc define --- */
 /* Starting address of the Vendor in memory. */
@@ -493,13 +497,14 @@
 	/* Initialize */
 	bootdev_type = dev_desc->if_type;
 
-	/* Always use, no need to release */
-	buffer = (u8 *)malloc(size);
+	/* Always use, no need to release, align to page size for kerenl reserved memory */
+	buffer = (u8 *)memalign(PAGE_ALGIN_SIZE, size);
 	if (!buffer) {
 		printf("[Vendor ERROR]:Malloc failed!\n");
 		ret = -ENOMEM;
 		goto out;
 	}
+
 	/* Pointer initialization */
 	vendor_info.hdr = (struct vendor_hdr *)buffer;
 	vendor_info.item = (struct vendor_item *)(buffer + sizeof(struct vendor_hdr));
@@ -566,6 +571,29 @@
 	return ret;
 }
 
+void vendor_storage_fixup(void *blob)
+{
+	unsigned long size;
+	unsigned long start;
+	ulong offset;
+
+	/* init vendor storage */
+	if (!bootdev_type) {
+		if (vendor_storage_init() < 0)
+			return;
+	}
+
+	offset = fdt_node_offset_by_compatible(blob, 0, "rockchip,vendor-storage-rm");
+	if (offset >= 0) {
+		start = (unsigned long)vendor_info.hdr;
+		size = (unsigned long)((void *)vendor_info.version2 - (void *)vendor_info.hdr);
+		size += 4;
+		fdt_update_reserved_memory(blob, "rockchip,vendor-storage-rm",
+					   (u64)start,
+					   (u64)size);
+	}
+}
+
 /*
  * @id: item id, first 4 id is occupied:
  *	VENDOR_SN_ID
diff --git a/u-boot/board/rockchip/evb_rk3528/Kconfig b/u-boot/board/rockchip/evb_rk3528/Kconfig
new file mode 100644
index 0000000..d0f6599
--- /dev/null
+++ b/u-boot/board/rockchip/evb_rk3528/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_EVB_RK3528
+
+config SYS_BOARD
+	default "evb_rk3528"
+
+config SYS_VENDOR
+	default "rockchip"
+
+config SYS_CONFIG_NAME
+	default "evb_rk3528"
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+	def_bool y
+
+endif
diff --git a/u-boot/board/rockchip/evb_rk3528/Makefile b/u-boot/board/rockchip/evb_rk3528/Makefile
new file mode 100644
index 0000000..1fa46e5
--- /dev/null
+++ b/u-boot/board/rockchip/evb_rk3528/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+# Copyright (c) 2020 Rockchip Electronics Co., Ltd
+#
+
+obj-y	+= evb_rk3528.o
diff --git a/u-boot/board/rockchip/evb_rk3528/evb_rk3528.c b/u-boot/board/rockchip/evb_rk3528/evb_rk3528.c
new file mode 100644
index 0000000..d0c1e55
--- /dev/null
+++ b/u-boot/board/rockchip/evb_rk3528/evb_rk3528.c
@@ -0,0 +1,33 @@
+/*
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * (C) Copyright 2020 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <dwc3-uboot.h>
+#include <usb.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_USB_DWC3
+static struct dwc3_device dwc3_device_data = {
+	.maximum_speed = USB_SPEED_HIGH,
+	.base = 0xfe500000,
+	.dr_mode = USB_DR_MODE_PERIPHERAL,
+	.index = 0,
+	.dis_u2_susphy_quirk = 1,
+	.usb2_phyif_utmi_width = 16,
+};
+
+int usb_gadget_handle_interrupts(void)
+{
+	dwc3_uboot_handle_interrupt(0);
+	return 0;
+}
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+	return dwc3_uboot_init(&dwc3_device_data);
+}
+#endif
diff --git a/u-boot/board/rockchip/evb_rk3562/Kconfig b/u-boot/board/rockchip/evb_rk3562/Kconfig
new file mode 100644
index 0000000..810e563
--- /dev/null
+++ b/u-boot/board/rockchip/evb_rk3562/Kconfig
@@ -0,0 +1,15 @@
+if TARGET_EVB_RK3562
+
+config SYS_BOARD
+	default "evb_rk3562"
+
+config SYS_VENDOR
+	default "rockchip"
+
+config SYS_CONFIG_NAME
+	default "evb_rk3562"
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+	def_bool y
+
+endif
diff --git a/u-boot/board/rockchip/evb_rk3562/Makefile b/u-boot/board/rockchip/evb_rk3562/Makefile
new file mode 100644
index 0000000..5b6aff0
--- /dev/null
+++ b/u-boot/board/rockchip/evb_rk3562/Makefile
@@ -0,0 +1,7 @@
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+# Copyright (c) 2022 Rockchip Electronics Co., Ltd
+#
+
+obj-y	+= evb_rk3562.o
diff --git a/u-boot/board/rockchip/evb_rk3562/evb_rk3562.c b/u-boot/board/rockchip/evb_rk3562/evb_rk3562.c
new file mode 100644
index 0000000..a7be427
--- /dev/null
+++ b/u-boot/board/rockchip/evb_rk3562/evb_rk3562.c
@@ -0,0 +1,33 @@
+/*
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <dwc3-uboot.h>
+#include <usb.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_USB_DWC3
+static struct dwc3_device dwc3_device_data = {
+	.maximum_speed = USB_SPEED_HIGH,
+	.base = 0xfe500000,
+	.dr_mode = USB_DR_MODE_PERIPHERAL,
+	.index = 0,
+	.dis_u2_susphy_quirk = 1,
+	.usb2_phyif_utmi_width = 16,
+};
+
+int usb_gadget_handle_interrupts(void)
+{
+	dwc3_uboot_handle_interrupt(0);
+	return 0;
+}
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+	return dwc3_uboot_init(&dwc3_device_data);
+}
+#endif
diff --git a/u-boot/cmd/Kconfig b/u-boot/cmd/Kconfig
index 8273ed1..1efdeae 100644
--- a/u-boot/cmd/Kconfig
+++ b/u-boot/cmd/Kconfig
@@ -1020,6 +1020,13 @@
 	  This provides various sub-commands to initialise and configure the
 	  Turndra tsi148 device. See the command help for full details.
 
+config CMD_UFS
+	bool "Enable UFS - Universal Flash Subsystem commands"
+	depends on UFS
+	help
+	  "This provides commands to initialise and configure universal flash
+	   subsystem devices"
+
 config CMD_UNIVERSE
 	bool "universe - Command to set up the Turndra Universe controller"
 	help
@@ -1181,15 +1188,7 @@
 
 endmenu
 
-config CMD_MEMTESTER
-	bool "Enable memtester for ddr"
-	help
-	  This enables memtester for ddr.
-
-config CMD_DDR_TEST_TOOL
-	bool "Enable ddr test tool"
-	help
-	  This enable ddr test tool code.
+source "cmd/ddr_tool/Kconfig"
 
 menu "Misc commands"
 
diff --git a/u-boot/cmd/Makefile b/u-boot/cmd/Makefile
index 3f71a35..d4c12a3 100644
--- a/u-boot/cmd/Makefile
+++ b/u-boot/cmd/Makefile
@@ -91,8 +91,7 @@
 obj-$(CONFIG_ID_EEPROM) += mac.o
 obj-$(CONFIG_CMD_MD5SUM) += md5sum.o
 obj-$(CONFIG_CMD_MEMORY) += mem.o
-obj-$(CONFIG_CMD_MEMTESTER) += memtester/
-obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ddr_tool/
+obj-$(CONFIG_CMD_DDR_TOOL) += ddr_tool/
 obj-$(CONFIG_CMD_IO) += io.o
 obj-$(CONFIG_CMD_MFSL) += mfsl.o
 obj-$(CONFIG_CMD_MII) += mii.o
@@ -149,6 +148,7 @@
 obj-$(CONFIG_CMD_UNZIP) += unzip.o
 obj-$(CONFIG_CMD_LZMADEC) += lzmadec.o
 obj-$(CONFIG_CMD_SCRIPT_UPDATE) += script_update.o
+obj-$(CONFIG_CMD_UFS) += ufs.o
 obj-$(CONFIG_CMD_USB) += usb.o disk.o
 obj-$(CONFIG_CMD_FASTBOOT) += fastboot.o
 obj-$(CONFIG_CMD_FS_UUID) += fs_uuid.o
diff --git a/u-boot/cmd/boot_android.c b/u-boot/cmd/boot_android.c
index 98a2893..de6b8e0 100755
--- a/u-boot/cmd/boot_android.c
+++ b/u-boot/cmd/boot_android.c
@@ -13,6 +13,7 @@
 #include <common.h>
 #include <bootm.h>
 #include <command.h>
+#include <mp_boot.h>
 #include <android_bootloader_message.h>
 #include <android_avb/rk_avb_ops_user.h>
 #include <android_avb/avb_atx_ops.h>
@@ -30,6 +31,9 @@
 	if (argc > 5)
 		return CMD_RET_USAGE;
 
+#ifdef CONFIG_MP_BOOT_BOOTM
+	mpb_post(5);
+#endif
 	if (argc >= 5) {
 		load_address = simple_strtoul(argv[4], &addr_arg_endp, 16);
 		if (addr_arg_endp == argv[4] || *addr_arg_endp != '\0')
diff --git a/u-boot/cmd/bootfit.c b/u-boot/cmd/bootfit.c
index a0efec7..3a8b75b 100644
--- a/u-boot/cmd/bootfit.c
+++ b/u-boot/cmd/bootfit.c
@@ -103,7 +103,6 @@
 
 	strcat(slot_info, slot_suffix);
 	env_update("bootargs", slot_info);
-	ab_update_root_uuid();
 #endif
 
 	ret = do_bootm_states(NULL, 0, ARRAY_SIZE(bootm_args), bootm_args,
diff --git a/u-boot/cmd/cache.c b/u-boot/cmd/cache.c
index 37ab345..004dcc2 100644
--- a/u-boot/cmd/cache.c
+++ b/u-boot/cmd/cache.c
@@ -54,7 +54,24 @@
 
 static int do_dcache(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
+	ulong start, size;
+
 	switch (argc) {
+	case 4:
+		start = simple_strtoul(argv[2], NULL, 16);
+		size = simple_strtoul(argv[3], NULL, 16);
+
+		switch (parse_argv(argv[1])) {
+		case 2:
+			printf("flush dcache: 0x%08lx - 0x%08lx\n", start, start + size);
+			flush_dcache_range(start, start + size);
+			break;
+		case 3:
+			printf("invalidate dcache: 0x%08lx - 0x%08lx\n", start, start + size);
+			invalidate_dcache_range(start, start + size);
+			break;
+		}
+		break;
 	case 2:			/* on / off */
 		switch (parse_argv(argv[1])) {
 		case 0:
@@ -65,6 +82,9 @@
 			break;
 		case 2:
 			flush_dcache_all();
+			break;
+		case 3:
+			printf("error: dcache invalidate require [start] [size]\n");
 			break;
 		}
 		break;
@@ -80,7 +100,9 @@
 
 static int parse_argv(const char *s)
 {
-	if (strcmp(s, "flush") == 0)
+	if (strcmp(s, "invalidate") == 0)
+		return 3;
+	else if (strcmp(s, "flush") == 0)
 		return 2;
 	else if (strcmp(s, "on") == 0)
 		return 1;
@@ -99,8 +121,8 @@
 );
 
 U_BOOT_CMD(
-	dcache,   2,   1,     do_dcache,
+	dcache,   4,   1,     do_dcache,
 	"enable or disable data cache",
-	"[on, off, flush]\n"
+	"[on, off, flush, invalidate] [start] [size]\n"
 	"    - enable, disable, or flush data (writethrough) cache"
 );
diff --git a/u-boot/cmd/ddr_tool/Kconfig b/u-boot/cmd/ddr_tool/Kconfig
new file mode 100644
index 0000000..0c83e8d
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/Kconfig
@@ -0,0 +1,32 @@
+menu "DDR Tool"
+
+config CMD_DDR_TOOL
+	bool "Enable DDR Tool"
+	help
+	  This enable ddr tool such as ddr dq eye, ddr test tool, memtester and stressapptest.
+
+config CMD_DDR_DQ_EYE
+	bool "Enable DDR DQ eye fuction"
+	depends on CMD_DDR_TOOL
+	help
+	  This enable ddr dq eye fuction.
+
+config CMD_DDR_TEST
+	bool "Enable ddr test tool"
+	depends on CMD_DDR_TOOL
+	help
+	  This enable ddr test tool code.
+
+config CMD_MEMTESTER
+	bool "Enable memtester for ddr"
+	depends on CMD_DDR_TOOL
+	help
+	  This enables memtester for ddr.
+
+config CMD_STRESSAPPTEST
+	bool "Enable stressapptest for ddr"
+	depends on CMD_DDR_TOOL
+	help
+	  This enables stressapptest for ddr.
+
+endmenu
diff --git a/u-boot/cmd/ddr_tool/Makefile b/u-boot/cmd/ddr_tool/Makefile
index 788b400..7fdf4fa 100644
--- a/u-boot/cmd/ddr_tool/Makefile
+++ b/u-boot/cmd/ddr_tool/Makefile
@@ -1,25 +1,12 @@
 #
-# (C) Copyright 2018 Rockchip Electronics Co., Ltd.
+# (C) Copyright 2023 Rockchip Electronics Co., Ltd.
 #
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-# We don't want the bootrom-helper present in a full U-Boot build, as
-# this may have entered from ATF with the stack-pointer pointing to
-# inaccessible/protected memory (and the bootrom-helper assumes that
-# the stack-pointer is valid before switching to the U-Boot stack).
-ifdef CONFIG_ROCKCHIP_PX30
-obj-$(CONFIG_CMD_DDR_TEST_TOOL) = ddr_test_px30.o
-endif
-ifdef CONFIG_ROCKCHIP_RK3328
-obj-$(CONFIG_CMD_DDR_TEST_TOOL) = ddr_test_rk3328.o
-endif
-ifdef CONFIG_ROCKCHIP_RK1808
-obj-$(CONFIG_CMD_DDR_TEST_TOOL) = ddr_test_rk1808.o
-endif
-ifndef CONFIG_CMD_MEMTESTER
-obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ../memtester/ddr_tester_common.o
-obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ../memtester/io_map.o
-endif
-obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ddr_dq_eye.o
+obj-$(CONFIG_CMD_DDR_TOOL) += ddr_tool_common.o ddr_tool_mp.o io_map.o
 
+obj-$(CONFIG_CMD_DDR_DQ_EYE) += ddr_dq_eye/
+obj-$(CONFIG_CMD_DDR_TEST) += ddr_test/
+obj-$(CONFIG_CMD_MEMTESTER) += memtester/
+obj-$(CONFIG_CMD_STRESSAPPTEST) += stressapptest/
diff --git a/u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile b/u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile
new file mode 100644
index 0000000..60f072a
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile
@@ -0,0 +1,7 @@
+#
+# (C) Copyright 2023 Rockchip Electronics Co., Ltd.
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-$(CONFIG_CMD_DDR_DQ_EYE) += ddr_dq_eye.o
diff --git a/u-boot/cmd/ddr_tool/ddr_dq_eye.c b/u-boot/cmd/ddr_tool/ddr_dq_eye/ddr_dq_eye.c
similarity index 100%
rename from u-boot/cmd/ddr_tool/ddr_dq_eye.c
rename to u-boot/cmd/ddr_tool/ddr_dq_eye/ddr_dq_eye.c
diff --git a/u-boot/cmd/ddr_tool/ddr_test/Makefile b/u-boot/cmd/ddr_tool/ddr_test/Makefile
new file mode 100644
index 0000000..320a915
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/ddr_test/Makefile
@@ -0,0 +1,20 @@
+#
+# (C) Copyright 2018 Rockchip Electronics Co., Ltd.
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+# We don't want the bootrom-helper present in a full U-Boot build, as
+# this may have entered from ATF with the stack-pointer pointing to
+# inaccessible/protected memory (and the bootrom-helper assumes that
+# the stack-pointer is valid before switching to the U-Boot stack).
+
+ifdef CONFIG_ROCKCHIP_PX30
+obj-$(CONFIG_CMD_DDR_TEST) = ddr_test_px30.o
+endif
+ifdef CONFIG_ROCKCHIP_RK1808
+obj-$(CONFIG_CMD_DDR_TEST) = ddr_test_rk1808.o
+endif
+ifdef CONFIG_ROCKCHIP_RK3328
+obj-$(CONFIG_CMD_DDR_TEST) = ddr_test_rk3328.o
+endif
diff --git a/u-boot/cmd/ddr_tool/ddr_test_px30.S b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S
similarity index 99%
rename from u-boot/cmd/ddr_tool/ddr_test_px30.S
rename to u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S
index a6e9854..dc34485 100644
--- a/u-boot/cmd/ddr_tool/ddr_test_px30.S
+++ b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S
@@ -1814,8 +1814,8 @@
 	.file 36 "include/log.h"
 	.file 37 "include/stdio.h"
 	.file 38 "./arch/arm/include/asm/arch/sdram.h"
-	.file 39 "cmd/ddr_tool/../memtester/io_map.h"
-	.file 40 "cmd/ddr_tool/../memtester/ddr_tester_common.h"
+	.file 39 "cmd/ddr_tool/io_map.h"
+	.file 40 "cmd/ddr_tool/ddr_tool_common.h"
 	.file 41 "include/vsprintf.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
diff --git a/u-boot/cmd/ddr_tool/ddr_test_rk1808.S b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S
similarity index 99%
rename from u-boot/cmd/ddr_tool/ddr_test_rk1808.S
rename to u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S
index 156f79f..a1e1217 100644
--- a/u-boot/cmd/ddr_tool/ddr_test_rk1808.S
+++ b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S
@@ -1604,8 +1604,8 @@
 	.file 34 "include/log.h"
 	.file 35 "include/stdio.h"
 	.file 36 "./arch/arm/include/asm/arch/sdram.h"
-	.file 37 "cmd/ddr_tool/../memtester/io_map.h"
-	.file 38 "cmd/ddr_tool/../memtester/ddr_tester_common.h"
+	.file 37 "cmd/ddr_tool/io_map.h"
+	.file 38 "cmd/ddr_tool/ddr_tool_common.h"
 	.file 39 "include/vsprintf.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
diff --git a/u-boot/cmd/ddr_tool/ddr_test_px30.S b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S
similarity index 99%
copy from u-boot/cmd/ddr_tool/ddr_test_px30.S
copy to u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S
index a6e9854..dc34485 100644
--- a/u-boot/cmd/ddr_tool/ddr_test_px30.S
+++ b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S
@@ -1814,8 +1814,8 @@
 	.file 36 "include/log.h"
 	.file 37 "include/stdio.h"
 	.file 38 "./arch/arm/include/asm/arch/sdram.h"
-	.file 39 "cmd/ddr_tool/../memtester/io_map.h"
-	.file 40 "cmd/ddr_tool/../memtester/ddr_tester_common.h"
+	.file 39 "cmd/ddr_tool/io_map.h"
+	.file 40 "cmd/ddr_tool/ddr_tool_common.h"
 	.file 41 "include/vsprintf.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
diff --git a/u-boot/cmd/ddr_tool/ddr_test_rk3328.S b/u-boot/cmd/ddr_tool/ddr_test_rk3328.S
deleted file mode 100644
index a6e9854..0000000
--- a/u-boot/cmd/ddr_tool/ddr_test_rk3328.S
+++ /dev/null
@@ -1,9940 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
-/*
- * Copyright (C) 2019 Rockchip Electronics Co., Ltd.
- */
-
-	.arch armv8-a+nosimd
-	.file	"ddr_test_code.c"
-	.text
-.Ltext0:
-	.cfi_sections	.debug_frame
-	.section	.text.crosstalk,"ax",@progbits
-	.align	2
-	.global	crosstalk
-	.type	crosstalk, %function
-crosstalk:
-.LFB200:
-	.file 1 "cmd/ddr_tool/crosstalk.c"
-	.loc 1 46 0
-	.cfi_startproc
-.LVL0:
-	stp	x29, x30, [sp, -144]!
-	.cfi_def_cfa_offset 144
-	.cfi_offset 29, -144
-	.cfi_offset 30, -136
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	stp	x21, x22, [sp, 32]
-	.cfi_offset 21, -112
-	.cfi_offset 22, -104
-	.loc 1 66 0
-	adrp	x22, .LC2
-	.loc 1 46 0
-	stp	x23, x24, [sp, 48]
-	.cfi_offset 23, -96
-	.cfi_offset 24, -88
-	mov	x23, x0
-	stp	x19, x20, [sp, 16]
-	mov	x24, x1
-	stp	x25, x26, [sp, 64]
-	.loc 1 63 0
-	adrp	x0, .LC1
-.LVL1:
-	.loc 1 46 0
-	stp	x27, x28, [sp, 80]
-	.cfi_offset 19, -128
-	.cfi_offset 20, -120
-	.cfi_offset 25, -80
-	.cfi_offset 26, -72
-	.cfi_offset 27, -64
-	.cfi_offset 28, -56
-	.loc 1 63 0
-	add	x0, x0, :lo12:.LC1
-	bl	printf
-.LVL2:
-	.loc 1 71 0
-	add	x21, x29, 112
-	.loc 1 66 0
-	add	x0, x22, :lo12:.LC2
-	.loc 1 68 0
-	adrp	x25, .LC3
-	.loc 1 66 0
-	str	x0, [x29, 104]
-	.loc 1 64 0
-	mov	w20, 0
-	.loc 1 68 0
-	add	x0, x25, :lo12:.LC3
-	str	x0, [x29, 96]
-.LVL3:
-.L6:
-	.loc 1 66 0
-	ldr	x0, [x29, 104]
-	.loc 1 71 0
-	mov	w26, 1
-	.loc 1 66 0
-	mov	w1, w20
-	.loc 1 71 0
-	lsl	w26, w26, w20
-	.loc 1 65 0
-	mov	w28, -1
-	.loc 1 67 0
-	mov	w27, 0
-	.loc 1 66 0
-	bl	printf
-.LVL4:
-.L5:
-	.loc 1 68 0
-	ldr	x0, [x29, 96]
-	mov	w1, w27
-	.loc 1 69 0
-	mvn	w28, w28
-.LVL5:
-	mov	x19, 0
-	.loc 1 68 0
-	bl	printf
-.LVL6:
-.L2:
-	.loc 1 71 0 discriminator 3
-	eor	w0, w26, w28
-	str	w0, [x19, x21]
-	add	x19, x19, 4
-	.loc 1 72 0 discriminator 3
-	mvn	w28, w28
-.LVL7:
-	.loc 1 70 0 discriminator 3
-	cmp	x19, 32
-	bne	.L2
-	.loc 1 74 0
-	mov	w1, w19
-	mov	x0, x21
-	bl	data_cpu_2_io
-.LVL8:
-	.loc 1 75 0
-	mov	x3, x24
-	mov	x2, x23
-	mov	w1, w19
-	mov	x0, x21
-	bl	write_buf_to_ddr
-.LVL9:
-	.loc 1 76 0
-	mov	w4, 1
-	mov	x3, x24
-	mov	x2, x23
-	mov	w1, w19
-	mov	x0, x21
-	bl	cmp_buf_data
-.LVL10:
-	cbz	x0, .L3
-.LVL11:
-.L11:
-	.loc 1 78 0
-	mov	w0, -1
-.L1:
-	.loc 1 111 0
-	ldp	x19, x20, [sp, 16]
-	ldp	x21, x22, [sp, 32]
-	ldp	x23, x24, [sp, 48]
-.LVL12:
-	ldp	x25, x26, [sp, 64]
-	ldp	x27, x28, [sp, 80]
-	ldp	x29, x30, [sp], 144
-	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 27
-	.cfi_restore 28
-	.cfi_restore 25
-	.cfi_restore 26
-	.cfi_restore 23
-	.cfi_restore 24
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_def_cfa 31, 0
-	ret
-.LVL13:
-.L3:
-	.cfi_restore_state
-	.loc 1 67 0 discriminator 2
-	add	w27, w27, 1
-.LVL14:
-	cmp	w27, 2
-	bne	.L5
-	.loc 1 64 0 discriminator 2
-	add	w20, w20, 1
-.LVL15:
-	cmp	w20, 32
-	bne	.L6
-	.loc 1 85 0
-	adrp	x0, .LC4
-	add	x0, x0, :lo12:.LC4
-	bl	printf
-.LVL16:
-	.loc 1 86 0
-	mov	x0, 128
-	bl	malloc
-.LVL17:
-	mov	x21, x0
-.LVL18:
-	.loc 1 87 0
-	cbnz	x0, .L7
-	.loc 1 88 0
-	adrp	x0, .LC5
-.LVL19:
-	mov	x1, 128
-	add	x0, x0, :lo12:.LC5
-	bl	printf
-.LVL20:
-.L7:
-	adrp	x26, .LANCHOR0
-	.loc 1 91 0
-	add	x27, x22, :lo12:.LC2
-.LVL21:
-	.loc 1 93 0
-	add	x25, x25, :lo12:.LC3
-	.loc 1 98 0
-	add	x26, x26, :lo12:.LANCHOR0
-	.loc 1 69 0
-	mov	w20, 0
-.LVL22:
-.L14:
-	.loc 1 92 0
-	mov	w22, 0
-	.loc 1 96 0
-	mov	w28, 1
-	.loc 1 91 0
-	mov	w1, w20
-	mov	x0, x27
-	bl	printf
-.LVL23:
-.L13:
-	.loc 1 93 0
-	mov	w1, w22
-	mov	x0, x25
-	bl	printf
-.LVL24:
-	.loc 1 96 0
-	mov	x19, 0
-	lsl	w1, w28, w22
-.LVL25:
-.L10:
-	ldr	w0, [x19, x26]
-	.loc 1 95 0
-	cbz	w20, .L8
-	.loc 1 96 0
-	eor	w0, w0, w1
-.L8:
-	.loc 1 98 0
-	str	w0, [x21, x19]
-	add	x19, x19, 4
-	.loc 1 94 0
-	cmp	x19, 128
-	bne	.L10
-	.loc 1 100 0
-	mov	w1, w19
-	mov	x0, x21
-	bl	data_cpu_2_io
-.LVL26:
-	.loc 1 101 0
-	mov	x3, x24
-	mov	x2, x23
-	mov	w1, w19
-	mov	x0, x21
-	bl	write_buf_to_ddr
-.LVL27:
-	.loc 1 103 0
-	mov	w4, 1
-	mov	x3, x24
-	mov	x2, x23
-	mov	w1, w19
-	mov	x0, x21
-	bl	cmp_buf_data
-.LVL28:
-	cbnz	x0, .L11
-	.loc 1 106 0
-	cbz	w20, .L12
-	.loc 1 92 0 discriminator 2
-	add	w22, w22, 1
-.LVL29:
-	cmp	w22, 32
-	bne	.L13
-.L12:
-	.loc 1 90 0 discriminator 2
-	add	w20, w20, 1
-.LVL30:
-	cmp	w20, 2
-	bne	.L14
-	.loc 1 110 0
-	mov	w0, 0
-	b	.L1
-	.cfi_endproc
-.LFE200:
-	.size	crosstalk, .-crosstalk
-	.section	.text.set_ddr_freq,"ax",@progbits
-	.align	2
-	.weak	set_ddr_freq
-	.type	set_ddr_freq, %function
-set_ddr_freq:
-.LFB253:
-	.file 2 "cmd/ddr_tool/ddr_tool.c"
-	.loc 2 45 0
-	.cfi_startproc
-.LVL31:
-	.loc 2 47 0
-	mov	w0, 0
-.LVL32:
-	ret
-	.cfi_endproc
-.LFE253:
-	.size	set_ddr_freq, .-set_ddr_freq
-	.section	.text.set_vdd_logic,"ax",@progbits
-	.align	2
-	.weak	set_vdd_logic
-	.type	set_vdd_logic, %function
-set_vdd_logic:
-.LFB254:
-	.loc 2 50 0
-	.cfi_startproc
-.LVL33:
-	.loc 2 52 0
-	mov	w0, -1
-.LVL34:
-	ret
-	.cfi_endproc
-.LFE254:
-	.size	set_vdd_logic, .-set_vdd_logic
-	.section	.text.diagonalscan,"ax",@progbits
-	.align	2
-	.global	diagonalscan
-	.type	diagonalscan, %function
-diagonalscan:
-.LFB268:
-	.file 3 "cmd/ddr_tool/diagonalscan.c"
-	.loc 3 16 0
-	.cfi_startproc
-.LVL35:
-	stp	x29, x30, [sp, -112]!
-	.cfi_def_cfa_offset 112
-	.cfi_offset 29, -112
-	.cfi_offset 30, -104
-	.loc 3 19 0
-	mov	x2, 32
-	.loc 3 16 0
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	stp	x21, x22, [sp, 32]
-	.cfi_offset 21, -80
-	.cfi_offset 22, -72
-	mov	x22, x1
-	stp	x23, x24, [sp, 48]
-	.cfi_offset 23, -64
-	.cfi_offset 24, -56
-	sub	x23, x1, #32
-	.loc 3 19 0
-	adrp	x1, .LANCHOR1
-.LVL36:
-	add	x1, x1, :lo12:.LANCHOR1
-	.loc 3 16 0
-	stp	x19, x20, [sp, 16]
-	stp	x25, x26, [sp, 64]
-	.cfi_offset 19, -96
-	.cfi_offset 20, -88
-	.cfi_offset 25, -48
-	.cfi_offset 26, -40
-	.loc 3 16 0
-	mov	x25, x0
-	.loc 3 19 0
-	add	x0, x29, 80
-.LVL37:
-	bl	memcpy
-.LVL38:
-	.loc 3 24 0
-	adrp	x0, .LC6
-	add	x0, x0, :lo12:.LC6
-	bl	printf
-.LVL39:
-	.loc 3 25 0
-	bl	get_page_size
-.LVL40:
-	sxtw	x19, w0
-.LVL41:
-	.loc 3 27 0
-	tbz	w19, #31, .L28
-	.loc 3 28 0
-	mov	w1, w19
-	adrp	x0, .LC7
-	add	x0, x0, :lo12:.LC7
-	bl	printf
-.LVL42:
-	.loc 3 29 0
-	mov	w0, -1
-.L31:
-.LVL43:
-.L27:
-	.loc 3 64 0
-	ldp	x19, x20, [sp, 16]
-.LVL44:
-	ldp	x21, x22, [sp, 32]
-	ldp	x23, x24, [sp, 48]
-	ldp	x25, x26, [sp, 64]
-.LVL45:
-	ldp	x29, x30, [sp], 112
-	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 25
-	.cfi_restore 26
-	.cfi_restore 23
-	.cfi_restore 24
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_def_cfa 31, 0
-	ret
-.LVL46:
-.L28:
-	.cfi_restore_state
-	.loc 3 40 0
-	lsr	x22, x22, 1
-.LVL47:
-	add	x23, x25, x23
-.LVL48:
-	mov	w21, 0
-	mov	x20, 0
-	.loc 3 37 0
-	mov	w1, 32
-	add	x0, x29, 80
-	bl	data_cpu_2_io
-.LVL49:
-	.loc 3 39 0
-	mov	x2, 32
-	add	x1, x29, 80
-	mov	x0, x25
-	bl	memcpy
-.LVL50:
-.L30:
-	.loc 3 40 0 discriminator 1
-	cmp	x20, x22
-	bcc	.L34
-	mov	x0, 0
-.LVL51:
-	.loc 3 63 0
-	b	.L27
-.LVL52:
-.L34:
-	.loc 3 41 0
-	uxtw	x24, w21
-	mov	x2, 32
-	sub	x26, x23, x24
-	add	x1, x29, 80
-	mov	x0, x26
-	bl	memcpy
-.LVL53:
-	.loc 3 44 0
-	add	x2, x20, x25
-	.loc 3 43 0
-	mov	x3, 32
-	mov	w4, 1
-	add	x2, x2, x24
-	mov	w1, w3
-	add	x0, x29, 80
-	bl	cmp_buf_data
-.LVL54:
-	.loc 3 45 0
-	cbnz	x0, .L27
-	.loc 3 48 0
-	add	x24, x24, 40
-	add	x20, x20, x19
-.LVL55:
-	cmp	x19, x24
-	add	w21, w21, 8
-.LVL56:
-	csel	w21, w21, wzr, cs
-.LVL57:
-	.loc 3 50 0
-	cmp	x22, x20
-	bls	.L33
-	.loc 3 51 0
-	add	x0, x25, x20
-.LVL58:
-	mov	x2, 32
-	add	x1, x29, 80
-	add	x0, x0, x21, uxtw
-	bl	memcpy
-.LVL59:
-.L33:
-	.loc 3 53 0
-	mov	x3, 32
-	mov	w4, 1
-	mov	x2, x26
-	mov	w1, w3
-	add	x0, x29, 80
-	sub	x23, x23, x19
-	bl	cmp_buf_data
-.LVL60:
-	.loc 3 56 0
-	cbz	x0, .L30
-	b	.L27
-	.cfi_endproc
-.LFE268:
-	.size	diagonalscan, .-diagonalscan
-	.section	.text.random_test,"ax",@progbits
-	.align	2
-	.global	random_test
-	.type	random_test, %function
-random_test:
-.LFB271:
-	.file 4 "cmd/ddr_tool/random_test.c"
-	.loc 4 97 0
-	.cfi_startproc
-.LVL61:
-	stp	x29, x30, [sp, -112]!
-	.cfi_def_cfa_offset 112
-	.cfi_offset 29, -112
-	.cfi_offset 30, -104
-.LBB6:
-.LBB7:
-	.loc 4 19 0
-	mov	x2, x1
-.LBE7:
-.LBE6:
-	.loc 4 97 0
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	stp	x19, x20, [sp, 16]
-	.cfi_offset 19, -96
-	.cfi_offset 20, -88
-	mov	x20, x1
-	stp	x21, x22, [sp, 32]
-	mov	x19, x0
-.LVL62:
-	stp	x23, x24, [sp, 48]
-.LBB12:
-.LBB8:
-	.loc 4 19 0
-	mov	w1, -2139062144
-.LVL63:
-.LBE8:
-.LBE12:
-	.loc 4 97 0
-	stp	x27, x28, [sp, 80]
-	.cfi_offset 21, -80
-	.cfi_offset 22, -72
-	.cfi_offset 23, -64
-	.cfi_offset 24, -56
-	.cfi_offset 27, -32
-	.cfi_offset 28, -24
-.LBB13:
-.LBB9:
-	.loc 4 24 0
-	adrp	x24, .LC8
-.LBE9:
-.LBE13:
-	.loc 4 97 0
-	stp	x25, x26, [sp, 64]
-	.cfi_offset 25, -48
-	.cfi_offset 26, -40
-.LBB14:
-.LBB10:
-	.loc 4 19 0
-	bl	memset
-.LVL64:
-	.loc 4 25 0
-	lsr	x0, x20, 2
-	.loc 4 24 0
-	add	x24, x24, :lo12:.LC8
-	.loc 4 25 0
-	str	x0, [x29, 104]
-	.loc 4 15 0
-	mov	w27, 0
-	.loc 4 41 0
-	adrp	x0, .LC9
-	.loc 4 21 0
-	mov	w23, 1077952576
-	.loc 4 41 0
-	add	x0, x0, :lo12:.LC9
-	.loc 4 20 0
-	mov	w21, -2139062144
-	.loc 4 23 0
-	mov	w22, 0
-	.loc 4 41 0
-	str	x0, [x29, 96]
-.LVL65:
-.L43:
-	.loc 4 24 0
-	mov	w1, w22
-	mov	x0, x24
-	bl	printf
-.LVL66:
-	.loc 4 25 0
-	mov	w1, 0
-.LVL67:
-.L38:
-	ldr	x2, [x29, 104]
-	uxtw	x0, w1
-	cmp	x0, x2
-	bcc	.L42
-.LVL68:
-.L41:
-	.loc 4 41 0
-	ldr	x0, [x29, 96]
-	.loc 4 23 0
-	add	w22, w22, 1
-.LVL69:
-	.loc 4 39 0
-	lsr	w23, w23, 1
-.LVL70:
-	.loc 4 40 0
-	lsr	w21, w21, 1
-.LVL71:
-	.loc 4 41 0
-	bl	printf
-.LVL72:
-	.loc 4 23 0
-	cmp	w22, 8
-	bne	.L43
-	mov	x28, -1
-	b	.L40
-.LVL73:
-.L42:
-	.loc 4 26 0
-	lsl	x0, x0, 2
-	add	x5, x19, x0
-	ldr	w26, [x19, x0]
-	.loc 4 27 0
-	cmp	w26, w21
-	beq	.L39
-	.loc 4 28 0
-	mov	x28, x5
-.LVL74:
-	.loc 4 29 0
-	add	x1, x5, 4
-.LVL75:
-	mov	x0, x5
-	bl	flush_dcache_range
-.LVL76:
-	.loc 4 37 0
-	cmn	x28, #1
-	.loc 4 32 0
-	ldr	w27, [x28]
-	.loc 4 37 0
-	beq	.L41
-.LVL77:
-.L40:
-	.loc 4 43 0
-	adrp	x0, .LC10
-	add	x0, x0, :lo12:.LC10
-	bl	printf
-.LVL78:
-	.loc 4 44 0
-	cmn	x28, #1
-	beq	.L44
-	.loc 4 45 0
-	adrp	x0, .LC11
-	mov	w4, w21
-	mov	w3, w27
-	mov	w2, w26
-	mov	x1, x28
-	add	x0, x0, :lo12:.LC11
-	bl	printf
-.LVL79:
-.L57:
-.LBE10:
-.LBE14:
-.LBB15:
-.LBB16:
-	.loc 4 91 0
-	mov	w0, -1
-.L37:
-.LBE16:
-.LBE15:
-	.loc 4 105 0
-	ldp	x19, x20, [sp, 16]
-.LVL80:
-	ldp	x21, x22, [sp, 32]
-	ldp	x23, x24, [sp, 48]
-	ldp	x25, x26, [sp, 64]
-	ldp	x27, x28, [sp, 80]
-	ldp	x29, x30, [sp], 112
-	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 27
-	.cfi_restore 28
-	.cfi_restore 25
-	.cfi_restore 26
-	.cfi_restore 23
-	.cfi_restore 24
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_def_cfa 31, 0
-	ret
-.LVL81:
-.L39:
-	.cfi_restore_state
-.LBB18:
-.LBB11:
-	.loc 4 35 0
-	str	w23, [x19, x0]
-	.loc 4 25 0
-	add	w1, w1, 1
-.LVL82:
-	b	.L38
-.LVL83:
-.L44:
-.LBE11:
-.LBE18:
-.LBB19:
-.LBB17:
-	.loc 4 64 0
-	adrp	x26, .LC12
-	.loc 4 84 0
-	adrp	x24, .LC13
-	.loc 4 72 0
-	lsr	x28, x20, 3
-	.loc 4 64 0
-	add	x26, x26, :lo12:.LC12
-	.loc 4 84 0
-	add	x24, x24, :lo12:.LC13
-	.loc 4 72 0
-	mov	x27, 0
-	mov	x21, 0
-.LVL84:
-.L51:
-	.loc 4 64 0
-	mov	x1, x21
-	mov	x0, x26
-	bl	printf
-.LVL85:
-	.loc 4 66 0
-	lsl	x22, x21, 24
-	lsl	x0, x21, 8
-	orr	x22, x22, x21, lsl 32
-	orr	x0, x0, x21, lsl 16
-	.loc 4 70 0
-	mov	x2, x20
-	.loc 4 66 0
-	orr	x22, x22, x0
-	lsl	x0, x21, 40
-	orr	x0, x0, x21, lsl 48
-	orr	x22, x22, x0
-	orr	x0, x21, x21, lsl 56
-	orr	x22, x22, x0
-.LVL86:
-	.loc 4 70 0
-	mov	x0, x19
-	mov	w1, w22
-	bl	memset
-.LVL87:
-	.loc 4 72 0
-	mov	x0, 0
-.LVL88:
-.L46:
-	cmp	x0, x28
-	bne	.L50
-.LVL89:
-.L49:
-	.loc 4 84 0
-	mov	x0, x24
-	.loc 4 63 0
-	add	x21, x21, 1
-.LVL90:
-	.loc 4 84 0
-	bl	printf
-.LVL91:
-	.loc 4 63 0
-	cmp	x21, 256
-	bne	.L51
-	mov	x23, -1
-	b	.L48
-.LVL92:
-.L50:
-	lsl	x1, x0, 3
-	add	x23, x1, x19
-	.loc 4 73 0
-	ldr	x25, [x1, x19]
-.LVL93:
-	.loc 4 74 0
-	cmp	x22, x25
-	beq	.L47
-.LVL94:
-	.loc 4 76 0
-	add	x1, x23, 4
-	mov	x0, x23
-.LVL95:
-	bl	flush_dcache_range
-.LVL96:
-	.loc 4 78 0
-	ldr	x27, [x23]
-.LVL97:
-	.loc 4 82 0
-	cmn	x23, #1
-	beq	.L49
-.LVL98:
-.L48:
-	.loc 4 86 0
-	adrp	x0, .LC14
-	add	x0, x0, :lo12:.LC14
-	bl	printf
-.LVL99:
-	.loc 4 93 0
-	mov	w0, 0
-	.loc 4 87 0
-	cmn	x23, #1
-	beq	.L37
-	.loc 4 88 0
-	mov	x4, x22
-	mov	x3, x27
-	mov	x2, x25
-	mov	x1, x23
-	adrp	x0, .LC15
-	add	x0, x0, :lo12:.LC15
-	bl	printf
-.LVL100:
-	b	.L57
-.LVL101:
-.L47:
-	.loc 4 72 0
-	add	x0, x0, 1
-.LVL102:
-	b	.L46
-.LBE17:
-.LBE19:
-	.cfi_endproc
-.LFE271:
-	.size	random_test, .-random_test
-	.section	.text.scan_freq,"ax",@progbits
-	.align	2
-	.type	scan_freq, %function
-scan_freq:
-.LFB255:
-	.loc 2 55 0
-	.cfi_startproc
-.LVL103:
-	stp	x29, x30, [sp, -80]!
-	.cfi_def_cfa_offset 80
-	.cfi_offset 29, -80
-	.cfi_offset 30, -72
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	stp	x19, x20, [sp, 16]
-	.cfi_offset 19, -64
-	.cfi_offset 20, -56
-	mov	w19, w0
-	stp	x21, x22, [sp, 32]
-	.loc 2 61 0
-	mov	w0, 16960
-.LVL104:
-	.loc 2 55 0
-	stp	x23, x24, [sp, 48]
-	.loc 2 61 0
-	movk	w0, 0xf, lsl 16
-	.loc 2 55 0
-	stp	x25, x26, [sp, 64]
-	.cfi_offset 21, -48
-	.cfi_offset 22, -40
-	.cfi_offset 23, -32
-	.cfi_offset 24, -24
-	.cfi_offset 25, -16
-	.cfi_offset 26, -8
-	.loc 2 55 0
-	mov	x22, x2
-	.loc 2 61 0
-	cmp	w19, w0
-	bls	.L59
-	.loc 2 62 0
-	udiv	w19, w19, w0
-.LVL105:
-.L59:
-	.loc 2 63 0
-	cmp	w1, w0
-	bls	.L60
-	.loc 2 64 0
-	udiv	w1, w1, w0
-.LVL106:
-.L60:
-	.loc 2 66 0
-	cmp	w19, w1
-	bls	.L61
-	mov	w0, w19
-	mov	w19, w1
-.LVL107:
-	mov	w1, w0
-.LVL108:
-.L61:
-	.loc 2 75 0
-	mov	w25, 16960
-	adrp	x24, .LC16
-	.loc 2 71 0
-	sub	w21, w1, w19
-.LVL109:
-	.loc 2 75 0
-	add	x24, x24, :lo12:.LC16
-	.loc 2 73 0
-	mov	w23, 0
-	.loc 2 75 0
-	movk	w25, 0xf, lsl 16
-.LVL110:
-.L62:
-	.loc 2 73 0 discriminator 1
-	cmp	x22, x23, uxtw
-	bhi	.L66
-	.loc 2 73 0 is_stmt 0 discriminator 3
-	cbnz	x22, .L67
-.L66:
-	.loc 2 74 0 is_stmt 1
-	bl	rand
-.LVL111:
-	udiv	w20, w0, w21
-	.loc 2 75 0
-	mov	w1, w23
-	.loc 2 74 0
-	msub	w20, w20, w21, w0
-	.loc 2 75 0
-	mov	x0, x24
-.LVL112:
-	.loc 2 74 0
-	add	w20, w20, w19
-	.loc 2 75 0
-	mul	w20, w20, w25
-	mov	w2, w20
-	bl	printf
-.LVL113:
-	.loc 2 76 0
-	and	x0, x20, 4294967232
-	bl	set_ddr_freq
-.LVL114:
-	mov	w26, w0
-.LVL115:
-	.loc 2 79 0
-	ldr	x0, [x18]
-.LVL116:
-	mov	x1, 1048576
-	ldr	x0, [x0, 136]
-	bl	random_test
-.LVL117:
-	mov	w20, w0
-.LVL118:
-	.loc 2 80 0
-	cbz	w0, .L63
-	.loc 2 81 0
-	adrp	x0, .LC17
-.LVL119:
-	mov	w1, w26
-	add	x0, x0, :lo12:.LC17
-	bl	printf
-.LVL120:
-.L58:
-	.loc 2 91 0
-	mov	w0, w20
-	ldp	x19, x20, [sp, 16]
-.LVL121:
-	ldp	x21, x22, [sp, 32]
-.LVL122:
-	ldp	x23, x24, [sp, 48]
-.LVL123:
-	ldp	x25, x26, [sp, 64]
-	ldp	x29, x30, [sp], 80
-	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 25
-	.cfi_restore 26
-	.cfi_restore 23
-	.cfi_restore 24
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_def_cfa 31, 0
-	ret
-.LVL124:
-.L63:
-	.cfi_restore_state
-	.loc 2 84 0
-	bl	ctrlc
-.LVL125:
-	cbz	w0, .L65
-.LVL126:
-.L67:
-	.loc 2 73 0
-	mov	w20, 0
-	b	.L58
-.LVL127:
-.L65:
-	.loc 2 73 0 is_stmt 0 discriminator 2
-	add	w23, w23, 1
-.LVL128:
-	b	.L62
-	.cfi_endproc
-.LFE255:
-	.size	scan_freq, .-scan_freq
-	.section	.text.do_ddr_test,"ax",@progbits
-	.align	2
-	.type	do_ddr_test, %function
-do_ddr_test:
-.LFB256:
-	.loc 2 100 0 is_stmt 1
-	.cfi_startproc
-.LVL129:
-	stp	x29, x30, [sp, -224]!
-	.cfi_def_cfa_offset 224
-	.cfi_offset 29, -224
-	.cfi_offset 30, -216
-	.loc 2 113 0
-	adrp	x0, .LC18
-.LVL130:
-	add	x0, x0, :lo12:.LC18
-	.loc 2 100 0
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	stp	x19, x20, [sp, 16]
-	.cfi_offset 19, -208
-	.cfi_offset 20, -200
-	.loc 2 115 0
-	add	x20, x29, 152
-	.loc 2 100 0
-	stp	x21, x22, [sp, 32]
-	.cfi_offset 21, -192
-	.cfi_offset 22, -184
-	.loc 2 115 0
-	add	x21, x29, 120
-	.loc 2 100 0
-	stp	x23, x24, [sp, 48]
-	.cfi_offset 23, -176
-	.cfi_offset 24, -168
-	mov	w23, w2
-	stp	x25, x26, [sp, 64]
-	.cfi_offset 25, -160
-	.cfi_offset 26, -152
-	mov	x26, x3
-	stp	x27, x28, [sp, 80]
-	.cfi_offset 27, -144
-	.cfi_offset 28, -136
-	.loc 2 103 0
-	stp	xzr, xzr, [x29, 184]
-	stp	xzr, xzr, [x29, 200]
-	str	xzr, [x29, 216]
-.LVL131:
-	.loc 2 113 0
-	bl	printf
-.LVL132:
-	.loc 2 115 0
-	mov	w2, 1
-	mov	x1, x20
-	mov	x0, x21
-	bl	get_print_available_addr
-.LVL133:
-	.loc 2 117 0
-	cmp	w23, 1
-	ble	.L160
-	.loc 2 121 0
-	adrp	x24, .LANCHOR2
-	add	x27, x24, :lo12:.LANCHOR2
-	mov	x25, 0
-	str	x24, [x29, 104]
-.L75:
-	ldr	x1, [x27, x25, lsl 3]
-	mov	w19, w25
-.LVL134:
-	ldr	x0, [x26, 8]
-	bl	strcasecmp
-.LVL135:
-	cbz	w0, .L74
-.LVL136:
-	add	x25, x25, 1
-	.loc 2 120 0 discriminator 2
-	cmp	x25, 7
-	bne	.L75
-	.loc 2 128 0
-	adrp	x0, .LC27
-	add	x0, x0, :lo12:.LC27
-	b	.L161
-.LVL137:
-.L112:
-	.loc 2 133 0
-	adrp	x0, .LC19
-	add	x0, x0, :lo12:.LC19
-.LVL138:
-.L161:
-	.loc 2 128 0
-	bl	printf
-.LVL139:
-.L160:
-	.loc 2 129 0
-	mov	w23, -1
-	b	.L72
-.LVL140:
-.L78:
-	.loc 2 138 0
-	add	x0, x26, x27
-	add	x1, x29, 184
-	add	x2, x1, x27
-	mov	w1, 0
-	add	x27, x27, 8
-	ldr	x0, [x0, 16]
-	bl	strict_strtoul
-.LVL141:
-	tbz	w0, #31, .L77
-	.loc 2 139 0
-	adrp	x0, .LC20
-	add	x0, x0, :lo12:.LC20
-	b	.L161
-.LVL142:
-.L79:
-	.loc 2 157 0
-	bl	data_cpu_2_io_init
-.LVL143:
-	.loc 2 159 0
-	cbnz	w19, .L80
-	.loc 2 161 0
-	ldr	x0, [x29, 192]
-	cbz	x0, .L81
-	.loc 2 162 0
-	bl	set_vdd_logic
-.LVL144:
-.L81:
-	.loc 2 163 0
-	ldr	x0, [x29, 184]
-	bl	set_ddr_freq
-.LVL145:
-.L82:
-	.loc 2 305 0
-	adrp	x0, .LC26
-	add	x0, x0, :lo12:.LC26
-	bl	printf
-.LVL146:
-	b	.L72
-.LVL147:
-.L80:
-	.loc 2 164 0
-	cmp	w19, 1
-	bne	.L83
-	.loc 2 166 0
-	ldr	x0, [x29, 208]
-	cbz	x0, .L84
-	.loc 2 167 0
-	bl	set_vdd_logic
-.LVL148:
-.L84:
-	.loc 2 168 0
-	ldr	w0, [x29, 184]
-	ldr	w1, [x29, 192]
-	ldr	x2, [x29, 200]
-	bl	scan_freq
-.LVL149:
-	b	.L82
-.L83:
-	.loc 2 169 0
-	sub	w25, w25, #5
-	cmp	w25, 1
-	bhi	.L85
-	.loc 2 171 0
-	ldr	x0, [x29, 208]
-	cbz	x0, .L86
-	.loc 2 172 0
-	bl	set_vdd_logic
-.LVL150:
-.L86:
-	.loc 2 173 0
-	cmp	w19, 5
-	bne	.L114
-	.loc 2 175 0
-	mov	x1, 65535
-	mov	x0, 0
-	movk	x1, 0x9f, lsl 16
-.L90:
-.LVL151:
-	ldr	x2, [x20, x0, lsl 3]
-	cmp	x2, x1
-	bls	.L88
-	.loc 2 176 0
-	mov	w1, w0
-.LVL152:
-	.loc 2 185 0
-	mov	x2, 10485760
-	str	x2, [x20, w0, uxtw 3]
-.LVL153:
-.L89:
-	.loc 2 108 0 discriminator 1
-	mov	x0, 0
-.LVL154:
-.L93:
-	.loc 2 188 0
-	cmp	w1, w0
-	beq	.L92
-	.loc 2 190 0
-	str	xzr, [x21, x0, lsl 3]
-	.loc 2 191 0
-	str	xzr, [x20, x0, lsl 3]
-.L92:
-.LVL155:
-	add	x0, x0, 1
-.LVL156:
-	.loc 2 187 0 discriminator 2
-	cmp	x0, 4
-	bne	.L93
-	.loc 2 193 0
-	mov	w28, 60
-.L87:
-.LVL157:
-	.loc 2 201 0
-	adrp	x26, .LC22
-.LVL158:
-	.loc 2 205 0
-	adrp	x27, .LC23
-	.loc 2 201 0
-	add	x26, x26, :lo12:.LC22
-	.loc 2 205 0
-	add	x27, x27, :lo12:.LC23
-	.loc 2 198 0
-	mov	w25, 0
-.LVL159:
-.L94:
-	.loc 2 199 0
-	ldr	x0, [x29, 200]
-	cbz	x0, .L100
-	.loc 2 199 0 is_stmt 0 discriminator 1
-	cmp	x0, x25, uxtw
-	bls	.L82
-.L100:
-	.loc 2 201 0 is_stmt 1
-	mov	x19, 0
-	.loc 2 200 0
-	add	w25, w25, 1
-.LVL160:
-	.loc 2 201 0
-	mov	w1, w25
-	mov	x0, x26
-	bl	printf
-.LVL161:
-.L98:
-	.loc 2 203 0
-	ldr	x3, [x20, x19, lsl 3]
-	cbz	x3, .L95
-	.loc 2 205 0
-	ldr	x2, [x21, x19, lsl 3]
-	mov	w1, w19
-	mov	x0, x27
-	bl	printf
-.LVL162:
-	.loc 2 207 0
-	ldr	x0, [x29, 192]
-	bl	set_ddr_freq
-.LVL163:
-	.loc 2 208 0
-	ldr	x1, [x20, x19, lsl 3]
-	ldr	x0, [x21, x19, lsl 3]
-	bl	random_test
-.LVL164:
-	mov	w24, w0
-.LVL165:
-	.loc 2 210 0
-	cbnz	w0, .L115
-	.loc 2 211 0
-	ldr	x1, [x20, x19, lsl 3]
-	ldr	x0, [x21, x19, lsl 3]
-.LVL166:
-	bl	crosstalk
-.LVL167:
-	mov	w24, w0
-.LVL168:
-	.loc 2 215 0
-	cbnz	w0, .L116
-	.loc 2 216 0
-	ldr	x1, [x20, x19, lsl 3]
-	ldr	x0, [x21, x19, lsl 3]
-.LVL169:
-	bl	diagonalscan
-.LVL170:
-	mov	w24, w0
-.LVL171:
-	.loc 2 220 0
-	cbnz	w0, .L117
-	.loc 2 221 0
-	ldr	w0, [x29, 184]
-.LVL172:
-	and	x2, x28, 1020
-	ldr	w1, [x29, 192]
-	.loc 2 224 0
-	mov	w22, 1
-	.loc 2 221 0
-	bl	scan_freq
-.LVL173:
-	mov	w24, w0
-.LVL174:
-.L96:
-	.loc 2 226 0
-	ldr	x0, [x29, 184]
-.LVL175:
-	bl	set_ddr_freq
-.LVL176:
-	.loc 2 227 0
-	cbnz	w24, .L118
-	.loc 2 228 0
-	ldr	x1, [x20, x19, lsl 3]
-	ldr	x0, [x21, x19, lsl 3]
-	bl	random_test
-.LVL177:
-	mov	w2, w0
-.LVL178:
-	.loc 2 232 0
-	cbnz	w0, .L119
-	.loc 2 233 0
-	ldr	x1, [x20, x19, lsl 3]
-	ldr	x0, [x21, x19, lsl 3]
-.LVL179:
-	str	w2, [x29, 100]
-	bl	crosstalk
-.LVL180:
-	mov	w22, w0
-.LVL181:
-	.loc 2 237 0
-	ldr	w2, [x29, 100]
-	cbnz	w0, .L120
-	.loc 2 238 0
-	ldr	x1, [x20, x19, lsl 3]
-	ldr	x0, [x21, x19, lsl 3]
-.LVL182:
-	bl	diagonalscan
-.LVL183:
-	mov	w24, w0
-.LVL184:
-	.loc 2 243 0
-	cbnz	w0, .L121
-	.loc 2 245 0
-	bl	ctrlc
-.LVL185:
-	cbnz	w0, .L122
-	.loc 2 240 0
-	mov	w22, 4
-.LVL186:
-.L95:
-	add	x19, x19, 1
-.LVL187:
-	.loc 2 202 0 discriminator 2
-	cmp	x19, 4
-	bne	.L98
-	mov	w2, 0
-	mov	w24, 0
-.LVL188:
-.L97:
-	.loc 2 250 0
-	orr	w2, w24, w2
-.LVL189:
-	cbz	w2, .L94
-.LVL190:
-.L99:
-	.loc 2 302 0
-	cbz	w24, .L82
-	.loc 2 303 0
-	ldr	x0, [x29, 104]
-	add	x24, x0, :lo12:.LANCHOR2
-.LVL191:
-	adrp	x0, .LC25
-	add	x0, x0, :lo12:.LC25
-	ldr	x1, [x24, w22, sxtw 3]
-	bl	printf
-.LVL192:
-	b	.L72
-.LVL193:
-.L88:
-	add	x0, x0, 1
-.LVL194:
-	.loc 2 174 0 discriminator 2
-	cmp	x0, 4
-	bne	.L90
-	.loc 2 181 0
-	ldr	x2, [x29, 152]
-	mov	w1, 10
-	adrp	x0, .LC28
-	add	x0, x0, :lo12:.LC28
-	lsr	x2, x2, 20
-	bl	printf
-.LVL195:
-	.loc 2 108 0
-	mov	w1, 0
-	b	.L89
-.L114:
-	.loc 2 195 0
-	mov	w28, 1000
-	b	.L87
-.LVL196:
-.L115:
-	.loc 2 209 0
-	mov	w22, 2
-	b	.L96
-.LVL197:
-.L116:
-	.loc 2 213 0
-	mov	w22, 3
-	b	.L96
-.LVL198:
-.L117:
-	.loc 2 218 0
-	mov	w22, 4
-	b	.L96
-.LVL199:
-.L118:
-	mov	w2, 0
-	b	.L97
-.LVL200:
-.L119:
-	.loc 2 228 0
-	mov	w24, w0
-	mov	w2, 0
-	.loc 2 230 0
-	mov	w22, 2
-	b	.L97
-.LVL201:
-.L120:
-	.loc 2 233 0
-	mov	w24, w0
-	.loc 2 235 0
-	mov	w22, 3
-	b	.L97
-.LVL202:
-.L121:
-	mov	w2, w22
-.LVL203:
-.L158:
-	.loc 2 240 0
-	mov	w22, 4
-	b	.L97
-.L122:
-	.loc 2 246 0
-	mov	w2, -1
-	b	.L158
-.LVL204:
-.L85:
-	.loc 2 259 0
-	mov	x2, x20
-	mov	x1, x21
-	add	x0, x29, 200
-	bl	judge_test_addr
-.LVL205:
-	mov	w27, w0
-.LVL206:
-	.loc 2 260 0
-	cbz	w0, .L123
-	.loc 2 263 0
-	ldr	x0, [x29, 184]
-.LVL207:
-	bl	set_ddr_freq
-.LVL208:
-	.loc 2 265 0
-	ldr	x0, [x29, 216]
-	cbz	x0, .L102
-	.loc 2 266 0
-	bl	set_vdd_logic
-.LVL209:
-.L102:
-	.loc 2 270 0
-	adrp	x26, .LC24
-.LVL210:
-	mov	w25, 0
-	add	x26, x26, :lo12:.LC24
-	b	.L110
-.LVL211:
-.L111:
-	.loc 2 271 0
-	mov	x28, 0
-	.loc 2 269 0
-	add	w25, w25, 1
-.LVL212:
-	.loc 2 270 0
-	mov	w1, w25
-	mov	x0, x26
-	bl	printf
-.LVL213:
-.L103:
-	.loc 2 271 0 discriminator 1
-	cmp	w27, w28
-	bhi	.L109
-	mov	w0, 0
-	mov	w24, 0
-.LVL214:
-.L108:
-	.loc 2 297 0
-	orr	w0, w24, w0
-.LVL215:
-	cbnz	w0, .L99
-.LVL216:
-.L110:
-	.loc 2 268 0
-	ldr	x0, [x29, 192]
-	cbz	x0, .L111
-	.loc 2 268 0 is_stmt 0 discriminator 1
-	cmp	x0, x25, uxtw
-	bhi	.L111
-	b	.L82
-.LVL217:
-.L109:
-	.loc 2 278 0 is_stmt 1
-	ldr	x1, [x20, x28, lsl 3]
-	.loc 2 272 0
-	cmp	w19, 3
-	.loc 2 278 0
-	ldr	x0, [x21, x28, lsl 3]
-	.loc 2 272 0
-	beq	.L105
-	cmp	w19, 4
-	beq	.L106
-	.loc 2 274 0
-	bl	random_test
-.LVL218:
-.L159:
-	.loc 2 282 0
-	mov	w24, w0
-.LVL219:
-	.loc 2 290 0
-	bl	ctrlc
-.LVL220:
-	cbnz	w0, .L124
-	add	x28, x28, 1
-.LVL221:
-	mov	w22, w19
-	.loc 2 294 0
-	cbz	w24, .L103
-	mov	w22, w19
-	b	.L108
-.LVL222:
-.L105:
-	.loc 2 278 0
-	bl	crosstalk
-.LVL223:
-	b	.L159
-.L106:
-	.loc 2 282 0
-	bl	diagonalscan
-.LVL224:
-	b	.L159
-.LVL225:
-.L124:
-	mov	w22, w19
-	.loc 2 291 0
-	mov	w0, -1
-	b	.L108
-.LVL226:
-.L123:
-	.loc 2 261 0
-	mov	w23, 1
-.LVL227:
-	b	.L72
-.LVL228:
-.L74:
-	.loc 2 132 0
-	adrp	x0, .LANCHOR3
-	add	x0, x0, :lo12:.LANCHOR3
-	ldrb	w0, [x0, w25, sxtw]
-	cmp	w23, w0
-	blt	.L112
-	sub	w23, w23, #2
-.LVL229:
-	.loc 2 132 0 is_stmt 0 discriminator 1
-	mov	x27, 0
-	lsl	x23, x23, 3
-.LVL230:
-.L77:
-	.loc 2 137 0 is_stmt 1 discriminator 1
-	cmp	x27, x23
-	bne	.L78
-	.loc 2 147 0
-	add	x2, x29, 112
-	mov	w1, 0
-	mov	w0, 53
-	bl	uclass_get_device
-.LVL231:
-	mov	w23, w0
-.LVL232:
-	.loc 2 148 0
-	cbz	w0, .L79
-	.loc 2 149 0
-	mov	w1, w0
-	adrp	x0, .LC21
-.LVL233:
-	add	x0, x0, :lo12:.LC21
-	bl	printf
-.LVL234:
-.L72:
-	.loc 2 308 0
-	mov	w0, w23
-	ldp	x19, x20, [sp, 16]
-	ldp	x21, x22, [sp, 32]
-	ldp	x23, x24, [sp, 48]
-	ldp	x25, x26, [sp, 64]
-	ldp	x27, x28, [sp, 80]
-	ldp	x29, x30, [sp], 224
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 27
-	.cfi_restore 28
-	.cfi_restore 25
-	.cfi_restore 26
-	.cfi_restore 23
-	.cfi_restore 24
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_def_cfa 31, 0
-	ret
-	.cfi_endproc
-.LFE256:
-	.size	do_ddr_test, .-do_ddr_test
-	.global	_u_boot_list_2_cmd_2_ddr_test
-	.section	.rodata
-	.align	3
-	.set	.LANCHOR1,. + 0
-.LC0:
-	.word	1437226410
-	.word	-1437226411
-	.word	1515890085
-	.word	-1515890086
-	.word	-267448336
-	.word	267448335
-	.word	0
-	.word	-1
-	.section	.rodata.crosstalk.str1.1,"aMS",@progbits,1
-.LC1:
-	.string	"\nbitflip:   \n"
-.LC2:
-	.string	"\b\b\b%3u"
-.LC3:
-	.string	"%3u\b\b\b"
-.LC4:
-	.string	"\nISI:\n"
-.LC5:
-	.string	"malloc %lu byte fail\n"
-	.section	.rodata.diagonalscan.str1.1,"aMS",@progbits,1
-.LC6:
-	.string	"\nDiagonalScan\n"
-.LC7:
-	.string	"get page size fail:0x%x\n"
-	.section	.rodata.do_ddr_test.str1.1,"aMS",@progbits,1
-.LC18:
-	.string	"ddr tester version 1.0.1\n"
-.LC19:
-	.string	"test parameters error\n"
-.LC20:
-	.string	"test pattern error\n"
-.LC21:
-	.string	"rockchip dmc probe fail: %d\n"
-.LC22:
-	.string	"\rtimes:%08u:\n"
-.LC23:
-	.string	"loop:%d, start:0x%lx, len:0x%lx\n"
-.LC24:
-	.string	"\rtimes:%08u, "
-.LC25:
-	.string	"\n%s test fail\n"
-.LC26:
-	.string	"\ntest pass\n"
-.LC27:
-	.string	"test pattern unsupported\n"
-.LC28:
-	.string	"fasttest need %uMB, but actually only %luMB\n"
-	.section	.rodata.g_isi_pattern,"a",@progbits
-	.align	3
-	.set	.LANCHOR0,. + 0
-	.type	g_isi_pattern, %object
-	.size	g_isi_pattern, 128
-g_isi_pattern:
-	.word	-1
-	.word	0
-	.word	-1
-	.word	0
-	.word	-1
-	.word	0
-	.word	-1
-	.word	-1
-	.word	-1
-	.word	-1
-	.word	0
-	.word	-1
-	.word	-1
-	.word	-1
-	.word	-1
-	.word	0
-	.word	-1
-	.word	0
-	.word	-1
-	.word	0
-	.word	-1
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	-1
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.word	0
-	.section	.rodata.random_test.str1.1,"aMS",@progbits,1
-.LC8:
-	.string	"%u"
-.LC9:
-	.string	"\b"
-.LC10:
-	.string	" "
-.LC11:
-	.string	"\nrandom test1 fail:address:0x%lx,read:0x%x,reread:0x%x,expect:0x%x\n"
-.LC12:
-	.string	"%4lu"
-.LC13:
-	.string	"\b\b\b\b"
-.LC14:
-	.string	"    "
-.LC15:
-	.string	"\nrandom test2 fail:address:0x%lx,read:0x%lx,reread:0x%lx,expect:0x%lx\n"
-	.section	.rodata.scan_freq.str1.1,"aMS",@progbits,1
-.LC16:
-	.string	"% d:change freq to %d Hz\n"
-.LC17:
-	.string	"check data fail at %d Hz\n"
-	.section	.rodata.str1.1,"aMS",@progbits,1
-.LC29:
-	.string	"ddr_test"
-.LC30:
-	.string	"for dram simple test\n"
-.LC31:
-	.ascii	"arg1: test pattern include:\n\tchangefreq\n\tscanfreq\n\tran"
-	.ascii	"dom\n\tcrosstalk\n\tdiagonalscan\n\tfast_test\n\tfull_test\n"
-	.ascii	"for changereq: arg2:freq(Hz),arg3[option]:volt\nfor scanfreq"
-	.ascii	": arg2:minfreq(Hz),arg3:maxfreq(Hz),\n\targ4:scanfreq times,"
-	.ascii	" arg5[option]:volt\nfor random, crosstalk and diagonalscan:a"
-	.ascii	"rg2:freq(Hz), arg3:test times,\n\targ4: start addr, arg5:len"
-	.ascii	"gth, arg6[option]:volt\nfor fast_test and full_test:arg2: mi"
-	.ascii	"n_freq(Hz), arg3: max_freq(Hz)\n\targ4: test times, arg5[opt"
-	.ascii	"ion]:volt\n\nfreq: means dram's target frequency,unit:Hz, if"
-	.ascii	" 0:keep current freq\nminfreq, maxfreq: means min and max fr"
-	.ascii	"equency for dram test,unit:Hz\ntest times: test loop, if 0: "
-	.ascii	"endless loop\nstart_adr: start address of memory space for t"
-	.ascii	"esting,unit:physical address\nlength: length of memory space"
-	.ascii	" for testing,unit:Byte, if 0: full memory space test\nvolt: "
-	.ascii	"means target voltage of vdd_logic\n\nexample:\nddr freq chan"
-	.ascii	"ge to:786MHz, vdd_logic:1.05v:\n\t 'ddr_test changefreq 7860"
-	.ascii	"00000 1050000'\nddr freq change to:786MHz, with default vdd_"
-	.ascii	"logic:\n\t 'ddr_test changefreq 786000000'\nscanning ddr fre"
-	.ascii	"quency between 200 and 786MHz for 10 times:\n\t 'ddr_test sc"
-	.ascii	"anfreq 200000000 786000000 100'\ndoing random test 10 times "
-	.ascii	"start from"
-	.string	" physical address 0x200000 and\nlength is 128MB, freq:786MHz, if freq=0 may keep current freq:\n\t 'ddr_test random 786000000 10 0x200000 0x8000000'\ndoing fast test for dram between 200MHz to 786MHz with 10 times:\n\t 'ddr_test fast_test 200000000 786000000 10'"
-.LC32:
-	.string	"changefreq"
-.LC33:
-	.string	"scanfreq"
-.LC34:
-	.string	"random"
-.LC35:
-	.string	"crosstalk"
-.LC36:
-	.string	"diagonalscan"
-.LC37:
-	.string	"fast_test"
-.LC38:
-	.string	"full_test"
-	.section	.rodata.test_pat_param,"a",@progbits
-	.align	3
-	.set	.LANCHOR3,. + 0
-	.type	test_pat_param, %object
-	.size	test_pat_param, 7
-test_pat_param:
-	.byte	3
-	.byte	5
-	.byte	6
-	.byte	6
-	.byte	6
-	.byte	5
-	.byte	5
-	.section	.rodata.test_pattern,"a",@progbits
-	.align	3
-	.set	.LANCHOR2,. + 0
-	.type	test_pattern, %object
-	.size	test_pattern, 56
-test_pattern:
-	.xword	.LC32
-	.xword	.LC33
-	.xword	.LC34
-	.xword	.LC35
-	.xword	.LC36
-	.xword	.LC37
-	.xword	.LC38
-	.section	.u_boot_list_2_cmd_2_ddr_test,"aw",@progbits
-	.align	2
-	.type	_u_boot_list_2_cmd_2_ddr_test, %object
-	.size	_u_boot_list_2_cmd_2_ddr_test, 48
-_u_boot_list_2_cmd_2_ddr_test:
-	.8byte	.LC29
-	.word	7
-	.word	1
-	.8byte	do_ddr_test
-	.8byte	.LC30
-	.8byte	.LC31
-	.8byte	0
-	.text
-.Letext0:
-	.file 5 "include/common.h"
-	.file 6 "./arch/arm/include/asm/types.h"
-	.file 7 "include/linux/types.h"
-	.file 8 "include/errno.h"
-	.file 9 "include/linux/string.h"
-	.file 10 "include/efi.h"
-	.file 11 "include/dm/device.h"
-	.file 12 "include/ide.h"
-	.file 13 "include/linux/list.h"
-	.file 14 "include/part.h"
-	.file 15 "include/flash.h"
-	.file 16 "include/lmb.h"
-	.file 17 "include/asm-generic/u-boot.h"
-	.file 18 "./arch/arm/include/asm/u-boot-arm.h"
-	.file 19 "include/command.h"
-	.file 20 "include/linux/libfdt_env.h"
-	.file 21 "include/linux/../../scripts/dtc/libfdt/fdt.h"
-	.file 22 "include/linux/libfdt.h"
-	.file 23 "include/image.h"
-	.file 24 "include/dm/uclass-id.h"
-	.file 25 "./arch/arm/include/asm/global_data.h"
-	.file 26 "include/asm-generic/global_data.h"
-	.file 27 "include/dm/of.h"
-	.file 28 "include/net.h"
-	.file 29 "include/malloc.h"
-	.file 30 "include/dm/ofnode.h"
-	.file 31 "include/linux/compat.h"
-	.file 32 "include/dm/uclass.h"
-	.file 33 "include/console.h"
-	.file 34 "include/stdio_dev.h"
-	.file 35 "include/iomux.h"
-	.file 36 "include/log.h"
-	.file 37 "include/stdio.h"
-	.file 38 "./arch/arm/include/asm/arch/sdram.h"
-	.file 39 "cmd/ddr_tool/../memtester/io_map.h"
-	.file 40 "cmd/ddr_tool/../memtester/ddr_tester_common.h"
-	.file 41 "include/vsprintf.h"
-	.section	.debug_info,"",@progbits
-.Ldebug_info0:
-	.4byte	0x27ad
-	.2byte	0x4
-	.4byte	.Ldebug_abbrev0
-	.byte	0x8
-	.uleb128 0x1
-	.4byte	.LASF478
-	.byte	0xc
-	.4byte	.LASF479
-	.4byte	.LASF480
-	.4byte	.Ldebug_ranges0+0x90
-	.8byte	0
-	.4byte	.Ldebug_line0
-	.uleb128 0x2
-	.4byte	.LASF4
-	.byte	0x5
-	.byte	0xd
-	.4byte	0x34
-	.uleb128 0x3
-	.byte	0x1
-	.byte	0x8
-	.4byte	.LASF0
-	.uleb128 0x3
-	.byte	0x8
-	.byte	0x7
-	.4byte	.LASF1
-	.uleb128 0x4
-	.4byte	0x3b
-	.uleb128 0x3
-	.byte	0x2
-	.byte	0x7
-	.4byte	.LASF2
-	.uleb128 0x5
-	.4byte	.LASF21
-	.byte	0x8
-	.byte	0xc
-	.4byte	0x59
-	.uleb128 0x6
-	.byte	0x4
-	.byte	0x5
-	.string	"int"
-	.uleb128 0x3
-	.byte	0x1
-	.byte	0x6
-	.4byte	.LASF3
-	.uleb128 0x2
-	.4byte	.LASF5
-	.byte	0x6
-	.byte	0xc
-	.4byte	0x34
-	.uleb128 0x3
-	.byte	0x2
-	.byte	0x5
-	.4byte	.LASF6
-	.uleb128 0x2
-	.4byte	.LASF7
-	.byte	0x6
-	.byte	0x12
-	.4byte	0x84
-	.uleb128 0x3
-	.byte	0x4
-	.byte	0x7
-	.4byte	.LASF8
-	.uleb128 0x3
-	.byte	0x8
-	.byte	0x5
-	.4byte	.LASF9
-	.uleb128 0x3
-	.byte	0x8
-	.byte	0x7
-	.4byte	.LASF10
-	.uleb128 0x7
-	.string	"u8"
-	.byte	0x6
-	.byte	0x1f
-	.4byte	0x34
-	.uleb128 0x8
-	.4byte	0x99
-	.uleb128 0x7
-	.string	"u32"
-	.byte	0x6
-	.byte	0x25
-	.4byte	0x84
-	.uleb128 0x4
-	.4byte	0xa8
-	.uleb128 0x2
-	.4byte	.LASF11
-	.byte	0x6
-	.byte	0x31
-	.4byte	0x92
-	.uleb128 0x2
-	.4byte	.LASF12
-	.byte	0x6
-	.byte	0x32
-	.4byte	0x92
-	.uleb128 0x3
-	.byte	0x8
-	.byte	0x7
-	.4byte	.LASF13
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xe7
-	.uleb128 0x8
-	.4byte	0xd5
-	.uleb128 0x3
-	.byte	0x1
-	.byte	0x8
-	.4byte	.LASF14
-	.uleb128 0x8
-	.4byte	0xe0
-	.uleb128 0x3
-	.byte	0x8
-	.byte	0x5
-	.4byte	.LASF15
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xe0
-	.uleb128 0x8
-	.4byte	0xf3
-	.uleb128 0x2
-	.4byte	.LASF16
-	.byte	0x7
-	.byte	0x59
-	.4byte	0x47
-	.uleb128 0x2
-	.4byte	.LASF17
-	.byte	0x7
-	.byte	0x5b
-	.4byte	0x3b
-	.uleb128 0x2
-	.4byte	.LASF18
-	.byte	0x7
-	.byte	0x69
-	.4byte	0x67
-	.uleb128 0x2
-	.4byte	.LASF19
-	.byte	0x7
-	.byte	0x6b
-	.4byte	0x79
-	.uleb128 0x2
-	.4byte	.LASF20
-	.byte	0x7
-	.byte	0x97
-	.4byte	0x79
-	.uleb128 0xa
-	.byte	0x8
-	.uleb128 0x5
-	.4byte	.LASF22
-	.byte	0x9
-	.byte	0xb
-	.4byte	0xf3
-	.uleb128 0x3
-	.byte	0x1
-	.byte	0x2
-	.4byte	.LASF23
-	.uleb128 0xb
-	.4byte	0xe0
-	.4byte	0x154
-	.uleb128 0xc
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF24
-	.byte	0xa
-	.2byte	0x140
-	.4byte	0x149
-	.uleb128 0xd
-	.4byte	.LASF25
-	.byte	0xa
-	.2byte	0x143
-	.4byte	0x149
-	.uleb128 0xd
-	.4byte	.LASF26
-	.byte	0xa
-	.2byte	0x143
-	.4byte	0x149
-	.uleb128 0xe
-	.4byte	.LASF45
-	.byte	0xa0
-	.byte	0xb
-	.byte	0x80
-	.4byte	0x25d
-	.uleb128 0xf
-	.4byte	.LASF27
-	.byte	0xb
-	.byte	0x81
-	.4byte	0x1517
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0xb
-	.byte	0x82
-	.4byte	0xd5
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF29
-	.byte	0xb
-	.byte	0x83
-	.4byte	0x135
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF30
-	.byte	0xb
-	.byte	0x84
-	.4byte	0x135
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF31
-	.byte	0xb
-	.byte	0x85
-	.4byte	0x135
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF32
-	.byte	0xb
-	.byte	0x86
-	.4byte	0x14e2
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF33
-	.byte	0xb
-	.byte	0x87
-	.4byte	0x109
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF34
-	.byte	0xb
-	.byte	0x88
-	.4byte	0x25d
-	.byte	0x38
-	.uleb128 0xf
-	.4byte	.LASF35
-	.byte	0xb
-	.byte	0x89
-	.4byte	0x135
-	.byte	0x40
-	.uleb128 0xf
-	.4byte	.LASF36
-	.byte	0xb
-	.byte	0x8a
-	.4byte	0x155a
-	.byte	0x48
-	.uleb128 0xf
-	.4byte	.LASF37
-	.byte	0xb
-	.byte	0x8b
-	.4byte	0x135
-	.byte	0x50
-	.uleb128 0xf
-	.4byte	.LASF38
-	.byte	0xb
-	.byte	0x8c
-	.4byte	0x135
-	.byte	0x58
-	.uleb128 0xf
-	.4byte	.LASF39
-	.byte	0xb
-	.byte	0x8d
-	.4byte	0x290
-	.byte	0x60
-	.uleb128 0xf
-	.4byte	.LASF40
-	.byte	0xb
-	.byte	0x8e
-	.4byte	0x290
-	.byte	0x70
-	.uleb128 0xf
-	.4byte	.LASF41
-	.byte	0xb
-	.byte	0x8f
-	.4byte	0x290
-	.byte	0x80
-	.uleb128 0xf
-	.4byte	.LASF42
-	.byte	0xb
-	.byte	0x90
-	.4byte	0x11f
-	.byte	0x90
-	.uleb128 0xf
-	.4byte	.LASF43
-	.byte	0xb
-	.byte	0x91
-	.4byte	0x59
-	.byte	0x94
-	.uleb128 0x10
-	.string	"seq"
-	.byte	0xb
-	.byte	0x92
-	.4byte	0x59
-	.byte	0x98
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x178
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x269
-	.uleb128 0x11
-	.uleb128 0xb
-	.4byte	0x109
-	.4byte	0x275
-	.uleb128 0xc
-	.byte	0
-	.uleb128 0x5
-	.4byte	.LASF44
-	.byte	0xc
-	.byte	0x10
-	.4byte	0x26a
-	.uleb128 0xb
-	.4byte	0x34
-	.4byte	0x290
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x5
-	.byte	0
-	.uleb128 0xe
-	.4byte	.LASF46
-	.byte	0x10
-	.byte	0xd
-	.byte	0x16
-	.4byte	0x2b5
-	.uleb128 0xf
-	.4byte	.LASF47
-	.byte	0xd
-	.byte	0x17
-	.4byte	0x2b5
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF48
-	.byte	0xd
-	.byte	0x17
-	.4byte	0x2b5
-	.byte	0x8
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x290
-	.uleb128 0xe
-	.4byte	.LASF49
-	.byte	0x10
-	.byte	0xe
-	.byte	0xf
-	.4byte	0x2e0
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0xe
-	.byte	0x10
-	.4byte	0xf3
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF50
-	.byte	0xe
-	.byte	0x11
-	.4byte	0x2f9
-	.byte	0x8
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x2bb
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x2f9
-	.uleb128 0x14
-	.4byte	0x59
-	.uleb128 0x14
-	.4byte	0x59
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x2e5
-	.uleb128 0xb
-	.4byte	0x2e0
-	.4byte	0x30a
-	.uleb128 0xc
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x2ff
-	.uleb128 0x5
-	.4byte	.LASF49
-	.byte	0xe
-	.byte	0xce
-	.4byte	0x30a
-	.uleb128 0x15
-	.2byte	0x1218
-	.byte	0xf
-	.byte	0x13
-	.4byte	0x361
-	.uleb128 0xf
-	.4byte	.LASF51
-	.byte	0xf
-	.byte	0x14
-	.4byte	0x109
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF52
-	.byte	0xf
-	.byte	0x15
-	.4byte	0xfe
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF53
-	.byte	0xf
-	.byte	0x16
-	.4byte	0x109
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF54
-	.byte	0xf
-	.byte	0x17
-	.4byte	0x361
-	.byte	0x18
-	.uleb128 0x16
-	.4byte	.LASF55
-	.byte	0xf
-	.byte	0x18
-	.4byte	0x372
-	.2byte	0x1018
-	.byte	0
-	.uleb128 0xb
-	.4byte	0x109
-	.4byte	0x372
-	.uleb128 0x17
-	.4byte	0xce
-	.2byte	0x1ff
-	.byte	0
-	.uleb128 0xb
-	.4byte	0x29
-	.4byte	0x383
-	.uleb128 0x17
-	.4byte	0xce
-	.2byte	0x1ff
-	.byte	0
-	.uleb128 0x2
-	.4byte	.LASF56
-	.byte	0xf
-	.byte	0x32
-	.4byte	0x31a
-	.uleb128 0xb
-	.4byte	0x383
-	.4byte	0x399
-	.uleb128 0xc
-	.byte	0
-	.uleb128 0x5
-	.4byte	.LASF57
-	.byte	0xf
-	.byte	0x34
-	.4byte	0x38e
-	.uleb128 0x3
-	.byte	0x10
-	.byte	0x4
-	.4byte	.LASF58
-	.uleb128 0xe
-	.4byte	.LASF59
-	.byte	0x10
-	.byte	0x10
-	.byte	0x10
-	.4byte	0x3d0
-	.uleb128 0xf
-	.4byte	.LASF60
-	.byte	0x10
-	.byte	0x11
-	.4byte	0xb8
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF51
-	.byte	0x10
-	.byte	0x12
-	.4byte	0xc3
-	.byte	0x8
-	.byte	0
-	.uleb128 0xe
-	.4byte	.LASF61
-	.byte	0xa0
-	.byte	0x10
-	.byte	0x15
-	.4byte	0x401
-	.uleb128 0x10
-	.string	"cnt"
-	.byte	0x10
-	.byte	0x16
-	.4byte	0x3b
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF51
-	.byte	0x10
-	.byte	0x17
-	.4byte	0xc3
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF62
-	.byte	0x10
-	.byte	0x18
-	.4byte	0x401
-	.byte	0x10
-	.byte	0
-	.uleb128 0xb
-	.4byte	0x3ab
-	.4byte	0x411
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x8
-	.byte	0
-	.uleb128 0x18
-	.string	"lmb"
-	.2byte	0x140
-	.byte	0x10
-	.byte	0x1b
-	.4byte	0x437
-	.uleb128 0xf
-	.4byte	.LASF63
-	.byte	0x10
-	.byte	0x1c
-	.4byte	0x3d0
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF64
-	.byte	0x10
-	.byte	0x1d
-	.4byte	0x3d0
-	.byte	0xa0
-	.byte	0
-	.uleb128 0x19
-	.string	"lmb"
-	.byte	0x10
-	.byte	0x20
-	.4byte	0x411
-	.uleb128 0x1a
-	.byte	0x10
-	.byte	0x11
-	.byte	0x5a
-	.4byte	0x463
-	.uleb128 0xf
-	.4byte	.LASF54
-	.byte	0x11
-	.byte	0x5b
-	.4byte	0xb8
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF51
-	.byte	0x11
-	.byte	0x5c
-	.4byte	0xc3
-	.byte	0x8
-	.byte	0
-	.uleb128 0xe
-	.4byte	.LASF65
-	.byte	0xc8
-	.byte	0x11
-	.byte	0x1b
-	.4byte	0x554
-	.uleb128 0xf
-	.4byte	.LASF66
-	.byte	0x11
-	.byte	0x1c
-	.4byte	0x3b
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF67
-	.byte	0x11
-	.byte	0x1d
-	.4byte	0xc3
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF68
-	.byte	0x11
-	.byte	0x1e
-	.4byte	0x3b
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF69
-	.byte	0x11
-	.byte	0x1f
-	.4byte	0x3b
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF70
-	.byte	0x11
-	.byte	0x20
-	.4byte	0x3b
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF71
-	.byte	0x11
-	.byte	0x21
-	.4byte	0x3b
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF72
-	.byte	0x11
-	.byte	0x22
-	.4byte	0x3b
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF73
-	.byte	0x11
-	.byte	0x24
-	.4byte	0x3b
-	.byte	0x38
-	.uleb128 0xf
-	.4byte	.LASF74
-	.byte	0x11
-	.byte	0x25
-	.4byte	0x3b
-	.byte	0x40
-	.uleb128 0xf
-	.4byte	.LASF75
-	.byte	0x11
-	.byte	0x26
-	.4byte	0x3b
-	.byte	0x48
-	.uleb128 0xf
-	.4byte	.LASF76
-	.byte	0x11
-	.byte	0x31
-	.4byte	0x3b
-	.byte	0x50
-	.uleb128 0xf
-	.4byte	.LASF77
-	.byte	0x11
-	.byte	0x32
-	.4byte	0x3b
-	.byte	0x58
-	.uleb128 0xf
-	.4byte	.LASF78
-	.byte	0x11
-	.byte	0x33
-	.4byte	0x280
-	.byte	0x60
-	.uleb128 0xf
-	.4byte	.LASF79
-	.byte	0x11
-	.byte	0x34
-	.4byte	0x47
-	.byte	0x66
-	.uleb128 0xf
-	.4byte	.LASF80
-	.byte	0x11
-	.byte	0x35
-	.4byte	0x3b
-	.byte	0x68
-	.uleb128 0xf
-	.4byte	.LASF81
-	.byte	0x11
-	.byte	0x36
-	.4byte	0x3b
-	.byte	0x70
-	.uleb128 0xf
-	.4byte	.LASF82
-	.byte	0x11
-	.byte	0x57
-	.4byte	0x109
-	.byte	0x78
-	.uleb128 0xf
-	.4byte	.LASF83
-	.byte	0x11
-	.byte	0x58
-	.4byte	0x109
-	.byte	0x80
-	.uleb128 0xf
-	.4byte	.LASF84
-	.byte	0x11
-	.byte	0x5d
-	.4byte	0x554
-	.byte	0x88
-	.byte	0
-	.uleb128 0xb
-	.4byte	0x442
-	.4byte	0x564
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x3
-	.byte	0
-	.uleb128 0x2
-	.4byte	.LASF85
-	.byte	0x11
-	.byte	0x5f
-	.4byte	0x463
-	.uleb128 0x5
-	.4byte	.LASF86
-	.byte	0x12
-	.byte	0x13
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF87
-	.byte	0x12
-	.byte	0x14
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF88
-	.byte	0x12
-	.byte	0x15
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF89
-	.byte	0x12
-	.byte	0x16
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF90
-	.byte	0x12
-	.byte	0x17
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF91
-	.byte	0x12
-	.byte	0x18
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF92
-	.byte	0x12
-	.byte	0x19
-	.4byte	0x109
-	.uleb128 0xe
-	.4byte	.LASF93
-	.byte	0x30
-	.byte	0x13
-	.byte	0x1e
-	.4byte	0x61d
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0x13
-	.byte	0x1f
-	.4byte	0xf3
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF94
-	.byte	0x13
-	.byte	0x20
-	.4byte	0x59
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF95
-	.byte	0x13
-	.byte	0x21
-	.4byte	0x59
-	.byte	0xc
-	.uleb128 0x10
-	.string	"cmd"
-	.byte	0x13
-	.byte	0x23
-	.4byte	0x647
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF96
-	.byte	0x13
-	.byte	0x24
-	.4byte	0xf3
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF97
-	.byte	0x13
-	.byte	0x26
-	.4byte	0xf3
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF98
-	.byte	0x13
-	.byte	0x2a
-	.4byte	0x676
-	.byte	0x28
-	.byte	0
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x63b
-	.uleb128 0x14
-	.4byte	0x63b
-	.uleb128 0x14
-	.4byte	0x59
-	.uleb128 0x14
-	.4byte	0x59
-	.uleb128 0x14
-	.4byte	0x641
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x5bc
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xf9
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x61d
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x670
-	.uleb128 0x14
-	.4byte	0x59
-	.uleb128 0x14
-	.4byte	0x641
-	.uleb128 0x14
-	.4byte	0xe0
-	.uleb128 0x14
-	.4byte	0x59
-	.uleb128 0x14
-	.4byte	0x670
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xf3
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x64d
-	.uleb128 0x2
-	.4byte	.LASF99
-	.byte	0x13
-	.byte	0x2e
-	.4byte	0x5bc
-	.uleb128 0x1b
-	.4byte	.LASF167
-	.byte	0x4
-	.4byte	0x59
-	.byte	0x13
-	.byte	0x7a
-	.4byte	0x6aa
-	.uleb128 0x1c
-	.4byte	.LASF100
-	.byte	0
-	.uleb128 0x1c
-	.4byte	.LASF101
-	.byte	0x1
-	.uleb128 0x1d
-	.4byte	.LASF102
-	.sleb128 -1
-	.byte	0
-	.uleb128 0x2
-	.4byte	.LASF103
-	.byte	0x14
-	.byte	0x11
-	.4byte	0x12a
-	.uleb128 0xe
-	.4byte	.LASF104
-	.byte	0x28
-	.byte	0x15
-	.byte	0x39
-	.4byte	0x73a
-	.uleb128 0xf
-	.4byte	.LASF105
-	.byte	0x15
-	.byte	0x3a
-	.4byte	0x6aa
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF106
-	.byte	0x15
-	.byte	0x3b
-	.4byte	0x6aa
-	.byte	0x4
-	.uleb128 0xf
-	.4byte	.LASF107
-	.byte	0x15
-	.byte	0x3c
-	.4byte	0x6aa
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF108
-	.byte	0x15
-	.byte	0x3d
-	.4byte	0x6aa
-	.byte	0xc
-	.uleb128 0xf
-	.4byte	.LASF109
-	.byte	0x15
-	.byte	0x3e
-	.4byte	0x6aa
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF110
-	.byte	0x15
-	.byte	0x3f
-	.4byte	0x6aa
-	.byte	0x14
-	.uleb128 0xf
-	.4byte	.LASF111
-	.byte	0x15
-	.byte	0x40
-	.4byte	0x6aa
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF112
-	.byte	0x15
-	.byte	0x43
-	.4byte	0x6aa
-	.byte	0x1c
-	.uleb128 0xf
-	.4byte	.LASF113
-	.byte	0x15
-	.byte	0x46
-	.4byte	0x6aa
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF114
-	.byte	0x15
-	.byte	0x49
-	.4byte	0x6aa
-	.byte	0x24
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF115
-	.byte	0x16
-	.2byte	0x136
-	.4byte	0x746
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x6b5
-	.uleb128 0x1e
-	.4byte	.LASF116
-	.byte	0x40
-	.byte	0x17
-	.2byte	0x134
-	.4byte	0x7f6
-	.uleb128 0x1f
-	.4byte	.LASF117
-	.byte	0x17
-	.2byte	0x135
-	.4byte	0x12a
-	.byte	0
-	.uleb128 0x1f
-	.4byte	.LASF118
-	.byte	0x17
-	.2byte	0x136
-	.4byte	0x12a
-	.byte	0x4
-	.uleb128 0x1f
-	.4byte	.LASF119
-	.byte	0x17
-	.2byte	0x137
-	.4byte	0x12a
-	.byte	0x8
-	.uleb128 0x1f
-	.4byte	.LASF120
-	.byte	0x17
-	.2byte	0x138
-	.4byte	0x12a
-	.byte	0xc
-	.uleb128 0x1f
-	.4byte	.LASF121
-	.byte	0x17
-	.2byte	0x139
-	.4byte	0x12a
-	.byte	0x10
-	.uleb128 0x1f
-	.4byte	.LASF122
-	.byte	0x17
-	.2byte	0x13a
-	.4byte	0x12a
-	.byte	0x14
-	.uleb128 0x1f
-	.4byte	.LASF123
-	.byte	0x17
-	.2byte	0x13b
-	.4byte	0x12a
-	.byte	0x18
-	.uleb128 0x1f
-	.4byte	.LASF124
-	.byte	0x17
-	.2byte	0x13c
-	.4byte	0x114
-	.byte	0x1c
-	.uleb128 0x1f
-	.4byte	.LASF125
-	.byte	0x17
-	.2byte	0x13d
-	.4byte	0x114
-	.byte	0x1d
-	.uleb128 0x1f
-	.4byte	.LASF126
-	.byte	0x17
-	.2byte	0x13e
-	.4byte	0x114
-	.byte	0x1e
-	.uleb128 0x1f
-	.4byte	.LASF127
-	.byte	0x17
-	.2byte	0x13f
-	.4byte	0x114
-	.byte	0x1f
-	.uleb128 0x1f
-	.4byte	.LASF128
-	.byte	0x17
-	.2byte	0x140
-	.4byte	0x7f6
-	.byte	0x20
-	.byte	0
-	.uleb128 0xb
-	.4byte	0x114
-	.4byte	0x806
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x1f
-	.byte	0
-	.uleb128 0x20
-	.4byte	.LASF129
-	.byte	0x17
-	.2byte	0x141
-	.4byte	0x74c
-	.uleb128 0x1e
-	.4byte	.LASF130
-	.byte	0x30
-	.byte	0x17
-	.2byte	0x143
-	.4byte	0x894
-	.uleb128 0x1f
-	.4byte	.LASF54
-	.byte	0x17
-	.2byte	0x144
-	.4byte	0x109
-	.byte	0
-	.uleb128 0x21
-	.string	"end"
-	.byte	0x17
-	.2byte	0x144
-	.4byte	0x109
-	.byte	0x8
-	.uleb128 0x1f
-	.4byte	.LASF131
-	.byte	0x17
-	.2byte	0x145
-	.4byte	0x109
-	.byte	0x10
-	.uleb128 0x1f
-	.4byte	.LASF132
-	.byte	0x17
-	.2byte	0x145
-	.4byte	0x109
-	.byte	0x18
-	.uleb128 0x1f
-	.4byte	.LASF133
-	.byte	0x17
-	.2byte	0x146
-	.4byte	0x109
-	.byte	0x20
-	.uleb128 0x1f
-	.4byte	.LASF134
-	.byte	0x17
-	.2byte	0x147
-	.4byte	0x114
-	.byte	0x28
-	.uleb128 0x1f
-	.4byte	.LASF135
-	.byte	0x17
-	.2byte	0x147
-	.4byte	0x114
-	.byte	0x29
-	.uleb128 0x21
-	.string	"os"
-	.byte	0x17
-	.2byte	0x147
-	.4byte	0x114
-	.byte	0x2a
-	.uleb128 0x1f
-	.4byte	.LASF136
-	.byte	0x17
-	.2byte	0x148
-	.4byte	0x114
-	.byte	0x2b
-	.byte	0
-	.uleb128 0x20
-	.4byte	.LASF137
-	.byte	0x17
-	.2byte	0x149
-	.4byte	0x812
-	.uleb128 0x22
-	.4byte	.LASF138
-	.2byte	0x280
-	.byte	0x17
-	.2byte	0x14f
-	.4byte	0xa3d
-	.uleb128 0x1f
-	.4byte	.LASF139
-	.byte	0x17
-	.2byte	0x155
-	.4byte	0xa3d
-	.byte	0
-	.uleb128 0x1f
-	.4byte	.LASF140
-	.byte	0x17
-	.2byte	0x156
-	.4byte	0x806
-	.byte	0x8
-	.uleb128 0x1f
-	.4byte	.LASF141
-	.byte	0x17
-	.2byte	0x157
-	.4byte	0x109
-	.byte	0x48
-	.uleb128 0x1f
-	.4byte	.LASF142
-	.byte	0x17
-	.2byte	0x15a
-	.4byte	0xd5
-	.byte	0x50
-	.uleb128 0x1f
-	.4byte	.LASF143
-	.byte	0x17
-	.2byte	0x15c
-	.4byte	0x135
-	.byte	0x58
-	.uleb128 0x1f
-	.4byte	.LASF144
-	.byte	0x17
-	.2byte	0x15d
-	.4byte	0xd5
-	.byte	0x60
-	.uleb128 0x1f
-	.4byte	.LASF145
-	.byte	0x17
-	.2byte	0x15e
-	.4byte	0x59
-	.byte	0x68
-	.uleb128 0x1f
-	.4byte	.LASF146
-	.byte	0x17
-	.2byte	0x160
-	.4byte	0x135
-	.byte	0x70
-	.uleb128 0x1f
-	.4byte	.LASF147
-	.byte	0x17
-	.2byte	0x161
-	.4byte	0xd5
-	.byte	0x78
-	.uleb128 0x1f
-	.4byte	.LASF148
-	.byte	0x17
-	.2byte	0x162
-	.4byte	0x59
-	.byte	0x80
-	.uleb128 0x1f
-	.4byte	.LASF149
-	.byte	0x17
-	.2byte	0x164
-	.4byte	0x135
-	.byte	0x88
-	.uleb128 0x1f
-	.4byte	.LASF150
-	.byte	0x17
-	.2byte	0x165
-	.4byte	0xd5
-	.byte	0x90
-	.uleb128 0x1f
-	.4byte	.LASF151
-	.byte	0x17
-	.2byte	0x166
-	.4byte	0x59
-	.byte	0x98
-	.uleb128 0x1f
-	.4byte	.LASF152
-	.byte	0x17
-	.2byte	0x168
-	.4byte	0x135
-	.byte	0xa0
-	.uleb128 0x1f
-	.4byte	.LASF153
-	.byte	0x17
-	.2byte	0x169
-	.4byte	0xd5
-	.byte	0xa8
-	.uleb128 0x1f
-	.4byte	.LASF154
-	.byte	0x17
-	.2byte	0x16a
-	.4byte	0x59
-	.byte	0xb0
-	.uleb128 0x21
-	.string	"os"
-	.byte	0x17
-	.2byte	0x16e
-	.4byte	0x894
-	.byte	0xb8
-	.uleb128 0x21
-	.string	"ep"
-	.byte	0x17
-	.2byte	0x16f
-	.4byte	0x109
-	.byte	0xe8
-	.uleb128 0x1f
-	.4byte	.LASF155
-	.byte	0x17
-	.2byte	0x171
-	.4byte	0x109
-	.byte	0xf0
-	.uleb128 0x1f
-	.4byte	.LASF156
-	.byte	0x17
-	.2byte	0x171
-	.4byte	0x109
-	.byte	0xf8
-	.uleb128 0x23
-	.4byte	.LASF157
-	.byte	0x17
-	.2byte	0x173
-	.4byte	0xf3
-	.2byte	0x100
-	.uleb128 0x23
-	.4byte	.LASF158
-	.byte	0x17
-	.2byte	0x174
-	.4byte	0x109
-	.2byte	0x108
-	.uleb128 0x23
-	.4byte	.LASF159
-	.byte	0x17
-	.2byte	0x176
-	.4byte	0x109
-	.2byte	0x110
-	.uleb128 0x23
-	.4byte	.LASF160
-	.byte	0x17
-	.2byte	0x177
-	.4byte	0x109
-	.2byte	0x118
-	.uleb128 0x23
-	.4byte	.LASF161
-	.byte	0x17
-	.2byte	0x178
-	.4byte	0x109
-	.2byte	0x120
-	.uleb128 0x23
-	.4byte	.LASF162
-	.byte	0x17
-	.2byte	0x179
-	.4byte	0x109
-	.2byte	0x128
-	.uleb128 0x24
-	.string	"kbd"
-	.byte	0x17
-	.2byte	0x17a
-	.4byte	0xa43
-	.2byte	0x130
-	.uleb128 0x23
-	.4byte	.LASF163
-	.byte	0x17
-	.2byte	0x17d
-	.4byte	0x59
-	.2byte	0x138
-	.uleb128 0x23
-	.4byte	.LASF164
-	.byte	0x17
-	.2byte	0x18a
-	.4byte	0x59
-	.2byte	0x13c
-	.uleb128 0x24
-	.string	"lmb"
-	.byte	0x17
-	.2byte	0x18d
-	.4byte	0x411
-	.2byte	0x140
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x806
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x564
-	.uleb128 0x20
-	.4byte	.LASF165
-	.byte	0x17
-	.2byte	0x18f
-	.4byte	0x8a0
-	.uleb128 0xd
-	.4byte	.LASF166
-	.byte	0x17
-	.2byte	0x191
-	.4byte	0xa49
-	.uleb128 0x1b
-	.4byte	.LASF168
-	.byte	0x4
-	.4byte	0x59
-	.byte	0x18
-	.byte	0xe
-	.4byte	0xc7c
-	.uleb128 0x1c
-	.4byte	.LASF169
-	.byte	0
-	.uleb128 0x1c
-	.4byte	.LASF170
-	.byte	0x1
-	.uleb128 0x1c
-	.4byte	.LASF171
-	.byte	0x2
-	.uleb128 0x1c
-	.4byte	.LASF172
-	.byte	0x3
-	.uleb128 0x1c
-	.4byte	.LASF173
-	.byte	0x4
-	.uleb128 0x1c
-	.4byte	.LASF174
-	.byte	0x5
-	.uleb128 0x1c
-	.4byte	.LASF175
-	.byte	0x6
-	.uleb128 0x1c
-	.4byte	.LASF176
-	.byte	0x7
-	.uleb128 0x1c
-	.4byte	.LASF177
-	.byte	0x8
-	.uleb128 0x1c
-	.4byte	.LASF178
-	.byte	0x9
-	.uleb128 0x1c
-	.4byte	.LASF179
-	.byte	0xa
-	.uleb128 0x1c
-	.4byte	.LASF180
-	.byte	0xb
-	.uleb128 0x1c
-	.4byte	.LASF181
-	.byte	0xc
-	.uleb128 0x1c
-	.4byte	.LASF182
-	.byte	0xd
-	.uleb128 0x1c
-	.4byte	.LASF183
-	.byte	0xe
-	.uleb128 0x1c
-	.4byte	.LASF184
-	.byte	0xf
-	.uleb128 0x1c
-	.4byte	.LASF185
-	.byte	0x10
-	.uleb128 0x1c
-	.4byte	.LASF186
-	.byte	0x11
-	.uleb128 0x1c
-	.4byte	.LASF187
-	.byte	0x12
-	.uleb128 0x1c
-	.4byte	.LASF188
-	.byte	0x13
-	.uleb128 0x1c
-	.4byte	.LASF189
-	.byte	0x14
-	.uleb128 0x1c
-	.4byte	.LASF190
-	.byte	0x15
-	.uleb128 0x1c
-	.4byte	.LASF191
-	.byte	0x16
-	.uleb128 0x1c
-	.4byte	.LASF192
-	.byte	0x17
-	.uleb128 0x1c
-	.4byte	.LASF193
-	.byte	0x18
-	.uleb128 0x1c
-	.4byte	.LASF194
-	.byte	0x19
-	.uleb128 0x1c
-	.4byte	.LASF195
-	.byte	0x1a
-	.uleb128 0x1c
-	.4byte	.LASF196
-	.byte	0x1b
-	.uleb128 0x1c
-	.4byte	.LASF197
-	.byte	0x1c
-	.uleb128 0x1c
-	.4byte	.LASF198
-	.byte	0x1d
-	.uleb128 0x1c
-	.4byte	.LASF199
-	.byte	0x1e
-	.uleb128 0x1c
-	.4byte	.LASF200
-	.byte	0x1f
-	.uleb128 0x1c
-	.4byte	.LASF201
-	.byte	0x20
-	.uleb128 0x1c
-	.4byte	.LASF202
-	.byte	0x21
-	.uleb128 0x1c
-	.4byte	.LASF203
-	.byte	0x22
-	.uleb128 0x1c
-	.4byte	.LASF204
-	.byte	0x23
-	.uleb128 0x1c
-	.4byte	.LASF205
-	.byte	0x24
-	.uleb128 0x1c
-	.4byte	.LASF206
-	.byte	0x25
-	.uleb128 0x1c
-	.4byte	.LASF207
-	.byte	0x26
-	.uleb128 0x1c
-	.4byte	.LASF208
-	.byte	0x27
-	.uleb128 0x1c
-	.4byte	.LASF209
-	.byte	0x28
-	.uleb128 0x1c
-	.4byte	.LASF210
-	.byte	0x29
-	.uleb128 0x1c
-	.4byte	.LASF211
-	.byte	0x2a
-	.uleb128 0x1c
-	.4byte	.LASF212
-	.byte	0x2b
-	.uleb128 0x1c
-	.4byte	.LASF213
-	.byte	0x2c
-	.uleb128 0x1c
-	.4byte	.LASF214
-	.byte	0x2d
-	.uleb128 0x1c
-	.4byte	.LASF215
-	.byte	0x2e
-	.uleb128 0x1c
-	.4byte	.LASF216
-	.byte	0x2f
-	.uleb128 0x1c
-	.4byte	.LASF217
-	.byte	0x30
-	.uleb128 0x1c
-	.4byte	.LASF218
-	.byte	0x31
-	.uleb128 0x1c
-	.4byte	.LASF219
-	.byte	0x32
-	.uleb128 0x1c
-	.4byte	.LASF220
-	.byte	0x33
-	.uleb128 0x1c
-	.4byte	.LASF221
-	.byte	0x34
-	.uleb128 0x1c
-	.4byte	.LASF222
-	.byte	0x35
-	.uleb128 0x1c
-	.4byte	.LASF223
-	.byte	0x36
-	.uleb128 0x1c
-	.4byte	.LASF224
-	.byte	0x37
-	.uleb128 0x1c
-	.4byte	.LASF225
-	.byte	0x38
-	.uleb128 0x1c
-	.4byte	.LASF226
-	.byte	0x39
-	.uleb128 0x1c
-	.4byte	.LASF227
-	.byte	0x3a
-	.uleb128 0x1c
-	.4byte	.LASF228
-	.byte	0x3b
-	.uleb128 0x1c
-	.4byte	.LASF229
-	.byte	0x3c
-	.uleb128 0x1c
-	.4byte	.LASF230
-	.byte	0x3d
-	.uleb128 0x1c
-	.4byte	.LASF231
-	.byte	0x3e
-	.uleb128 0x1c
-	.4byte	.LASF232
-	.byte	0x3f
-	.uleb128 0x1c
-	.4byte	.LASF233
-	.byte	0x40
-	.uleb128 0x1c
-	.4byte	.LASF234
-	.byte	0x41
-	.uleb128 0x1c
-	.4byte	.LASF235
-	.byte	0x42
-	.uleb128 0x1c
-	.4byte	.LASF236
-	.byte	0x43
-	.uleb128 0x1c
-	.4byte	.LASF237
-	.byte	0x44
-	.uleb128 0x1c
-	.4byte	.LASF238
-	.byte	0x45
-	.uleb128 0x1c
-	.4byte	.LASF239
-	.byte	0x46
-	.uleb128 0x1c
-	.4byte	.LASF240
-	.byte	0x47
-	.uleb128 0x1c
-	.4byte	.LASF241
-	.byte	0x48
-	.uleb128 0x1c
-	.4byte	.LASF242
-	.byte	0x49
-	.uleb128 0x1c
-	.4byte	.LASF243
-	.byte	0x4a
-	.uleb128 0x1c
-	.4byte	.LASF244
-	.byte	0x4b
-	.uleb128 0x1c
-	.4byte	.LASF245
-	.byte	0x4c
-	.uleb128 0x1c
-	.4byte	.LASF246
-	.byte	0x4d
-	.uleb128 0x1c
-	.4byte	.LASF247
-	.byte	0x4e
-	.uleb128 0x1c
-	.4byte	.LASF248
-	.byte	0x4f
-	.uleb128 0x1c
-	.4byte	.LASF249
-	.byte	0x50
-	.uleb128 0x1c
-	.4byte	.LASF250
-	.byte	0x51
-	.uleb128 0x1c
-	.4byte	.LASF251
-	.byte	0x52
-	.uleb128 0x1c
-	.4byte	.LASF252
-	.byte	0x53
-	.uleb128 0x1c
-	.4byte	.LASF253
-	.byte	0x54
-	.uleb128 0x1c
-	.4byte	.LASF254
-	.byte	0x55
-	.uleb128 0x1d
-	.4byte	.LASF255
-	.sleb128 -1
-	.byte	0
-	.uleb128 0x25
-	.byte	0x4
-	.4byte	0x84
-	.byte	0x24
-	.byte	0xe0
-	.4byte	0xc8f
-	.uleb128 0x1c
-	.4byte	.LASF256
-	.byte	0x5
-	.byte	0
-	.uleb128 0xe
-	.4byte	.LASF257
-	.byte	0x40
-	.byte	0x19
-	.byte	0xc
-	.4byte	0xd08
-	.uleb128 0xf
-	.4byte	.LASF258
-	.byte	0x19
-	.byte	0x22
-	.4byte	0x3b
-	.byte	0
-	.uleb128 0x10
-	.string	"tbu"
-	.byte	0x19
-	.byte	0x23
-	.4byte	0x84
-	.byte	0x8
-	.uleb128 0x10
-	.string	"tbl"
-	.byte	0x19
-	.byte	0x24
-	.4byte	0x84
-	.byte	0xc
-	.uleb128 0xf
-	.4byte	.LASF259
-	.byte	0x19
-	.byte	0x25
-	.4byte	0x3b
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF260
-	.byte	0x19
-	.byte	0x26
-	.4byte	0x92
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF261
-	.byte	0x19
-	.byte	0x28
-	.4byte	0x3b
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF262
-	.byte	0x19
-	.byte	0x29
-	.4byte	0x3b
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF263
-	.byte	0x19
-	.byte	0x2b
-	.4byte	0x3b
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF264
-	.byte	0x19
-	.byte	0x2c
-	.4byte	0x3b
-	.byte	0x38
-	.byte	0
-	.uleb128 0xe
-	.4byte	.LASF265
-	.byte	0x18
-	.byte	0x1a
-	.byte	0x22
-	.4byte	0xd44
-	.uleb128 0xf
-	.4byte	.LASF266
-	.byte	0x1a
-	.byte	0x23
-	.4byte	0xa8
-	.byte	0
-	.uleb128 0x10
-	.string	"id"
-	.byte	0x1a
-	.byte	0x24
-	.4byte	0xa8
-	.byte	0x4
-	.uleb128 0xf
-	.4byte	.LASF267
-	.byte	0x1a
-	.byte	0x25
-	.4byte	0xa8
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF268
-	.byte	0x1a
-	.byte	0x26
-	.4byte	0x109
-	.byte	0x10
-	.byte	0
-	.uleb128 0x26
-	.4byte	.LASF269
-	.2byte	0x1a0
-	.byte	0x1a
-	.byte	0x29
-	.4byte	0xf3c
-	.uleb128 0x10
-	.string	"bd"
-	.byte	0x1a
-	.byte	0x2a
-	.4byte	0xa43
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF42
-	.byte	0x1a
-	.byte	0x2b
-	.4byte	0x3b
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF267
-	.byte	0x1a
-	.byte	0x2c
-	.4byte	0x84
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF270
-	.byte	0x1a
-	.byte	0x2d
-	.4byte	0x3b
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF271
-	.byte	0x1a
-	.byte	0x2e
-	.4byte	0x3b
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF272
-	.byte	0x1a
-	.byte	0x30
-	.4byte	0x3b
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF273
-	.byte	0x1a
-	.byte	0x31
-	.4byte	0x3b
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF274
-	.byte	0x1a
-	.byte	0x33
-	.4byte	0x3b
-	.byte	0x38
-	.uleb128 0xf
-	.4byte	.LASF275
-	.byte	0x1a
-	.byte	0x3d
-	.4byte	0x3b
-	.byte	0x40
-	.uleb128 0xf
-	.4byte	.LASF276
-	.byte	0x1a
-	.byte	0x41
-	.4byte	0x3b
-	.byte	0x48
-	.uleb128 0xf
-	.4byte	.LASF277
-	.byte	0x1a
-	.byte	0x42
-	.4byte	0x3b
-	.byte	0x50
-	.uleb128 0xf
-	.4byte	.LASF278
-	.byte	0x1a
-	.byte	0x44
-	.4byte	0x3b
-	.byte	0x58
-	.uleb128 0xf
-	.4byte	.LASF279
-	.byte	0x1a
-	.byte	0x45
-	.4byte	0x3b
-	.byte	0x60
-	.uleb128 0xf
-	.4byte	.LASF280
-	.byte	0x1a
-	.byte	0x46
-	.4byte	0xc3
-	.byte	0x68
-	.uleb128 0xf
-	.4byte	.LASF281
-	.byte	0x1a
-	.byte	0x47
-	.4byte	0x3b
-	.byte	0x70
-	.uleb128 0xf
-	.4byte	.LASF282
-	.byte	0x1a
-	.byte	0x48
-	.4byte	0x3b
-	.byte	0x78
-	.uleb128 0xf
-	.4byte	.LASF283
-	.byte	0x1a
-	.byte	0x49
-	.4byte	0x3b
-	.byte	0x80
-	.uleb128 0xf
-	.4byte	.LASF284
-	.byte	0x1a
-	.byte	0x4a
-	.4byte	0x3b
-	.byte	0x88
-	.uleb128 0xf
-	.4byte	.LASF285
-	.byte	0x1a
-	.byte	0x4b
-	.4byte	0xf3c
-	.byte	0x90
-	.uleb128 0xf
-	.4byte	.LASF286
-	.byte	0x1a
-	.byte	0x4e
-	.4byte	0x25d
-	.byte	0x98
-	.uleb128 0xf
-	.4byte	.LASF287
-	.byte	0x1a
-	.byte	0x4f
-	.4byte	0x25d
-	.byte	0xa0
-	.uleb128 0xf
-	.4byte	.LASF288
-	.byte	0x1a
-	.byte	0x50
-	.4byte	0x290
-	.byte	0xa8
-	.uleb128 0xf
-	.4byte	.LASF289
-	.byte	0x1a
-	.byte	0x56
-	.4byte	0x263
-	.byte	0xb8
-	.uleb128 0xf
-	.4byte	.LASF290
-	.byte	0x1a
-	.byte	0x57
-	.4byte	0x135
-	.byte	0xc0
-	.uleb128 0xf
-	.4byte	.LASF291
-	.byte	0x1a
-	.byte	0x58
-	.4byte	0x3b
-	.byte	0xc8
-	.uleb128 0xf
-	.4byte	.LASF292
-	.byte	0x1a
-	.byte	0x5a
-	.4byte	0xfb4
-	.byte	0xd0
-	.uleb128 0x10
-	.string	"jt"
-	.byte	0x1a
-	.byte	0x5c
-	.4byte	0xfbf
-	.byte	0xd8
-	.uleb128 0xf
-	.4byte	.LASF293
-	.byte	0x1a
-	.byte	0x5d
-	.4byte	0xfc5
-	.byte	0xe0
-	.uleb128 0x16
-	.4byte	.LASF294
-	.byte	0x1a
-	.byte	0x67
-	.4byte	0x84
-	.2byte	0x100
-	.uleb128 0x16
-	.4byte	.LASF295
-	.byte	0x1a
-	.byte	0x68
-	.4byte	0x84
-	.2byte	0x104
-	.uleb128 0x16
-	.4byte	.LASF296
-	.byte	0x1a
-	.byte	0x6a
-	.4byte	0x3b
-	.2byte	0x108
-	.uleb128 0x16
-	.4byte	.LASF297
-	.byte	0x1a
-	.byte	0x6b
-	.4byte	0x3b
-	.2byte	0x110
-	.uleb128 0x16
-	.4byte	.LASF298
-	.byte	0x1a
-	.byte	0x6c
-	.4byte	0x3b
-	.2byte	0x118
-	.uleb128 0x16
-	.4byte	.LASF299
-	.byte	0x1a
-	.byte	0x75
-	.4byte	0x25d
-	.2byte	0x120
-	.uleb128 0x16
-	.4byte	.LASF136
-	.byte	0x1a
-	.byte	0x76
-	.4byte	0xc8f
-	.2byte	0x128
-	.uleb128 0x16
-	.4byte	.LASF300
-	.byte	0x1a
-	.byte	0x7c
-	.4byte	0x109
-	.2byte	0x168
-	.uleb128 0x16
-	.4byte	.LASF301
-	.byte	0x1a
-	.byte	0x7d
-	.4byte	0x109
-	.2byte	0x170
-	.uleb128 0x16
-	.4byte	.LASF302
-	.byte	0x1a
-	.byte	0x83
-	.4byte	0xb8
-	.2byte	0x178
-	.uleb128 0x16
-	.4byte	.LASF303
-	.byte	0x1a
-	.byte	0x88
-	.4byte	0xd08
-	.2byte	0x180
-	.uleb128 0x16
-	.4byte	.LASF304
-	.byte	0x1a
-	.byte	0x89
-	.4byte	0x109
-	.2byte	0x198
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xd44
-	.uleb128 0xe
-	.4byte	.LASF305
-	.byte	0x40
-	.byte	0x1b
-	.byte	0x2c
-	.4byte	0xfaf
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0x1b
-	.byte	0x2d
-	.4byte	0xd5
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF135
-	.byte	0x1b
-	.byte	0x2e
-	.4byte	0xd5
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF306
-	.byte	0x1b
-	.byte	0x2f
-	.4byte	0x145c
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF307
-	.byte	0x1b
-	.byte	0x30
-	.4byte	0xd5
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF308
-	.byte	0x1b
-	.byte	0x32
-	.4byte	0x14a4
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF34
-	.byte	0x1b
-	.byte	0x33
-	.4byte	0xfb4
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF309
-	.byte	0x1b
-	.byte	0x34
-	.4byte	0xfb4
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF310
-	.byte	0x1b
-	.byte	0x35
-	.4byte	0xfb4
-	.byte	0x38
-	.byte	0
-	.uleb128 0x8
-	.4byte	0xf42
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xf42
-	.uleb128 0x27
-	.4byte	.LASF481
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xfba
-	.uleb128 0xb
-	.4byte	0xe0
-	.4byte	0xfd5
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x1f
-	.byte	0
-	.uleb128 0x2
-	.4byte	.LASF311
-	.byte	0x1a
-	.byte	0x8f
-	.4byte	0xd44
-	.uleb128 0x4
-	.4byte	0xfd5
-	.uleb128 0x5
-	.4byte	.LASF312
-	.byte	0x5
-	.byte	0xab
-	.4byte	0x109
-	.uleb128 0xb
-	.4byte	0x99
-	.4byte	0xffb
-	.uleb128 0xc
-	.byte	0
-	.uleb128 0x5
-	.4byte	.LASF313
-	.byte	0x5
-	.byte	0xad
-	.4byte	0xff0
-	.uleb128 0x5
-	.4byte	.LASF314
-	.byte	0x5
-	.byte	0xae
-	.4byte	0xff0
-	.uleb128 0x5
-	.4byte	.LASF315
-	.byte	0x5
-	.byte	0xfc
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF316
-	.byte	0x5
-	.byte	0xfd
-	.4byte	0x109
-	.uleb128 0x5
-	.4byte	.LASF317
-	.byte	0x5
-	.byte	0xfe
-	.4byte	0x109
-	.uleb128 0xe
-	.4byte	.LASF318
-	.byte	0x4
-	.byte	0x1c
-	.byte	0x2e
-	.4byte	0x104b
-	.uleb128 0xf
-	.4byte	.LASF319
-	.byte	0x1c
-	.byte	0x2f
-	.4byte	0x12a
-	.byte	0
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x29
-	.uleb128 0xe
-	.4byte	.LASF320
-	.byte	0x68
-	.byte	0x1c
-	.byte	0xa6
-	.4byte	0x10ee
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0x1c
-	.byte	0xa8
-	.4byte	0x10ee
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF321
-	.byte	0x1c
-	.byte	0xa9
-	.4byte	0x280
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF322
-	.byte	0x1c
-	.byte	0xaa
-	.4byte	0xb8
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF164
-	.byte	0x1c
-	.byte	0xab
-	.4byte	0x59
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF323
-	.byte	0x1c
-	.byte	0xad
-	.4byte	0x1118
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF324
-	.byte	0x1c
-	.byte	0xae
-	.4byte	0x1137
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF325
-	.byte	0x1c
-	.byte	0xaf
-	.4byte	0x114c
-	.byte	0x38
-	.uleb128 0xf
-	.4byte	.LASF326
-	.byte	0x1c
-	.byte	0xb0
-	.4byte	0x115d
-	.byte	0x40
-	.uleb128 0xf
-	.4byte	.LASF327
-	.byte	0x1c
-	.byte	0xb4
-	.4byte	0x114c
-	.byte	0x48
-	.uleb128 0xf
-	.4byte	.LASF47
-	.byte	0x1c
-	.byte	0xb5
-	.4byte	0x1112
-	.byte	0x50
-	.uleb128 0xf
-	.4byte	.LASF328
-	.byte	0x1c
-	.byte	0xb6
-	.4byte	0x59
-	.byte	0x58
-	.uleb128 0xf
-	.4byte	.LASF35
-	.byte	0x1c
-	.byte	0xb7
-	.4byte	0x135
-	.byte	0x60
-	.byte	0
-	.uleb128 0xb
-	.4byte	0xe0
-	.4byte	0x10fe
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0xf
-	.byte	0
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x1112
-	.uleb128 0x14
-	.4byte	0x1112
-	.uleb128 0x14
-	.4byte	0xa43
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1051
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x10fe
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x1137
-	.uleb128 0x14
-	.4byte	0x1112
-	.uleb128 0x14
-	.4byte	0x135
-	.uleb128 0x14
-	.4byte	0x59
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x111e
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x114c
-	.uleb128 0x14
-	.4byte	0x1112
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x113d
-	.uleb128 0x28
-	.4byte	0x115d
-	.uleb128 0x14
-	.4byte	0x1112
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1152
-	.uleb128 0x5
-	.4byte	.LASF329
-	.byte	0x1c
-	.byte	0xbd
-	.4byte	0x1112
-	.uleb128 0x28
-	.4byte	0x117e
-	.uleb128 0x14
-	.4byte	0x135
-	.uleb128 0x14
-	.4byte	0x59
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF330
-	.byte	0x1c
-	.2byte	0x11e
-	.4byte	0x118a
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x116e
-	.uleb128 0xb
-	.4byte	0x99
-	.4byte	0x11a0
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x5
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF331
-	.byte	0x1c
-	.2byte	0x1fd
-	.4byte	0x1032
-	.uleb128 0xd
-	.4byte	.LASF332
-	.byte	0x1c
-	.2byte	0x1fe
-	.4byte	0x1032
-	.uleb128 0xd
-	.4byte	.LASF333
-	.byte	0x1c
-	.2byte	0x200
-	.4byte	0x1032
-	.uleb128 0xd
-	.4byte	.LASF334
-	.byte	0x1c
-	.2byte	0x205
-	.4byte	0xfc5
-	.uleb128 0xd
-	.4byte	.LASF335
-	.byte	0x1c
-	.2byte	0x206
-	.4byte	0xfc5
-	.uleb128 0xb
-	.4byte	0xe0
-	.4byte	0x11ec
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x3f
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF336
-	.byte	0x1c
-	.2byte	0x207
-	.4byte	0x11dc
-	.uleb128 0xd
-	.4byte	.LASF337
-	.byte	0x1c
-	.2byte	0x209
-	.4byte	0x1190
-	.uleb128 0xd
-	.4byte	.LASF338
-	.byte	0x1c
-	.2byte	0x20a
-	.4byte	0x1190
-	.uleb128 0xd
-	.4byte	.LASF339
-	.byte	0x1c
-	.2byte	0x20b
-	.4byte	0x1032
-	.uleb128 0xd
-	.4byte	.LASF340
-	.byte	0x1c
-	.2byte	0x20c
-	.4byte	0x1032
-	.uleb128 0xd
-	.4byte	.LASF341
-	.byte	0x1c
-	.2byte	0x20d
-	.4byte	0x104b
-	.uleb128 0xb
-	.4byte	0x104b
-	.4byte	0x1244
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x3
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF342
-	.byte	0x1c
-	.2byte	0x20e
-	.4byte	0x1234
-	.uleb128 0xd
-	.4byte	.LASF343
-	.byte	0x1c
-	.2byte	0x20f
-	.4byte	0x104b
-	.uleb128 0xd
-	.4byte	.LASF344
-	.byte	0x1c
-	.2byte	0x210
-	.4byte	0x59
-	.uleb128 0xb
-	.4byte	0xa3
-	.4byte	0x1278
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x5
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x1268
-	.uleb128 0xd
-	.4byte	.LASF345
-	.byte	0x1c
-	.2byte	0x211
-	.4byte	0x1278
-	.uleb128 0xd
-	.4byte	.LASF346
-	.byte	0x1c
-	.2byte	0x212
-	.4byte	0x1278
-	.uleb128 0xd
-	.4byte	.LASF347
-	.byte	0x1c
-	.2byte	0x216
-	.4byte	0xfe
-	.uleb128 0xd
-	.4byte	.LASF348
-	.byte	0x1c
-	.2byte	0x217
-	.4byte	0xfe
-	.uleb128 0xd
-	.4byte	.LASF349
-	.byte	0x1c
-	.2byte	0x219
-	.4byte	0x59
-	.uleb128 0xb
-	.4byte	0xe0
-	.4byte	0x12ca
-	.uleb128 0x17
-	.4byte	0xce
-	.2byte	0x3ff
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF350
-	.byte	0x1c
-	.2byte	0x220
-	.4byte	0x12b9
-	.uleb128 0xd
-	.4byte	.LASF351
-	.byte	0x1c
-	.2byte	0x222
-	.4byte	0xa8
-	.uleb128 0xd
-	.4byte	.LASF352
-	.byte	0x1c
-	.2byte	0x224
-	.4byte	0xa8
-	.uleb128 0xd
-	.4byte	.LASF353
-	.byte	0x1c
-	.2byte	0x230
-	.4byte	0x1032
-	.uleb128 0x29
-	.4byte	.LASF354
-	.byte	0x4
-	.4byte	0x84
-	.byte	0x1c
-	.2byte	0x286
-	.4byte	0x1324
-	.uleb128 0x1c
-	.4byte	.LASF355
-	.byte	0
-	.uleb128 0x1c
-	.4byte	.LASF356
-	.byte	0x1
-	.uleb128 0x1c
-	.4byte	.LASF357
-	.byte	0x2
-	.uleb128 0x1c
-	.4byte	.LASF358
-	.byte	0x3
-	.byte	0
-	.uleb128 0xd
-	.4byte	.LASF359
-	.byte	0x1c
-	.2byte	0x28c
-	.4byte	0x12fa
-	.uleb128 0xd
-	.4byte	.LASF360
-	.byte	0x1d
-	.2byte	0x3ba
-	.4byte	0x109
-	.uleb128 0xd
-	.4byte	.LASF361
-	.byte	0x1d
-	.2byte	0x3bb
-	.4byte	0x109
-	.uleb128 0xd
-	.4byte	.LASF362
-	.byte	0x1d
-	.2byte	0x3bc
-	.4byte	0x109
-	.uleb128 0xb
-	.4byte	0xa8
-	.4byte	0x1364
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x1f
-	.byte	0
-	.uleb128 0x2a
-	.4byte	.LASF379
-	.byte	0x1
-	.byte	0xa
-	.4byte	0x1354
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	g_isi_pattern
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xa8
-	.uleb128 0xe
-	.4byte	.LASF27
-	.byte	0x78
-	.byte	0xb
-	.byte	0xee
-	.4byte	0x1457
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0xb
-	.byte	0xef
-	.4byte	0xf3
-	.byte	0
-	.uleb128 0x10
-	.string	"id"
-	.byte	0xb
-	.byte	0xf0
-	.4byte	0xa61
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF363
-	.byte	0xb
-	.byte	0xf1
-	.4byte	0x158a
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF364
-	.byte	0xb
-	.byte	0xf2
-	.4byte	0x159f
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF365
-	.byte	0xb
-	.byte	0xf3
-	.4byte	0x159f
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF366
-	.byte	0xb
-	.byte	0xf4
-	.4byte	0x159f
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF367
-	.byte	0xb
-	.byte	0xf5
-	.4byte	0x159f
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF368
-	.byte	0xb
-	.byte	0xf6
-	.4byte	0x159f
-	.byte	0x38
-	.uleb128 0xf
-	.4byte	.LASF369
-	.byte	0xb
-	.byte	0xf7
-	.4byte	0x159f
-	.byte	0x40
-	.uleb128 0xf
-	.4byte	.LASF370
-	.byte	0xb
-	.byte	0xf8
-	.4byte	0x159f
-	.byte	0x48
-	.uleb128 0xf
-	.4byte	.LASF371
-	.byte	0xb
-	.byte	0xf9
-	.4byte	0x159f
-	.byte	0x50
-	.uleb128 0xf
-	.4byte	.LASF372
-	.byte	0xb
-	.byte	0xfa
-	.4byte	0x59
-	.byte	0x58
-	.uleb128 0xf
-	.4byte	.LASF373
-	.byte	0xb
-	.byte	0xfb
-	.4byte	0x59
-	.byte	0x5c
-	.uleb128 0xf
-	.4byte	.LASF374
-	.byte	0xb
-	.byte	0xfc
-	.4byte	0x59
-	.byte	0x60
-	.uleb128 0xf
-	.4byte	.LASF375
-	.byte	0xb
-	.byte	0xfd
-	.4byte	0x59
-	.byte	0x64
-	.uleb128 0x10
-	.string	"ops"
-	.byte	0xb
-	.byte	0xfe
-	.4byte	0x263
-	.byte	0x68
-	.uleb128 0xf
-	.4byte	.LASF42
-	.byte	0xb
-	.byte	0xff
-	.4byte	0x11f
-	.byte	0x70
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x137f
-	.uleb128 0x2
-	.4byte	.LASF306
-	.byte	0x1b
-	.byte	0xf
-	.4byte	0xa8
-	.uleb128 0xe
-	.4byte	.LASF376
-	.byte	0x20
-	.byte	0x1b
-	.byte	0x19
-	.4byte	0x14a4
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0x1b
-	.byte	0x1a
-	.4byte	0xf3
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF377
-	.byte	0x1b
-	.byte	0x1b
-	.4byte	0x59
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF378
-	.byte	0x1b
-	.byte	0x1c
-	.4byte	0x135
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF47
-	.byte	0x1b
-	.byte	0x1d
-	.4byte	0x14a4
-	.byte	0x18
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1467
-	.uleb128 0x2b
-	.string	"gd"
-	.byte	0x1b
-	.byte	0x57
-	.4byte	0x14b4
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xfe0
-	.uleb128 0x2c
-	.4byte	.LASF482
-	.byte	0x8
-	.byte	0x1e
-	.byte	0x33
-	.4byte	0x14dc
-	.uleb128 0x2d
-	.string	"np"
-	.byte	0x1e
-	.byte	0x34
-	.4byte	0x14dc
-	.uleb128 0x2e
-	.4byte	.LASF380
-	.byte	0x1e
-	.byte	0x35
-	.4byte	0xec
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xfaf
-	.uleb128 0x2
-	.4byte	.LASF381
-	.byte	0x1e
-	.byte	0x36
-	.4byte	0x14ba
-	.uleb128 0xe
-	.4byte	.LASF382
-	.byte	0x4
-	.byte	0x1f
-	.byte	0xc
-	.4byte	0x1506
-	.uleb128 0x10
-	.string	"pid"
-	.byte	0x1f
-	.byte	0xd
-	.4byte	0x59
-	.byte	0
-	.byte	0
-	.uleb128 0x5
-	.4byte	.LASF383
-	.byte	0x1f
-	.byte	0x10
-	.4byte	0x1511
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x14ed
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1457
-	.uleb128 0xe
-	.4byte	.LASF36
-	.byte	0x30
-	.byte	0x20
-	.byte	0x23
-	.4byte	0x155a
-	.uleb128 0xf
-	.4byte	.LASF35
-	.byte	0x20
-	.byte	0x24
-	.4byte	0x135
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF384
-	.byte	0x20
-	.byte	0x25
-	.4byte	0x1689
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF385
-	.byte	0x20
-	.byte	0x26
-	.4byte	0x290
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF41
-	.byte	0x20
-	.byte	0x27
-	.4byte	0x290
-	.byte	0x20
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x151d
-	.uleb128 0xe
-	.4byte	.LASF386
-	.byte	0x10
-	.byte	0xb
-	.byte	0xb5
-	.4byte	0x1585
-	.uleb128 0xf
-	.4byte	.LASF387
-	.byte	0xb
-	.byte	0xb6
-	.4byte	0xd5
-	.byte	0
-	.uleb128 0xf
-	.4byte	.LASF388
-	.byte	0xb
-	.byte	0xb7
-	.4byte	0x109
-	.byte	0x8
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x1560
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1585
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x159f
-	.uleb128 0x14
-	.4byte	0x25d
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1590
-	.uleb128 0xe
-	.4byte	.LASF389
-	.byte	0x80
-	.byte	0x20
-	.byte	0x54
-	.4byte	0x1689
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0x20
-	.byte	0x55
-	.4byte	0xd5
-	.byte	0
-	.uleb128 0x10
-	.string	"id"
-	.byte	0x20
-	.byte	0x56
-	.4byte	0xa61
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF390
-	.byte	0x20
-	.byte	0x57
-	.4byte	0x159f
-	.byte	0x10
-	.uleb128 0xf
-	.4byte	.LASF391
-	.byte	0x20
-	.byte	0x58
-	.4byte	0x159f
-	.byte	0x18
-	.uleb128 0xf
-	.4byte	.LASF392
-	.byte	0x20
-	.byte	0x59
-	.4byte	0x159f
-	.byte	0x20
-	.uleb128 0xf
-	.4byte	.LASF393
-	.byte	0x20
-	.byte	0x5a
-	.4byte	0x159f
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF394
-	.byte	0x20
-	.byte	0x5b
-	.4byte	0x159f
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF369
-	.byte	0x20
-	.byte	0x5c
-	.4byte	0x159f
-	.byte	0x38
-	.uleb128 0xf
-	.4byte	.LASF370
-	.byte	0x20
-	.byte	0x5d
-	.4byte	0x159f
-	.byte	0x40
-	.uleb128 0xf
-	.4byte	.LASF323
-	.byte	0x20
-	.byte	0x5e
-	.4byte	0x169e
-	.byte	0x48
-	.uleb128 0xf
-	.4byte	.LASF395
-	.byte	0x20
-	.byte	0x5f
-	.4byte	0x169e
-	.byte	0x50
-	.uleb128 0xf
-	.4byte	.LASF372
-	.byte	0x20
-	.byte	0x60
-	.4byte	0x59
-	.byte	0x58
-	.uleb128 0xf
-	.4byte	.LASF396
-	.byte	0x20
-	.byte	0x61
-	.4byte	0x59
-	.byte	0x5c
-	.uleb128 0xf
-	.4byte	.LASF397
-	.byte	0x20
-	.byte	0x62
-	.4byte	0x59
-	.byte	0x60
-	.uleb128 0xf
-	.4byte	.LASF374
-	.byte	0x20
-	.byte	0x63
-	.4byte	0x59
-	.byte	0x64
-	.uleb128 0xf
-	.4byte	.LASF375
-	.byte	0x20
-	.byte	0x64
-	.4byte	0x59
-	.byte	0x68
-	.uleb128 0x10
-	.string	"ops"
-	.byte	0x20
-	.byte	0x65
-	.4byte	0x263
-	.byte	0x70
-	.uleb128 0xf
-	.4byte	.LASF42
-	.byte	0x20
-	.byte	0x66
-	.4byte	0x11f
-	.byte	0x78
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x15a5
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x169e
-	.uleb128 0x14
-	.4byte	0x155a
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x168f
-	.uleb128 0x5
-	.4byte	.LASF398
-	.byte	0x21
-	.byte	0xb
-	.4byte	0x149
-	.uleb128 0xe
-	.4byte	.LASF399
-	.byte	0x70
-	.byte	0x22
-	.byte	0x16
-	.4byte	0x1740
-	.uleb128 0xf
-	.4byte	.LASF42
-	.byte	0x22
-	.byte	0x17
-	.4byte	0x59
-	.byte	0
-	.uleb128 0x10
-	.string	"ext"
-	.byte	0x22
-	.byte	0x18
-	.4byte	0x59
-	.byte	0x4
-	.uleb128 0xf
-	.4byte	.LASF28
-	.byte	0x22
-	.byte	0x19
-	.4byte	0xfc5
-	.byte	0x8
-	.uleb128 0xf
-	.4byte	.LASF54
-	.byte	0x22
-	.byte	0x1d
-	.4byte	0x1755
-	.byte	0x28
-	.uleb128 0xf
-	.4byte	.LASF400
-	.byte	0x22
-	.byte	0x1e
-	.4byte	0x1755
-	.byte	0x30
-	.uleb128 0xf
-	.4byte	.LASF401
-	.byte	0x22
-	.byte	0x23
-	.4byte	0x176b
-	.byte	0x38
-	.uleb128 0xf
-	.4byte	.LASF402
-	.byte	0x22
-	.byte	0x25
-	.4byte	0x1781
-	.byte	0x40
-	.uleb128 0xf
-	.4byte	.LASF403
-	.byte	0x22
-	.byte	0x2a
-	.4byte	0x1755
-	.byte	0x48
-	.uleb128 0xf
-	.4byte	.LASF404
-	.byte	0x22
-	.byte	0x2b
-	.4byte	0x1755
-	.byte	0x50
-	.uleb128 0xf
-	.4byte	.LASF35
-	.byte	0x22
-	.byte	0x2f
-	.4byte	0x135
-	.byte	0x58
-	.uleb128 0xf
-	.4byte	.LASF405
-	.byte	0x22
-	.byte	0x30
-	.4byte	0x290
-	.byte	0x60
-	.byte	0
-	.uleb128 0x13
-	.4byte	0x59
-	.4byte	0x174f
-	.uleb128 0x14
-	.4byte	0x174f
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x16af
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1740
-	.uleb128 0x28
-	.4byte	0x176b
-	.uleb128 0x14
-	.4byte	0x174f
-	.uleb128 0x14
-	.4byte	0xe7
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x175b
-	.uleb128 0x28
-	.4byte	0x1781
-	.uleb128 0x14
-	.4byte	0x174f
-	.uleb128 0x14
-	.4byte	0xd5
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x1771
-	.uleb128 0xb
-	.4byte	0x174f
-	.4byte	0x1792
-	.uleb128 0xc
-	.byte	0
-	.uleb128 0x5
-	.4byte	.LASF406
-	.byte	0x22
-	.byte	0x48
-	.4byte	0x1787
-	.uleb128 0xb
-	.4byte	0xf3
-	.4byte	0x17ad
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x2
-	.byte	0
-	.uleb128 0x5
-	.4byte	.LASF407
-	.byte	0x22
-	.byte	0x49
-	.4byte	0x179d
-	.uleb128 0xb
-	.4byte	0x17c8
-	.4byte	0x17c8
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x2
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x174f
-	.uleb128 0x5
-	.4byte	.LASF408
-	.byte	0x23
-	.byte	0x15
-	.4byte	0x17b8
-	.uleb128 0xb
-	.4byte	0x59
-	.4byte	0x17e9
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x2
-	.byte	0
-	.uleb128 0x5
-	.4byte	.LASF409
-	.byte	0x23
-	.byte	0x1a
-	.4byte	0x17d9
-	.uleb128 0x25
-	.byte	0x4
-	.4byte	0x84
-	.byte	0x2
-	.byte	0x13
-	.4byte	0x1831
-	.uleb128 0x1c
-	.4byte	.LASF410
-	.byte	0
-	.uleb128 0x1c
-	.4byte	.LASF411
-	.byte	0x1
-	.uleb128 0x1c
-	.4byte	.LASF412
-	.byte	0x2
-	.uleb128 0x1c
-	.4byte	.LASF413
-	.byte	0x3
-	.uleb128 0x1c
-	.4byte	.LASF414
-	.byte	0x4
-	.uleb128 0x1c
-	.4byte	.LASF415
-	.byte	0x5
-	.uleb128 0x1c
-	.4byte	.LASF416
-	.byte	0x6
-	.uleb128 0x1c
-	.4byte	.LASF417
-	.byte	0x7
-	.byte	0
-	.uleb128 0xb
-	.4byte	0xdb
-	.4byte	0x1841
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x6
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x1831
-	.uleb128 0x2a
-	.4byte	.LASF418
-	.byte	0x2
-	.byte	0x1e
-	.4byte	0x1841
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	test_pattern
-	.uleb128 0xb
-	.4byte	0xa3
-	.4byte	0x186b
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x6
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x185b
-	.uleb128 0x2a
-	.4byte	.LASF419
-	.byte	0x2
-	.byte	0x28
-	.4byte	0x186b
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	test_pat_param
-	.uleb128 0x2f
-	.4byte	.LASF420
-	.byte	0x2
-	.2byte	0x136
-	.4byte	0x67c
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	_u_boot_list_2_cmd_2_ddr_test
-	.uleb128 0x30
-	.4byte	.LASF429
-	.byte	0x4
-	.byte	0x60
-	.4byte	0x59
-	.8byte	.LFB271
-	.8byte	.LFE271-.LFB271
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x1b4f
-	.uleb128 0x31
-	.4byte	.LASF421
-	.byte	0x4
-	.byte	0x60
-	.4byte	0x109
-	.4byte	.LLST15
-	.uleb128 0x31
-	.4byte	.LASF422
-	.byte	0x4
-	.byte	0x60
-	.4byte	0x109
-	.4byte	.LLST16
-	.uleb128 0x32
-	.string	"ret"
-	.byte	0x4
-	.byte	0x62
-	.4byte	0x59
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x33
-	.4byte	0x1bc3
-	.8byte	.LBB6
-	.4byte	.Ldebug_ranges0+0
-	.byte	0x4
-	.byte	0x64
-	.4byte	0x1a2b
-	.uleb128 0x34
-	.4byte	0x1bde
-	.4byte	.LLST17
-	.uleb128 0x34
-	.4byte	0x1bd3
-	.4byte	.LLST18
-	.uleb128 0x35
-	.4byte	.Ldebug_ranges0+0
-	.uleb128 0x36
-	.4byte	0x1be9
-	.4byte	.LLST19
-	.uleb128 0x36
-	.4byte	0x1bf2
-	.4byte	.LLST20
-	.uleb128 0x36
-	.4byte	0x1bfb
-	.4byte	.LLST21
-	.uleb128 0x36
-	.4byte	0x1c06
-	.4byte	.LLST22
-	.uleb128 0x37
-	.4byte	0x1c11
-	.uleb128 0x36
-	.4byte	0x1c1c
-	.4byte	.LLST23
-	.uleb128 0x36
-	.4byte	0x1c27
-	.4byte	.LLST24
-	.uleb128 0x36
-	.4byte	0x1c32
-	.4byte	.LLST25
-	.uleb128 0x38
-	.8byte	.LVL64
-	.4byte	0x26e7
-	.4byte	0x1981
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x6
-	.byte	0x11
-	.sleb128 -2139062144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x84
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL66
-	.4byte	0x26f3
-	.4byte	0x199f
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x88
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x86
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL72
-	.4byte	0x26f3
-	.4byte	0x19b9
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x4
-	.byte	0x8f
-	.sleb128 192
-	.byte	0x6
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL76
-	.4byte	0x26fe
-	.4byte	0x19d7
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8c
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8c
-	.sleb128 4
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL78
-	.4byte	0x26f3
-	.4byte	0x19f6
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC10
-	.byte	0
-	.uleb128 0x3a
-	.8byte	.LVL79
-	.4byte	0x26f3
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC11
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8c
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x8a
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x8b
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x54
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x3b
-	.4byte	0x1b4f
-	.8byte	.LBB15
-	.4byte	.Ldebug_ranges0+0x60
-	.byte	0x4
-	.byte	0x66
-	.uleb128 0x3c
-	.4byte	0x1b6a
-	.uleb128 0x3c
-	.4byte	0x1b5f
-	.uleb128 0x35
-	.4byte	.Ldebug_ranges0+0x60
-	.uleb128 0x36
-	.4byte	0x1b75
-	.4byte	.LLST26
-	.uleb128 0x36
-	.4byte	0x1b7e
-	.4byte	.LLST27
-	.uleb128 0x3d
-	.4byte	0x1b87
-	.uleb128 0x1
-	.byte	0x66
-	.uleb128 0x3d
-	.4byte	0x1b92
-	.uleb128 0x1
-	.byte	0x69
-	.uleb128 0x3d
-	.4byte	0x1b9d
-	.uleb128 0x1
-	.byte	0x6b
-	.uleb128 0x37
-	.4byte	0x1ba8
-	.uleb128 0x36
-	.4byte	0x1bb1
-	.4byte	.LLST28
-	.uleb128 0x38
-	.8byte	.LVL85
-	.4byte	0x26f3
-	.4byte	0x1aa0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8a
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL87
-	.4byte	0x26e7
-	.4byte	0x1ac4
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x86
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x84
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL91
-	.4byte	0x26f3
-	.4byte	0x1adc
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x88
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL96
-	.4byte	0x26fe
-	.4byte	0x1afa
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 4
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL99
-	.4byte	0x26f3
-	.4byte	0x1b19
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC14
-	.byte	0
-	.uleb128 0x3a
-	.8byte	.LVL100
-	.4byte	0x26f3
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC15
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x89
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x8b
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x54
-	.uleb128 0x2
-	.byte	0x86
-	.sleb128 0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x3e
-	.4byte	.LASF426
-	.byte	0x4
-	.byte	0x36
-	.4byte	0x59
-	.byte	0x1
-	.4byte	0x1bbd
-	.uleb128 0x3f
-	.4byte	.LASF421
-	.byte	0x4
-	.byte	0x36
-	.4byte	0x109
-	.uleb128 0x3f
-	.4byte	.LASF422
-	.byte	0x4
-	.byte	0x36
-	.4byte	0x109
-	.uleb128 0x40
-	.string	"i"
-	.byte	0x4
-	.byte	0x38
-	.4byte	0x109
-	.uleb128 0x40
-	.string	"j"
-	.byte	0x4
-	.byte	0x38
-	.4byte	0x109
-	.uleb128 0x41
-	.4byte	.LASF423
-	.byte	0x4
-	.byte	0x39
-	.4byte	0x109
-	.uleb128 0x41
-	.4byte	.LASF378
-	.byte	0x4
-	.byte	0x39
-	.4byte	0x109
-	.uleb128 0x41
-	.4byte	.LASF424
-	.byte	0x4
-	.byte	0x3a
-	.4byte	0x109
-	.uleb128 0x40
-	.string	"p"
-	.byte	0x4
-	.byte	0x3b
-	.4byte	0x1bbd
-	.uleb128 0x41
-	.4byte	.LASF425
-	.byte	0x4
-	.byte	0x3c
-	.4byte	0x109
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x42
-	.uleb128 0x3e
-	.4byte	.LASF427
-	.byte	0x4
-	.byte	0xb
-	.4byte	0x59
-	.byte	0x1
-	.4byte	0x1c3e
-	.uleb128 0x3f
-	.4byte	.LASF421
-	.byte	0x4
-	.byte	0xb
-	.4byte	0x109
-	.uleb128 0x3f
-	.4byte	.LASF422
-	.byte	0x4
-	.byte	0xb
-	.4byte	0x109
-	.uleb128 0x40
-	.string	"i"
-	.byte	0x4
-	.byte	0xd
-	.4byte	0xa8
-	.uleb128 0x40
-	.string	"j"
-	.byte	0x4
-	.byte	0xd
-	.4byte	0xa8
-	.uleb128 0x41
-	.4byte	.LASF428
-	.byte	0x4
-	.byte	0xe
-	.4byte	0xa8
-	.uleb128 0x41
-	.4byte	.LASF423
-	.byte	0x4
-	.byte	0xe
-	.4byte	0xa8
-	.uleb128 0x41
-	.4byte	.LASF378
-	.byte	0x4
-	.byte	0xe
-	.4byte	0xa8
-	.uleb128 0x41
-	.4byte	.LASF424
-	.byte	0x4
-	.byte	0xf
-	.4byte	0xa8
-	.uleb128 0x40
-	.string	"p32"
-	.byte	0x4
-	.byte	0x10
-	.4byte	0x1c3e
-	.uleb128 0x41
-	.4byte	.LASF425
-	.byte	0x4
-	.byte	0x11
-	.4byte	0x109
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0xb3
-	.uleb128 0x30
-	.4byte	.LASF430
-	.byte	0x3
-	.byte	0xf
-	.4byte	0x59
-	.8byte	.LFB268
-	.8byte	.LFE268-.LFB268
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x1e70
-	.uleb128 0x31
-	.4byte	.LASF431
-	.byte	0x3
-	.byte	0xf
-	.4byte	0x109
-	.4byte	.LLST9
-	.uleb128 0x31
-	.4byte	.LASF377
-	.byte	0x3
-	.byte	0xf
-	.4byte	0x109
-	.4byte	.LLST10
-	.uleb128 0x42
-	.4byte	.LASF268
-	.byte	0x3
-	.byte	0x11
-	.4byte	0x109
-	.4byte	.LLST11
-	.uleb128 0x2a
-	.4byte	.LASF432
-	.byte	0x3
-	.byte	0x11
-	.4byte	0x109
-	.uleb128 0x1
-	.byte	0x64
-	.uleb128 0x42
-	.4byte	.LASF433
-	.byte	0x3
-	.byte	0x12
-	.4byte	0x59
-	.4byte	.LLST12
-	.uleb128 0x2a
-	.4byte	.LASF434
-	.byte	0x3
-	.byte	0x13
-	.4byte	0x1e70
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -32
-	.uleb128 0x43
-	.string	"col"
-	.byte	0x3
-	.byte	0x15
-	.4byte	0xa8
-	.4byte	.LLST13
-	.uleb128 0x2a
-	.4byte	.LASF435
-	.byte	0x3
-	.byte	0x15
-	.4byte	0xa8
-	.uleb128 0x1
-	.byte	0x65
-	.uleb128 0x42
-	.4byte	.LASF436
-	.byte	0x3
-	.byte	0x16
-	.4byte	0x109
-	.4byte	.LLST14
-	.uleb128 0x44
-	.4byte	.LASF483
-	.byte	0x3
-	.byte	0x3e
-	.8byte	.L31
-	.uleb128 0x38
-	.8byte	.LVL38
-	.4byte	0x270a
-	.4byte	0x1d22
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LANCHOR1
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL39
-	.4byte	0x26f3
-	.4byte	0x1d41
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC6
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL40
-	.4byte	0x2713
-	.uleb128 0x38
-	.8byte	.LVL42
-	.4byte	0x26f3
-	.4byte	0x1d73
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC7
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL49
-	.4byte	0x271e
-	.4byte	0x1d92
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL50
-	.4byte	0x2729
-	.4byte	0x1db7
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x89
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL53
-	.4byte	0x2729
-	.4byte	0x1ddc
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8a
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL54
-	.4byte	0x2735
-	.4byte	0x1e12
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x8
-	.byte	0x84
-	.sleb128 0
-	.byte	0x88
-	.sleb128 0
-	.byte	0x22
-	.byte	0x89
-	.sleb128 0
-	.byte	0x22
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x54
-	.uleb128 0x1
-	.byte	0x31
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL59
-	.4byte	0x2729
-	.4byte	0x1e43
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0xe
-	.byte	0x85
-	.sleb128 0
-	.byte	0xc
-	.4byte	0xffffffff
-	.byte	0x1a
-	.byte	0x84
-	.sleb128 0
-	.byte	0x22
-	.byte	0x89
-	.sleb128 0
-	.byte	0x22
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.byte	0
-	.uleb128 0x3a
-	.8byte	.LVL60
-	.4byte	0x2735
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 144
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x8a
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x20
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x54
-	.uleb128 0x1
-	.byte	0x31
-	.byte	0
-	.byte	0
-	.uleb128 0xb
-	.4byte	0xa8
-	.4byte	0x1e80
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x7
-	.byte	0
-	.uleb128 0x46
-	.4byte	.LASF448
-	.byte	0x2
-	.byte	0x62
-	.4byte	0x59
-	.8byte	.LFB256
-	.8byte	.LFE256-.LFB256
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x2293
-	.uleb128 0x31
-	.4byte	.LASF437
-	.byte	0x2
-	.byte	0x62
-	.4byte	0x2293
-	.4byte	.LLST37
-	.uleb128 0x31
-	.4byte	.LASF438
-	.byte	0x2
-	.byte	0x62
-	.4byte	0x59
-	.4byte	.LLST38
-	.uleb128 0x31
-	.4byte	.LASF439
-	.byte	0x2
-	.byte	0x62
-	.4byte	0x59
-	.4byte	.LLST39
-	.uleb128 0x31
-	.4byte	.LASF440
-	.byte	0x2
-	.byte	0x63
-	.4byte	0x641
-	.4byte	.LLST40
-	.uleb128 0x43
-	.string	"i"
-	.byte	0x2
-	.byte	0x65
-	.4byte	0x59
-	.4byte	.LLST41
-	.uleb128 0x42
-	.4byte	.LASF441
-	.byte	0x2
-	.byte	0x66
-	.4byte	0x59
-	.4byte	.LLST42
-	.uleb128 0x42
-	.4byte	.LASF442
-	.byte	0x2
-	.byte	0x66
-	.4byte	0x59
-	.4byte	.LLST43
-	.uleb128 0x32
-	.string	"arg"
-	.byte	0x2
-	.byte	0x67
-	.4byte	0x2299
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -40
-	.uleb128 0x2a
-	.4byte	.LASF431
-	.byte	0x2
-	.byte	0x68
-	.4byte	0x22a9
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -104
-	.uleb128 0x2a
-	.4byte	.LASF377
-	.byte	0x2
-	.byte	0x69
-	.4byte	0x22a9
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -72
-	.uleb128 0x42
-	.4byte	.LASF443
-	.byte	0x2
-	.byte	0x6a
-	.4byte	0xa8
-	.4byte	.LLST44
-	.uleb128 0x42
-	.4byte	.LASF444
-	.byte	0x2
-	.byte	0x6b
-	.4byte	0xa8
-	.4byte	.LLST45
-	.uleb128 0x42
-	.4byte	.LASF445
-	.byte	0x2
-	.byte	0x6c
-	.4byte	0xa8
-	.4byte	.LLST46
-	.uleb128 0x43
-	.string	"ret"
-	.byte	0x2
-	.byte	0x6d
-	.4byte	0x59
-	.4byte	.LLST47
-	.uleb128 0x42
-	.4byte	.LASF446
-	.byte	0x2
-	.byte	0x6e
-	.4byte	0x59
-	.4byte	.LLST48
-	.uleb128 0x42
-	.4byte	.LASF447
-	.byte	0x2
-	.byte	0x6f
-	.4byte	0xa8
-	.4byte	.LLST49
-	.uleb128 0x32
-	.string	"dev"
-	.byte	0x2
-	.byte	0x91
-	.4byte	0x25d
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -112
-	.uleb128 0x38
-	.8byte	.LVL132
-	.4byte	0x26f3
-	.4byte	0x1fbc
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC18
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL133
-	.4byte	0x2740
-	.4byte	0x1fdf
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x84
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x1
-	.byte	0x31
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL135
-	.4byte	0x274b
-	.4byte	0x1ffd
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x8
-	.byte	0x89
-	.sleb128 0
-	.byte	0x33
-	.byte	0x24
-	.byte	0x8b
-	.sleb128 0
-	.byte	0x22
-	.byte	0x6
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL139
-	.4byte	0x26f3
-	.uleb128 0x38
-	.8byte	.LVL141
-	.4byte	0x2756
-	.4byte	0x202d
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x1
-	.byte	0x30
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x8
-	.byte	0x8f
-	.sleb128 0
-	.byte	0x8b
-	.sleb128 0
-	.byte	0x22
-	.byte	0x23
-	.uleb128 0x110
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL143
-	.4byte	0x2761
-	.uleb128 0x45
-	.8byte	.LVL144
-	.4byte	0x23eb
-	.uleb128 0x45
-	.8byte	.LVL145
-	.4byte	0x241b
-	.uleb128 0x38
-	.8byte	.LVL146
-	.4byte	0x26f3
-	.4byte	0x2073
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC26
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL148
-	.4byte	0x23eb
-	.uleb128 0x45
-	.8byte	.LVL149
-	.4byte	0x22b9
-	.uleb128 0x45
-	.8byte	.LVL150
-	.4byte	0x23eb
-	.uleb128 0x38
-	.8byte	.LVL161
-	.4byte	0x26f3
-	.4byte	0x20b8
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8a
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x89
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL162
-	.4byte	0x26f3
-	.4byte	0x20d6
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8b
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL163
-	.4byte	0x241b
-	.uleb128 0x45
-	.8byte	.LVL164
-	.4byte	0x189b
-	.uleb128 0x45
-	.8byte	.LVL167
-	.4byte	0x244c
-	.uleb128 0x45
-	.8byte	.LVL170
-	.4byte	0x1c44
-	.uleb128 0x38
-	.8byte	.LVL173
-	.4byte	0x22b9
-	.4byte	0x2126
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x6
-	.byte	0x8c
-	.sleb128 0
-	.byte	0xa
-	.2byte	0x3fc
-	.byte	0x1a
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL176
-	.4byte	0x241b
-	.uleb128 0x45
-	.8byte	.LVL177
-	.4byte	0x189b
-	.uleb128 0x45
-	.8byte	.LVL180
-	.4byte	0x244c
-	.uleb128 0x45
-	.8byte	.LVL183
-	.4byte	0x1c44
-	.uleb128 0x45
-	.8byte	.LVL185
-	.4byte	0x276c
-	.uleb128 0x38
-	.8byte	.LVL192
-	.4byte	0x26f3
-	.4byte	0x2198
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC25
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0xe
-	.byte	0x86
-	.sleb128 0
-	.byte	0x33
-	.byte	0x24
-	.byte	0x9
-	.byte	0xe5
-	.byte	0x24
-	.byte	0x9
-	.byte	0xe5
-	.byte	0x26
-	.byte	0x88
-	.sleb128 0
-	.byte	0x22
-	.byte	0x6
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL195
-	.4byte	0x26f3
-	.4byte	0x21bc
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC28
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x1
-	.byte	0x3a
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL205
-	.4byte	0x2777
-	.4byte	0x21e1
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 296
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x84
-	.sleb128 0
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL208
-	.4byte	0x241b
-	.uleb128 0x45
-	.8byte	.LVL209
-	.4byte	0x23eb
-	.uleb128 0x38
-	.8byte	.LVL213
-	.4byte	0x26f3
-	.4byte	0x2219
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8a
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x89
-	.sleb128 0
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL218
-	.4byte	0x189b
-	.uleb128 0x45
-	.8byte	.LVL220
-	.4byte	0x276c
-	.uleb128 0x45
-	.8byte	.LVL223
-	.4byte	0x244c
-	.uleb128 0x45
-	.8byte	.LVL224
-	.4byte	0x1c44
-	.uleb128 0x38
-	.8byte	.LVL231
-	.4byte	0x2782
-	.4byte	0x2271
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x35
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x1
-	.byte	0x30
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x3
-	.byte	0x8f
-	.sleb128 208
-	.byte	0
-	.uleb128 0x3a
-	.8byte	.LVL234
-	.4byte	0x26f3
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC21
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.byte	0
-	.byte	0
-	.uleb128 0x9
-	.byte	0x8
-	.4byte	0x67c
-	.uleb128 0xb
-	.4byte	0x109
-	.4byte	0x22a9
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x4
-	.byte	0
-	.uleb128 0xb
-	.4byte	0x109
-	.4byte	0x22b9
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x3
-	.byte	0
-	.uleb128 0x46
-	.4byte	.LASF449
-	.byte	0x2
-	.byte	0x36
-	.4byte	0x59
-	.8byte	.LFB255
-	.8byte	.LFE255-.LFB255
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x23eb
-	.uleb128 0x31
-	.4byte	.LASF450
-	.byte	0x2
-	.byte	0x36
-	.4byte	0xa8
-	.4byte	.LLST29
-	.uleb128 0x31
-	.4byte	.LASF451
-	.byte	0x2
-	.byte	0x36
-	.4byte	0xa8
-	.4byte	.LLST30
-	.uleb128 0x31
-	.4byte	.LASF452
-	.byte	0x2
-	.byte	0x36
-	.4byte	0x109
-	.4byte	.LLST31
-	.uleb128 0x43
-	.string	"i"
-	.byte	0x2
-	.byte	0x39
-	.4byte	0xa8
-	.4byte	.LLST32
-	.uleb128 0x42
-	.4byte	.LASF453
-	.byte	0x2
-	.byte	0x3a
-	.4byte	0xa8
-	.4byte	.LLST33
-	.uleb128 0x42
-	.4byte	.LASF454
-	.byte	0x2
-	.byte	0x3a
-	.4byte	0xa8
-	.4byte	.LLST34
-	.uleb128 0x42
-	.4byte	.LASF455
-	.byte	0x2
-	.byte	0x3a
-	.4byte	0xa8
-	.4byte	.LLST35
-	.uleb128 0x43
-	.string	"ret"
-	.byte	0x2
-	.byte	0x3b
-	.4byte	0x59
-	.4byte	.LLST36
-	.uleb128 0x45
-	.8byte	.LVL111
-	.4byte	0x278d
-	.uleb128 0x38
-	.8byte	.LVL113
-	.4byte	0x26f3
-	.4byte	0x2381
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x88
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x84
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL114
-	.4byte	0x241b
-	.4byte	0x239f
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x8
-	.byte	0x84
-	.sleb128 0
-	.byte	0xc
-	.4byte	0xffffffc0
-	.byte	0x1a
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL117
-	.4byte	0x189b
-	.4byte	0x23b8
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x3
-	.byte	0x40
-	.byte	0x40
-	.byte	0x24
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL120
-	.4byte	0x26f3
-	.4byte	0x23dd
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC17
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8a
-	.sleb128 0
-	.byte	0
-	.uleb128 0x45
-	.8byte	.LVL125
-	.4byte	0x276c
-	.byte	0
-	.uleb128 0x30
-	.4byte	.LASF456
-	.byte	0x2
-	.byte	0x31
-	.4byte	0x59
-	.8byte	.LFB254
-	.8byte	.LFE254-.LFB254
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x241b
-	.uleb128 0x47
-	.string	"uv"
-	.byte	0x2
-	.byte	0x31
-	.4byte	0xa8
-	.4byte	.LLST8
-	.byte	0
-	.uleb128 0x30
-	.4byte	.LASF457
-	.byte	0x2
-	.byte	0x2c
-	.4byte	0x59
-	.8byte	.LFB253
-	.8byte	.LFE253-.LFB253
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x244c
-	.uleb128 0x31
-	.4byte	.LASF455
-	.byte	0x2
-	.byte	0x2c
-	.4byte	0x109
-	.4byte	.LLST7
-	.byte	0
-	.uleb128 0x30
-	.4byte	.LASF458
-	.byte	0x1
-	.byte	0x2d
-	.4byte	0x59
-	.8byte	.LFB200
-	.8byte	.LFE200-.LFB200
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x26d2
-	.uleb128 0x31
-	.4byte	.LASF431
-	.byte	0x1
-	.byte	0x2d
-	.4byte	0x109
-	.4byte	.LLST0
-	.uleb128 0x31
-	.4byte	.LASF377
-	.byte	0x1
-	.byte	0x2d
-	.4byte	0x109
-	.4byte	.LLST1
-	.uleb128 0x42
-	.4byte	.LASF459
-	.byte	0x1
-	.byte	0x2f
-	.4byte	0xa8
-	.4byte	.LLST2
-	.uleb128 0x43
-	.string	"i"
-	.byte	0x1
-	.byte	0x2f
-	.4byte	0xa8
-	.4byte	.LLST3
-	.uleb128 0x43
-	.string	"j"
-	.byte	0x1
-	.byte	0x2f
-	.4byte	0xa8
-	.4byte	.LLST4
-	.uleb128 0x43
-	.string	"q"
-	.byte	0x1
-	.byte	0x2f
-	.4byte	0xa8
-	.4byte	.LLST5
-	.uleb128 0x32
-	.string	"buf"
-	.byte	0x1
-	.byte	0x30
-	.4byte	0x1e70
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -32
-	.uleb128 0x43
-	.string	"p"
-	.byte	0x1
-	.byte	0x31
-	.4byte	0x1379
-	.4byte	.LLST6
-	.uleb128 0x48
-	.4byte	.LASF460
-	.4byte	0x26e2
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC35
-	.uleb128 0x38
-	.8byte	.LVL2
-	.4byte	0x26f3
-	.4byte	0x250e
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC1
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL4
-	.4byte	0x26f3
-	.4byte	0x252e
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x4
-	.byte	0x8f
-	.sleb128 200
-	.byte	0x6
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x84
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL6
-	.4byte	0x26f3
-	.4byte	0x254e
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x4
-	.byte	0x8f
-	.sleb128 192
-	.byte	0x6
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8b
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL8
-	.4byte	0x271e
-	.4byte	0x256c
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL9
-	.4byte	0x2799
-	.4byte	0x2596
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x88
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL10
-	.4byte	0x2735
-	.4byte	0x25c5
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x88
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x54
-	.uleb128 0x1
-	.byte	0x31
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL16
-	.4byte	0x26f3
-	.4byte	0x25e4
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC4
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL17
-	.4byte	0x27a4
-	.4byte	0x25fc
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x80
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL20
-	.4byte	0x26f3
-	.4byte	0x2621
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	.LC5
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x8
-	.byte	0x80
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL23
-	.4byte	0x26f3
-	.4byte	0x263f
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x8b
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x84
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL24
-	.4byte	0x26f3
-	.4byte	0x265d
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x89
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x86
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL26
-	.4byte	0x271e
-	.4byte	0x267b
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.byte	0
-	.uleb128 0x38
-	.8byte	.LVL27
-	.4byte	0x2799
-	.4byte	0x26a5
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x88
-	.sleb128 0
-	.byte	0
-	.uleb128 0x3a
-	.8byte	.LVL28
-	.4byte	0x2735
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x2
-	.byte	0x85
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x2
-	.byte	0x83
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x2
-	.byte	0x87
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x2
-	.byte	0x88
-	.sleb128 0
-	.uleb128 0x39
-	.uleb128 0x1
-	.byte	0x54
-	.uleb128 0x2
-	.byte	0x8c
-	.sleb128 0
-	.byte	0
-	.byte	0
-	.uleb128 0xb
-	.4byte	0xe7
-	.4byte	0x26e2
-	.uleb128 0x12
-	.4byte	0xce
-	.byte	0x9
-	.byte	0
-	.uleb128 0x8
-	.4byte	0x26d2
-	.uleb128 0x49
-	.4byte	.LASF461
-	.4byte	.LASF461
-	.byte	0x1d
-	.2byte	0x16c
-	.uleb128 0x4a
-	.4byte	.LASF462
-	.4byte	.LASF462
-	.byte	0x25
-	.byte	0x12
-	.uleb128 0x49
-	.4byte	.LASF463
-	.4byte	.LASF463
-	.byte	0x5
-	.2byte	0x258
-	.uleb128 0x4b
-	.4byte	.LASF466
-	.4byte	.LASF466
-	.uleb128 0x4a
-	.4byte	.LASF464
-	.4byte	.LASF464
-	.byte	0x26
-	.byte	0x5f
-	.uleb128 0x4a
-	.4byte	.LASF465
-	.4byte	.LASF465
-	.byte	0x27
-	.byte	0xb
-	.uleb128 0x49
-	.4byte	.LASF466
-	.4byte	.LASF466
-	.byte	0x1d
-	.2byte	0x16d
-	.uleb128 0x4a
-	.4byte	.LASF467
-	.4byte	.LASF467
-	.byte	0x28
-	.byte	0xe
-	.uleb128 0x4a
-	.4byte	.LASF468
-	.4byte	.LASF468
-	.byte	0x28
-	.byte	0x11
-	.uleb128 0x4a
-	.4byte	.LASF469
-	.4byte	.LASF469
-	.byte	0x9
-	.byte	0x2d
-	.uleb128 0x4a
-	.4byte	.LASF470
-	.4byte	.LASF470
-	.byte	0x29
-	.byte	0x29
-	.uleb128 0x4a
-	.4byte	.LASF471
-	.4byte	.LASF471
-	.byte	0x27
-	.byte	0xc
-	.uleb128 0x4a
-	.4byte	.LASF472
-	.4byte	.LASF472
-	.byte	0x21
-	.byte	0x11
-	.uleb128 0x4a
-	.4byte	.LASF473
-	.4byte	.LASF473
-	.byte	0x28
-	.byte	0x12
-	.uleb128 0x4a
-	.4byte	.LASF474
-	.4byte	.LASF474
-	.byte	0x20
-	.byte	0x94
-	.uleb128 0x49
-	.4byte	.LASF475
-	.4byte	.LASF475
-	.byte	0x5
-	.2byte	0x2b9
-	.uleb128 0x4a
-	.4byte	.LASF476
-	.4byte	.LASF476
-	.byte	0x28
-	.byte	0xd
-	.uleb128 0x49
-	.4byte	.LASF477
-	.4byte	.LASF477
-	.byte	0x1d
-	.2byte	0x398
-	.byte	0
-	.section	.debug_abbrev,"",@progbits
-.Ldebug_abbrev0:
-	.uleb128 0x1
-	.uleb128 0x11
-	.byte	0x1
-	.uleb128 0x25
-	.uleb128 0xe
-	.uleb128 0x13
-	.uleb128 0xb
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x1b
-	.uleb128 0xe
-	.uleb128 0x55
-	.uleb128 0x17
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x10
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x2
-	.uleb128 0x16
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x24
-	.byte	0
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x3e
-	.uleb128 0xb
-	.uleb128 0x3
-	.uleb128 0xe
-	.byte	0
-	.byte	0
-	.uleb128 0x4
-	.uleb128 0x35
-	.byte	0
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x5
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x3c
-	.uleb128 0x19
-	.byte	0
-	.byte	0
-	.uleb128 0x6
-	.uleb128 0x24
-	.byte	0
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x3e
-	.uleb128 0xb
-	.uleb128 0x3
-	.uleb128 0x8
-	.byte	0
-	.byte	0
-	.uleb128 0x7
-	.uleb128 0x16
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x8
-	.uleb128 0x26
-	.byte	0
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x9
-	.uleb128 0xf
-	.byte	0
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0xa
-	.uleb128 0xf
-	.byte	0
-	.uleb128 0xb
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0xb
-	.uleb128 0x1
-	.byte	0x1
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0xc
-	.uleb128 0x21
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0xd
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x3c
-	.uleb128 0x19
-	.byte	0
-	.byte	0
-	.uleb128 0xe
-	.uleb128 0x13
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0xf
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x38
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x10
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x38
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x11
-	.uleb128 0x26
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x12
-	.uleb128 0x21
-	.byte	0
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2f
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x13
-	.uleb128 0x15
-	.byte	0x1
-	.uleb128 0x27
-	.uleb128 0x19
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x14
-	.uleb128 0x5
-	.byte	0
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x15
-	.uleb128 0x13
-	.byte	0x1
-	.uleb128 0xb
-	.uleb128 0x5
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x16
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x38
-	.uleb128 0x5
-	.byte	0
-	.byte	0
-	.uleb128 0x17
-	.uleb128 0x21
-	.byte	0
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2f
-	.uleb128 0x5
-	.byte	0
-	.byte	0
-	.uleb128 0x18
-	.uleb128 0x13
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0xb
-	.uleb128 0x5
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x19
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x3c
-	.uleb128 0x19
-	.byte	0
-	.byte	0
-	.uleb128 0x1a
-	.uleb128 0x13
-	.byte	0x1
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x1b
-	.uleb128 0x4
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x1c
-	.uleb128 0x28
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x1c
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x1d
-	.uleb128 0x28
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x1c
-	.uleb128 0xd
-	.byte	0
-	.byte	0
-	.uleb128 0x1e
-	.uleb128 0x13
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x1f
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x38
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x20
-	.uleb128 0x16
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x21
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x38
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x22
-	.uleb128 0x13
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0xb
-	.uleb128 0x5
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x23
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x38
-	.uleb128 0x5
-	.byte	0
-	.byte	0
-	.uleb128 0x24
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x38
-	.uleb128 0x5
-	.byte	0
-	.byte	0
-	.uleb128 0x25
-	.uleb128 0x4
-	.byte	0x1
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x26
-	.uleb128 0x13
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0xb
-	.uleb128 0x5
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x27
-	.uleb128 0x13
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3c
-	.uleb128 0x19
-	.byte	0
-	.byte	0
-	.uleb128 0x28
-	.uleb128 0x15
-	.byte	0x1
-	.uleb128 0x27
-	.uleb128 0x19
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x29
-	.uleb128 0x4
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x2a
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x2b
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3f
-	.uleb128 0x19
-	.byte	0
-	.byte	0
-	.uleb128 0x2c
-	.uleb128 0x17
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0xb
-	.uleb128 0xb
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x2d
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x2e
-	.uleb128 0xd
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x2f
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x30
-	.uleb128 0x2e
-	.byte	0x1
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x27
-	.uleb128 0x19
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
-	.uleb128 0x40
-	.uleb128 0x18
-	.uleb128 0x2117
-	.uleb128 0x19
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x5
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x32
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x33
-	.uleb128 0x1d
-	.byte	0x1
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x52
-	.uleb128 0x1
-	.uleb128 0x55
-	.uleb128 0x17
-	.uleb128 0x58
-	.uleb128 0xb
-	.uleb128 0x59
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x34
-	.uleb128 0x5
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x35
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x55
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x36
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x37
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x38
-	.uleb128 0x4109
-	.byte	0x1
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x39
-	.uleb128 0x410a
-	.byte	0
-	.uleb128 0x2
-	.uleb128 0x18
-	.uleb128 0x2111
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x3a
-	.uleb128 0x4109
-	.byte	0x1
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x31
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x3b
-	.uleb128 0x1d
-	.byte	0x1
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x52
-	.uleb128 0x1
-	.uleb128 0x55
-	.uleb128 0x17
-	.uleb128 0x58
-	.uleb128 0xb
-	.uleb128 0x59
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x3c
-	.uleb128 0x5
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x3d
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x3e
-	.uleb128 0x2e
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x27
-	.uleb128 0x19
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x20
-	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x3f
-	.uleb128 0x5
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x40
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x41
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x42
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x43
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x44
-	.uleb128 0xa
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x11
-	.uleb128 0x1
-	.byte	0
-	.byte	0
-	.uleb128 0x45
-	.uleb128 0x4109
-	.byte	0
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x31
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x46
-	.uleb128 0x2e
-	.byte	0x1
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x27
-	.uleb128 0x19
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
-	.uleb128 0x40
-	.uleb128 0x18
-	.uleb128 0x2117
-	.uleb128 0x19
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x47
-	.uleb128 0x5
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0x8
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x48
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x34
-	.uleb128 0x19
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x49
-	.uleb128 0x2e
-	.byte	0
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x3c
-	.uleb128 0x19
-	.uleb128 0x6e
-	.uleb128 0xe
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0x5
-	.byte	0
-	.byte	0
-	.uleb128 0x4a
-	.uleb128 0x2e
-	.byte	0
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x3c
-	.uleb128 0x19
-	.uleb128 0x6e
-	.uleb128 0xe
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x4b
-	.uleb128 0x2e
-	.byte	0
-	.uleb128 0x3f
-	.uleb128 0x19
-	.uleb128 0x3c
-	.uleb128 0x19
-	.uleb128 0x6e
-	.uleb128 0xe
-	.uleb128 0x3
-	.uleb128 0xe
-	.byte	0
-	.byte	0
-	.byte	0
-	.section	.debug_loc,"",@progbits
-.Ldebug_loc0:
-.LLST15:
-	.8byte	.LVL61
-	.8byte	.LVL64-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL64-1
-	.8byte	.LVL80
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL80
-	.8byte	.LVL81
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x50
-	.byte	0x9f
-	.8byte	.LVL81
-	.8byte	.LFE271
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST16:
-	.8byte	.LVL61
-	.8byte	.LVL63
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL63
-	.8byte	.LVL64-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL64-1
-	.8byte	.LVL80
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL80
-	.8byte	.LVL81
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x51
-	.byte	0x9f
-	.8byte	.LVL81
-	.8byte	.LFE271
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST17:
-	.8byte	.LVL62
-	.8byte	.LVL63
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL63
-	.8byte	.LVL64-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL64-1
-	.8byte	.LVL79
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL81
-	.8byte	.LFE271
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST18:
-	.8byte	.LVL62
-	.8byte	.LVL64-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL64-1
-	.8byte	.LVL79
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL81
-	.8byte	.LFE271
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST19:
-	.8byte	.LVL66
-	.8byte	.LVL67
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL67
-	.8byte	.LVL68
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL73
-	.8byte	.LVL75
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL81
-	.8byte	.LVL83
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST20:
-	.8byte	.LVL64
-	.8byte	.LVL65
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL65
-	.8byte	.LVL69
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL69
-	.8byte	.LVL72
-	.2byte	0x3
-	.byte	0x86
-	.sleb128 -1
-	.byte	0x9f
-	.8byte	.LVL72
-	.8byte	.LVL79
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL81
-	.8byte	.LVL84
-	.2byte	0x1
-	.byte	0x66
-	.8byte	0
-	.8byte	0
-.LLST21:
-	.8byte	.LVL64
-	.8byte	.LVL65
-	.2byte	0x6
-	.byte	0x9e
-	.uleb128 0x4
-	.4byte	0x80808080
-	.8byte	.LVL65
-	.8byte	.LVL79
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL81
-	.8byte	.LVL84
-	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST22:
-	.8byte	.LVL64
-	.8byte	.LVL65
-	.2byte	0x6
-	.byte	0xc
-	.4byte	0x40404040
-	.byte	0x9f
-	.8byte	.LVL65
-	.8byte	.LVL79
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL81
-	.8byte	.LVL84
-	.2byte	0x1
-	.byte	0x67
-	.8byte	0
-	.8byte	0
-.LLST23:
-	.8byte	.LVL62
-	.8byte	.LVL65
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST24:
-	.8byte	.LVL64
-	.8byte	.LVL80
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL80
-	.8byte	.LVL81
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x50
-	.byte	0x9f
-	.8byte	.LVL81
-	.8byte	.LFE271
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST25:
-	.8byte	.LVL62
-	.8byte	.LVL68
-	.2byte	0x3
-	.byte	0x9
-	.byte	0xff
-	.byte	0x9f
-	.8byte	.LVL72
-	.8byte	.LVL74
-	.2byte	0x3
-	.byte	0x9
-	.byte	0xff
-	.byte	0x9f
-	.8byte	.LVL74
-	.8byte	.LVL76-1
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL76-1
-	.8byte	.LVL79
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL81
-	.8byte	.LFE271
-	.2byte	0x3
-	.byte	0x9
-	.byte	0xff
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST26:
-	.8byte	.LVL87
-	.8byte	.LVL88
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL88
-	.8byte	.LVL89
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL92
-	.8byte	.LVL95
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL101
-	.8byte	.LFE271
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST27:
-	.8byte	.LVL84
-	.8byte	.LVL90
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL90
-	.8byte	.LVL91
-	.2byte	0x3
-	.byte	0x85
-	.sleb128 -1
-	.byte	0x9f
-	.8byte	.LVL91
-	.8byte	.LFE271
-	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST28:
-	.8byte	.LVL84
-	.8byte	.LVL89
-	.2byte	0x3
-	.byte	0x9
-	.byte	0xff
-	.byte	0x9f
-	.8byte	.LVL91
-	.8byte	.LVL94
-	.2byte	0x3
-	.byte	0x9
-	.byte	0xff
-	.byte	0x9f
-	.8byte	.LVL94
-	.8byte	.LVL101
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL101
-	.8byte	.LFE271
-	.2byte	0x3
-	.byte	0x9
-	.byte	0xff
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST9:
-	.8byte	.LVL35
-	.8byte	.LVL37
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL37
-	.8byte	.LVL45
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL45
-	.8byte	.LVL46
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x50
-	.byte	0x9f
-	.8byte	.LVL46
-	.8byte	.LFE268
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST10:
-	.8byte	.LVL35
-	.8byte	.LVL36
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL36
-	.8byte	.LVL43
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL43
-	.8byte	.LVL46
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x51
-	.byte	0x9f
-	.8byte	.LVL46
-	.8byte	.LVL47
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL47
-	.8byte	.LVL48
-	.2byte	0x3
-	.byte	0x87
-	.sleb128 32
-	.byte	0x9f
-	.8byte	.LVL48
-	.8byte	.LFE268
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x51
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST11:
-	.8byte	.LVL50
-	.8byte	.LVL55
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST12:
-	.8byte	.LVL41
-	.8byte	.LVL44
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL46
-	.8byte	.LFE268
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST13:
-	.8byte	.LVL50
-	.8byte	.LVL56
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL56
-	.8byte	.LVL57
-	.2byte	0x3
-	.byte	0x85
-	.sleb128 -8
-	.byte	0x9f
-	.8byte	.LVL57
-	.8byte	.LFE268
-	.2byte	0x3
-	.byte	0x88
-	.sleb128 -40
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST14:
-	.8byte	.LVL38
-	.8byte	.LVL43
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL46
-	.8byte	.LVL51
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL51
-	.8byte	.LVL52
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL52
-	.8byte	.LVL54
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL54
-	.8byte	.LVL58
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL60
-	.8byte	.LFE268
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST37:
-	.8byte	.LVL129
-	.8byte	.LVL130
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL130
-	.8byte	.LFE256
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x50
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST38:
-	.8byte	.LVL129
-	.8byte	.LVL132-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL132-1
-	.8byte	.LFE256
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x51
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST39:
-	.8byte	.LVL129
-	.8byte	.LVL132-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL132-1
-	.8byte	.LVL138
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL138
-	.8byte	.LVL228
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x52
-	.byte	0x9f
-	.8byte	.LVL228
-	.8byte	.LVL229
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL229
-	.8byte	.LFE256
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x52
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST40:
-	.8byte	.LVL129
-	.8byte	.LVL132-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL132-1
-	.8byte	.LVL145
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL145
-	.8byte	.LVL147
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x53
-	.byte	0x9f
-	.8byte	.LVL147
-	.8byte	.LVL158
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL158
-	.8byte	.LVL193
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x53
-	.byte	0x9f
-	.8byte	.LVL193
-	.8byte	.LVL196
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL196
-	.8byte	.LVL204
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x53
-	.byte	0x9f
-	.8byte	.LVL204
-	.8byte	.LVL210
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL210
-	.8byte	.LVL226
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x53
-	.byte	0x9f
-	.8byte	.LVL226
-	.8byte	.LVL234
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL234
-	.8byte	.LFE256
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x53
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST41:
-	.8byte	.LVL134
-	.8byte	.LVL136
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL136
-	.8byte	.LVL137
-	.2byte	0x3
-	.byte	0x83
-	.sleb128 1
-	.byte	0x9f
-	.8byte	.LVL137
-	.8byte	.LVL138
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL151
-	.8byte	.LVL153
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL153
-	.8byte	.LVL154
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL154
-	.8byte	.LVL155
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL155
-	.8byte	.LVL156
-	.2byte	0x3
-	.byte	0x70
-	.sleb128 1
-	.byte	0x9f
-	.8byte	.LVL161
-	.8byte	.LVL186
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL186
-	.8byte	.LVL187
-	.2byte	0x3
-	.byte	0x83
-	.sleb128 1
-	.byte	0x9f
-	.8byte	.LVL193
-	.8byte	.LVL194
-	.2byte	0x3
-	.byte	0x70
-	.sleb128 1
-	.byte	0x9f
-	.8byte	.LVL196
-	.8byte	.LVL204
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL213
-	.8byte	.LVL214
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL217
-	.8byte	.LVL221
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL222
-	.8byte	.LVL226
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL228
-	.8byte	.LVL230
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST42:
-	.8byte	.LVL137
-	.8byte	.LVL138
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL140
-	.8byte	.LVL145
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL147
-	.8byte	.LVL159
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL193
-	.8byte	.LVL196
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL204
-	.8byte	.LVL234
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST43:
-	.8byte	.LVL165
-	.8byte	.LVL168
-	.2byte	0x2
-	.byte	0x32
-	.byte	0x9f
-	.8byte	.LVL168
-	.8byte	.LVL171
-	.2byte	0x2
-	.byte	0x33
-	.byte	0x9f
-	.8byte	.LVL171
-	.8byte	.LVL174
-	.2byte	0x2
-	.byte	0x34
-	.byte	0x9f
-	.8byte	.LVL178
-	.8byte	.LVL181
-	.2byte	0x2
-	.byte	0x32
-	.byte	0x9f
-	.8byte	.LVL181
-	.8byte	.LVL184
-	.2byte	0x2
-	.byte	0x33
-	.byte	0x9f
-	.8byte	.LVL184
-	.8byte	.LVL186
-	.2byte	0x2
-	.byte	0x34
-	.byte	0x9f
-	.8byte	.LVL196
-	.8byte	.LVL197
-	.2byte	0x2
-	.byte	0x32
-	.byte	0x9f
-	.8byte	.LVL197
-	.8byte	.LVL198
-	.2byte	0x2
-	.byte	0x33
-	.byte	0x9f
-	.8byte	.LVL198
-	.8byte	.LVL199
-	.2byte	0x2
-	.byte	0x34
-	.byte	0x9f
-	.8byte	.LVL200
-	.8byte	.LVL201
-	.2byte	0x2
-	.byte	0x32
-	.byte	0x9f
-	.8byte	.LVL201
-	.8byte	.LVL202
-	.2byte	0x2
-	.byte	0x33
-	.byte	0x9f
-	.8byte	.LVL202
-	.8byte	.LVL204
-	.2byte	0x2
-	.byte	0x34
-	.byte	0x9f
-	.8byte	.LVL219
-	.8byte	.LVL222
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL225
-	.8byte	.LVL226
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST44:
-	.8byte	.LVL157
-	.8byte	.LVL159
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL159
-	.8byte	.LVL193
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL196
-	.8byte	.LVL204
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL211
-	.8byte	.LVL226
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST45:
-	.8byte	.LVL131
-	.8byte	.LVL145
-	.2byte	0x2
-	.byte	0x31
-	.byte	0x9f
-	.8byte	.LVL147
-	.8byte	.LVL190
-	.2byte	0x2
-	.byte	0x31
-	.byte	0x9f
-	.8byte	.LVL193
-	.8byte	.LVL206
-	.2byte	0x2
-	.byte	0x31
-	.byte	0x9f
-	.8byte	.LVL206
-	.8byte	.LVL207
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL207
-	.8byte	.LVL226
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL226
-	.8byte	.LVL228
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL228
-	.8byte	.LVL234
-	.2byte	0x2
-	.byte	0x31
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST46:
-	.8byte	.LVL131
-	.8byte	.LVL145
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL147
-	.8byte	.LVL152
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL152
-	.8byte	.LVL153
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL193
-	.8byte	.LVL196
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL204
-	.8byte	.LVL234
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST47:
-	.8byte	.LVL131
-	.8byte	.LVL142
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL142
-	.8byte	.LVL143-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL143-1
-	.8byte	.LVL145
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL147
-	.8byte	.LVL159
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL159
-	.8byte	.LVL165
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL165
-	.8byte	.LVL166
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL166
-	.8byte	.LVL168
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL168
-	.8byte	.LVL169
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL169
-	.8byte	.LVL171
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL171
-	.8byte	.LVL172
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL172
-	.8byte	.LVL174
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL174
-	.8byte	.LVL175
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL175
-	.8byte	.LVL178
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL178
-	.8byte	.LVL179
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL179
-	.8byte	.LVL180-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL180-1
-	.8byte	.LVL181
-	.2byte	0x3
-	.byte	0x8f
-	.sleb128 196
-	.8byte	.LVL181
-	.8byte	.LVL182
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL182
-	.8byte	.LVL184
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL184
-	.8byte	.LVL185-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL185-1
-	.8byte	.LVL186
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL186
-	.8byte	.LVL188
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL188
-	.8byte	.LVL191
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL193
-	.8byte	.LVL196
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL196
-	.8byte	.LVL199
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL199
-	.8byte	.LVL200
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL200
-	.8byte	.LVL203
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL203
-	.8byte	.LVL204
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL204
-	.8byte	.LVL211
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL211
-	.8byte	.LVL214
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL214
-	.8byte	.LVL216
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL216
-	.8byte	.LVL219
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL219
-	.8byte	.LVL220-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL220-1
-	.8byte	.LVL222
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL222
-	.8byte	.LVL225
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL225
-	.8byte	.LVL226
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL226
-	.8byte	.LVL227
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL228
-	.8byte	.LVL232
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL232
-	.8byte	.LVL233
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL233
-	.8byte	.LVL234-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL234-1
-	.8byte	.LVL234
-	.2byte	0x1
-	.byte	0x67
-	.8byte	0
-	.8byte	0
-.LLST48:
-	.8byte	.LVL131
-	.8byte	.LVL145
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL147
-	.8byte	.LVL188
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL188
-	.8byte	.LVL189
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL193
-	.8byte	.LVL214
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL214
-	.8byte	.LVL215
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL216
-	.8byte	.LVL234
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST49:
-	.8byte	.LVL157
-	.8byte	.LVL190
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL196
-	.8byte	.LVL204
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	0
-	.8byte	0
-.LLST29:
-	.8byte	.LVL103
-	.8byte	.LVL104
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL104
-	.8byte	.LVL107
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL107
-	.8byte	.LVL108
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL108
-	.8byte	.LVL121
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL124
-	.8byte	.LFE255
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST30:
-	.8byte	.LVL103
-	.8byte	.LVL106
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL106
-	.8byte	.LVL110
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST31:
-	.8byte	.LVL103
-	.8byte	.LVL110
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL110
-	.8byte	.LVL122
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL122
-	.8byte	.LVL124
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x52
-	.byte	0x9f
-	.8byte	.LVL124
-	.8byte	.LFE255
-	.2byte	0x1
-	.byte	0x66
-	.8byte	0
-	.8byte	0
-.LLST32:
-	.8byte	.LVL109
-	.8byte	.LVL110
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL110
-	.8byte	.LVL123
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL124
-	.8byte	.LFE255
-	.2byte	0x1
-	.byte	0x67
-	.8byte	0
-	.8byte	0
-.LLST33:
-	.8byte	.LVL109
-	.8byte	.LVL122
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL124
-	.8byte	.LFE255
-	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST34:
-	.8byte	.LVL111
-	.8byte	.LVL112
-	.2byte	0x9
-	.byte	0x70
-	.sleb128 0
-	.byte	0x85
-	.sleb128 0
-	.byte	0x1d
-	.byte	0x83
-	.sleb128 0
-	.byte	0x22
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST35:
-	.8byte	.LVL115
-	.8byte	.LVL116
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL116
-	.8byte	.LVL120
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL124
-	.8byte	.LVL126
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL127
-	.8byte	.LFE255
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	0
-	.8byte	0
-.LLST36:
-	.8byte	.LVL103
-	.8byte	.LVL118
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL118
-	.8byte	.LVL119
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL119
-	.8byte	.LVL120
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL124
-	.8byte	.LVL125-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL125-1
-	.8byte	.LVL126
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL127
-	.8byte	.LFE255
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST8:
-	.8byte	.LVL33
-	.8byte	.LVL34
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL34
-	.8byte	.LFE254
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x50
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST7:
-	.8byte	.LVL31
-	.8byte	.LVL32
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL32
-	.8byte	.LFE253
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x50
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST0:
-	.8byte	.LVL0
-	.8byte	.LVL1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1
-	.8byte	.LVL12
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL12
-	.8byte	.LVL13
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x50
-	.byte	0x9f
-	.8byte	.LVL13
-	.8byte	.LFE200
-	.2byte	0x1
-	.byte	0x67
-	.8byte	0
-	.8byte	0
-.LLST1:
-	.8byte	.LVL0
-	.8byte	.LVL2-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL2-1
-	.8byte	.LVL12
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL12
-	.8byte	.LVL13
-	.2byte	0x4
-	.byte	0xf3
-	.uleb128 0x1
-	.byte	0x51
-	.byte	0x9f
-	.8byte	.LVL13
-	.8byte	.LFE200
-	.2byte	0x1
-	.byte	0x68
-	.8byte	0
-	.8byte	0
-.LLST2:
-	.8byte	.LVL2
-	.8byte	.LVL3
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	.LVL3
-	.8byte	.LVL11
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL13
-	.8byte	.LVL22
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL23
-	.8byte	.LFE200
-	.2byte	0x1
-	.byte	0x66
-	.8byte	0
-	.8byte	0
-.LLST3:
-	.8byte	.LVL24
-	.8byte	.LVL25
-	.2byte	0x2
-	.byte	0x30
-	.byte	0x9f
-	.8byte	0
-	.8byte	0
-.LLST4:
-	.8byte	.LVL4
-	.8byte	.LVL11
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL13
-	.8byte	.LVL21
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL22
-	.8byte	.LFE200
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST5:
-	.8byte	.LVL3
-	.8byte	.LVL4
-	.2byte	0x3
-	.byte	0x9
-	.byte	0xff
-	.byte	0x9f
-	.8byte	.LVL4
-	.8byte	.LVL5
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL5
-	.8byte	.LVL6
-	.2byte	0x4
-	.byte	0x8c
-	.sleb128 0
-	.byte	0x20
-	.byte	0x9f
-	.8byte	.LVL6
-	.8byte	.LVL11
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL13
-	.8byte	.LVL22
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	0
-	.8byte	0
-.LLST6:
-	.8byte	.LVL18
-	.8byte	.LVL19
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL19
-	.8byte	.LFE200
-	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-	.section	.debug_aranges,"",@progbits
-	.4byte	0x8c
-	.2byte	0x2
-	.4byte	.Ldebug_info0
-	.byte	0x8
-	.byte	0
-	.2byte	0
-	.2byte	0
-	.8byte	.LFB200
-	.8byte	.LFE200-.LFB200
-	.8byte	.LFB253
-	.8byte	.LFE253-.LFB253
-	.8byte	.LFB254
-	.8byte	.LFE254-.LFB254
-	.8byte	.LFB268
-	.8byte	.LFE268-.LFB268
-	.8byte	.LFB271
-	.8byte	.LFE271-.LFB271
-	.8byte	.LFB255
-	.8byte	.LFE255-.LFB255
-	.8byte	.LFB256
-	.8byte	.LFE256-.LFB256
-	.8byte	0
-	.8byte	0
-	.section	.debug_ranges,"",@progbits
-.Ldebug_ranges0:
-	.8byte	.LBB6
-	.8byte	.LBE6
-	.8byte	.LBB12
-	.8byte	.LBE12
-	.8byte	.LBB13
-	.8byte	.LBE13
-	.8byte	.LBB14
-	.8byte	.LBE14
-	.8byte	.LBB18
-	.8byte	.LBE18
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB15
-	.8byte	.LBE15
-	.8byte	.LBB19
-	.8byte	.LBE19
-	.8byte	0
-	.8byte	0
-	.8byte	.LFB200
-	.8byte	.LFE200
-	.8byte	.LFB253
-	.8byte	.LFE253
-	.8byte	.LFB254
-	.8byte	.LFE254
-	.8byte	.LFB268
-	.8byte	.LFE268
-	.8byte	.LFB271
-	.8byte	.LFE271
-	.8byte	.LFB255
-	.8byte	.LFE255
-	.8byte	.LFB256
-	.8byte	.LFE256
-	.8byte	0
-	.8byte	0
-	.section	.debug_line,"",@progbits
-.Ldebug_line0:
-	.section	.debug_str,"MS",@progbits,1
-.LASF30:
-	.string	"parent_platdata"
-.LASF109:
-	.string	"off_mem_rsvmap"
-.LASF193:
-	.string	"UCLASS_I2C_EEPROM"
-.LASF481:
-	.string	"jt_funcs"
-.LASF198:
-	.string	"UCLASS_IRQ"
-.LASF159:
-	.string	"initrd_start"
-.LASF192:
-	.string	"UCLASS_I2C"
-.LASF13:
-	.string	"sizetype"
-.LASF335:
-	.string	"net_hostname"
-.LASF330:
-	.string	"push_packet"
-.LASF54:
-	.string	"start"
-.LASF231:
-	.string	"UCLASS_SPI"
-.LASF309:
-	.string	"child"
-.LASF196:
-	.string	"UCLASS_I2S"
-.LASF356:
-	.string	"NETLOOP_RESTART"
-.LASF194:
-	.string	"UCLASS_I2C_GENERIC"
-.LASF206:
-	.string	"UCLASS_MOD_EXP"
-.LASF253:
-	.string	"UCLASS_IO_DOMAIN"
-.LASF266:
-	.string	"using_pre_serial"
-.LASF37:
-	.string	"uclass_priv"
-.LASF226:
-	.string	"UCLASS_RKNAND"
-.LASF170:
-	.string	"UCLASS_DEMO"
-.LASF379:
-	.string	"g_isi_pattern"
-.LASF117:
-	.string	"ih_magic"
-.LASF46:
-	.string	"list_head"
-.LASF425:
-	.string	"err_addr"
-.LASF370:
-	.string	"child_pre_probe"
-.LASF302:
-	.string	"pm_ctx_phys"
-.LASF174:
-	.string	"UCLASS_TEST_PROBE"
-.LASF307:
-	.string	"full_name"
-.LASF249:
-	.string	"UCLASS_KEY"
-.LASF80:
-	.string	"bi_intfreq"
-.LASF460:
-	.string	"__func__"
-.LASF11:
-	.string	"phys_addr_t"
-.LASF244:
-	.string	"UCLASS_VIDEO_BRIDGE"
-.LASF301:
-	.string	"video_bottom"
-.LASF457:
-	.string	"set_ddr_freq"
-.LASF5:
-	.string	"__u8"
-.LASF355:
-	.string	"NETLOOP_CONTINUE"
-.LASF234:
-	.string	"UCLASS_SPI_GENERIC"
-.LASF296:
-	.string	"malloc_base"
-.LASF464:
-	.string	"get_page_size"
-.LASF56:
-	.string	"flash_info_t"
-.LASF210:
-	.string	"UCLASS_PANEL"
-.LASF134:
-	.string	"comp"
-.LASF129:
-	.string	"image_header_t"
-.LASF164:
-	.string	"state"
-.LASF186:
-	.string	"UCLASS_CROS_EC"
-.LASF74:
-	.string	"bi_dsp_freq"
-.LASF131:
-	.string	"image_start"
-.LASF445:
-	.string	"fast_test_bank"
-.LASF172:
-	.string	"UCLASS_TEST_FDT"
-.LASF430:
-	.string	"diagonalscan"
-.LASF65:
-	.string	"bd_info"
-.LASF168:
-	.string	"uclass_id"
-.LASF121:
-	.string	"ih_load"
-.LASF314:
-	.string	"__dtb_dt_spl_begin"
-.LASF394:
-	.string	"pre_remove"
-.LASF427:
-	.string	"random_test1"
-.LASF426:
-	.string	"random_test2"
-.LASF7:
-	.string	"__u32"
-.LASF35:
-	.string	"priv"
-.LASF299:
-	.string	"cur_serial_dev"
-.LASF469:
-	.string	"strcasecmp"
-.LASF143:
-	.string	"fit_hdr_os"
-.LASF341:
-	.string	"net_tx_packet"
-.LASF248:
-	.string	"UCLASS_FG"
-.LASF340:
-	.string	"net_server_ip"
-.LASF482:
-	.string	"ofnode_union"
-.LASF348:
-	.string	"net_native_vlan"
-.LASF246:
-	.string	"UCLASS_VIDEO_CRTC"
-.LASF185:
-	.string	"UCLASS_CODEC"
-.LASF478:
-	.ascii	"GNU C11 6.3.1 20170404 -ms"
-	.string	"trict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -fno-pic -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18"
-.LASF293:
-	.string	"env_buf"
-.LASF21:
-	.string	"errno"
-.LASF15:
-	.string	"long int"
-.LASF69:
-	.string	"bi_flashsize"
-.LASF401:
-	.string	"putc"
-.LASF29:
-	.string	"platdata"
-.LASF215:
-	.string	"UCLASS_PHY"
-.LASF92:
-	.string	"IRQ_STACK_START_IN"
-.LASF113:
-	.string	"size_dt_strings"
-.LASF243:
-	.string	"UCLASS_VIDEO"
-.LASF402:
-	.string	"puts"
-.LASF475:
-	.string	"rand"
-.LASF279:
-	.string	"relocaddr"
-.LASF385:
-	.string	"dev_head"
-.LASF351:
-	.string	"net_boot_file_size"
-.LASF407:
-	.string	"stdio_names"
-.LASF123:
-	.string	"ih_dcrc"
-.LASF79:
-	.string	"bi_ethspeed"
-.LASF169:
-	.string	"UCLASS_ROOT"
-.LASF44:
-	.string	"ide_bus_offset"
-.LASF419:
-	.string	"test_pat_param"
-.LASF338:
-	.string	"net_server_ethaddr"
-.LASF82:
-	.string	"bi_arch_number"
-.LASF3:
-	.string	"signed char"
-.LASF199:
-	.string	"UCLASS_KEYBOARD"
-.LASF18:
-	.string	"uint8_t"
-.LASF375:
-	.string	"per_child_platdata_auto_alloc_size"
-.LASF45:
-	.string	"udevice"
-.LASF467:
-	.string	"cmp_buf_data"
-.LASF125:
-	.string	"ih_arch"
-.LASF106:
-	.string	"totalsize"
-.LASF446:
-	.string	"abort"
-.LASF118:
-	.string	"ih_hcrc"
-.LASF281:
-	.string	"mon_len"
-.LASF133:
-	.string	"load"
-.LASF239:
-	.string	"UCLASS_TPM"
-.LASF428:
-	.string	"cmp_value"
-.LASF59:
-	.string	"lmb_property"
-.LASF111:
-	.string	"last_comp_version"
-.LASF0:
-	.string	"unsigned char"
-.LASF392:
-	.string	"pre_probe"
-.LASF453:
-	.string	"delta_freq"
-.LASF412:
-	.string	"RANDOM"
-.LASF166:
-	.string	"images"
-.LASF252:
-	.string	"UCLASS_DVFS"
-.LASF75:
-	.string	"bi_ddr_freq"
-.LASF200:
-	.string	"UCLASS_LED"
-.LASF120:
-	.string	"ih_size"
-.LASF39:
-	.string	"uclass_node"
-.LASF23:
-	.string	"_Bool"
-.LASF376:
-	.string	"property"
-.LASF359:
-	.string	"net_state"
-.LASF378:
-	.string	"value"
-.LASF195:
-	.string	"UCLASS_I2C_MUX"
-.LASF14:
-	.string	"char"
-.LASF25:
-	.string	"_binary_u_boot_bin_start"
-.LASF418:
-	.string	"test_pattern"
-.LASF357:
-	.string	"NETLOOP_SUCCESS"
-.LASF36:
-	.string	"uclass"
-.LASF382:
-	.string	"p_current"
-.LASF384:
-	.string	"uc_drv"
-.LASF354:
-	.string	"net_loop_state"
-.LASF43:
-	.string	"req_seq"
-.LASF310:
-	.string	"sibling"
-.LASF287:
-	.string	"dm_root_f"
-.LASF321:
-	.string	"enetaddr"
-.LASF221:
-	.string	"UCLASS_PWRSEQ"
-.LASF452:
-	.string	"times"
-.LASF454:
-	.string	"target_freq"
-.LASF380:
-	.string	"of_offset"
-.LASF149:
-	.string	"fit_hdr_fdt"
-.LASF349:
-	.string	"net_restart_wrap"
-.LASF404:
-	.string	"getc"
-.LASF337:
-	.string	"net_ethaddr"
-.LASF42:
-	.string	"flags"
-.LASF437:
-	.string	"cmdtp"
-.LASF126:
-	.string	"ih_type"
-.LASF107:
-	.string	"off_dt_struct"
-.LASF458:
-	.string	"crosstalk"
-.LASF70:
-	.string	"bi_flashoffset"
-.LASF350:
-	.string	"net_boot_file_name"
-.LASF387:
-	.string	"compatible"
-.LASF171:
-	.string	"UCLASS_TEST"
-.LASF119:
-	.string	"ih_time"
-.LASF274:
-	.string	"fb_base"
-.LASF271:
-	.string	"bus_clk"
-.LASF222:
-	.string	"UCLASS_RAM"
-.LASF189:
-	.string	"UCLASS_ETH"
-.LASF32:
-	.string	"node"
-.LASF130:
-	.string	"image_info"
-.LASF408:
-	.string	"console_devices"
-.LASF136:
-	.string	"arch"
-.LASF273:
-	.string	"mem_clk"
-.LASF476:
-	.string	"write_buf_to_ddr"
-.LASF270:
-	.string	"cpu_clk"
-.LASF50:
-	.string	"select_hwpart"
-.LASF342:
-	.string	"net_rx_packets"
-.LASF360:
-	.string	"mem_malloc_start"
-.LASF91:
-	.string	"_datarelro_start_ofs"
-.LASF17:
-	.string	"ulong"
-.LASF122:
-	.string	"ih_ep"
-.LASF61:
-	.string	"lmb_region"
-.LASF448:
-	.string	"do_ddr_test"
-.LASF462:
-	.string	"printf"
-.LASF144:
-	.string	"fit_uname_os"
-.LASF76:
-	.string	"bi_bootflags"
-.LASF339:
-	.string	"net_ip"
-.LASF291:
-	.string	"fdt_size"
-.LASF333:
-	.string	"net_dns_server"
-.LASF353:
-	.string	"net_ping_ip"
-.LASF63:
-	.string	"memory"
-.LASF104:
-	.string	"fdt_header"
-.LASF361:
-	.string	"mem_malloc_end"
-.LASF202:
-	.string	"UCLASS_MAILBOX"
-.LASF156:
-	.string	"rd_end"
-.LASF364:
-	.string	"bind"
-.LASF282:
-	.string	"irq_sp"
-.LASF161:
-	.string	"cmdline_start"
-.LASF328:
-	.string	"index"
-.LASF269:
-	.string	"global_data"
-.LASF400:
-	.string	"stop"
-.LASF396:
-	.string	"per_device_auto_alloc_size"
-.LASF472:
-	.string	"ctrlc"
-.LASF95:
-	.string	"repeatable"
-.LASF229:
-	.string	"UCLASS_SCSI"
-.LASF241:
-	.string	"UCLASS_USB_DEV_GENERIC"
-.LASF203:
-	.string	"UCLASS_MASS_STORAGE"
-.LASF1:
-	.string	"long unsigned int"
-.LASF179:
-	.string	"UCLASS_SIMPLE_BUS"
-.LASF455:
-	.string	"freq"
-.LASF311:
-	.string	"gd_t"
-.LASF334:
-	.string	"net_nis_domain"
-.LASF398:
-	.string	"console_buffer"
-.LASF151:
-	.string	"fit_noffset_fdt"
-.LASF432:
-	.string	"next_adr"
-.LASF423:
-	.string	"wr_value"
-.LASF459:
-	.string	"shift"
-.LASF358:
-	.string	"NETLOOP_FAIL"
-.LASF247:
-	.string	"UCLASS_WDT"
-.LASF260:
-	.string	"timer_reset_value"
-.LASF283:
-	.string	"start_addr_sp"
-.LASF71:
-	.string	"bi_sramstart"
-.LASF26:
-	.string	"_binary_u_boot_bin_end"
-.LASF284:
-	.string	"reloc_off"
-.LASF473:
-	.string	"judge_test_addr"
-.LASF112:
-	.string	"boot_cpuid_phys"
-.LASF259:
-	.string	"lastinc"
-.LASF263:
-	.string	"tlb_fillptr"
-.LASF456:
-	.string	"set_vdd_logic"
-.LASF147:
-	.string	"fit_uname_rd"
-.LASF235:
-	.string	"UCLASS_SYSCON"
-.LASF184:
-	.string	"UCLASS_CPU"
-.LASF142:
-	.string	"fit_uname_cfg"
-.LASF230:
-	.string	"UCLASS_SERIAL"
-.LASF347:
-	.string	"net_our_vlan"
-.LASF303:
-	.string	"serial"
-.LASF365:
-	.string	"probe"
-.LASF182:
-	.string	"UCLASS_BLK"
-.LASF137:
-	.string	"image_info_t"
-.LASF178:
-	.string	"UCLASS_USB_EMUL"
-.LASF439:
-	.string	"argc"
-.LASF261:
-	.string	"tlb_addr"
-.LASF214:
-	.string	"UCLASS_PCI_GENERIC"
-.LASF440:
-	.string	"argv"
-.LASF132:
-	.string	"image_len"
-.LASF77:
-	.string	"bi_ip_addr"
-.LASF216:
-	.string	"UCLASS_PINCONFIG"
-.LASF324:
-	.string	"send"
-.LASF237:
-	.string	"UCLASS_THERMAL"
-.LASF140:
-	.string	"legacy_hdr_os_copy"
-.LASF9:
-	.string	"long long int"
-.LASF417:
-	.string	"TESTCASSMAX"
-.LASF443:
-	.string	"test_times"
-.LASF167:
-	.string	"command_ret_t"
-.LASF290:
-	.string	"new_fdt"
-.LASF22:
-	.string	"___strtok"
-.LASF352:
-	.string	"net_boot_file_expected_size_in_blocks"
-.LASF451:
-	.string	"max_freq"
-.LASF363:
-	.string	"of_match"
-.LASF209:
-	.string	"UCLASS_NVME"
-.LASF264:
-	.string	"tlb_emerg"
-.LASF138:
-	.string	"bootm_headers"
-.LASF470:
-	.string	"strict_strtoul"
-.LASF55:
-	.string	"protect"
-.LASF240:
-	.string	"UCLASS_USB"
-.LASF447:
-	.string	"scan_freq_loop"
-.LASF389:
-	.string	"uclass_driver"
-.LASF250:
-	.string	"UCLASS_RC"
-.LASF294:
-	.string	"timebase_h"
-.LASF295:
-	.string	"timebase_l"
-.LASF187:
-	.string	"UCLASS_DISPLAY"
-.LASF346:
-	.string	"net_null_ethaddr"
-.LASF277:
-	.string	"env_valid"
-.LASF416:
-	.string	"FULLTEST"
-.LASF34:
-	.string	"parent"
-.LASF177:
-	.string	"UCLASS_PCI_EMUL"
-.LASF38:
-	.string	"parent_priv"
-.LASF251:
-	.string	"UCLASS_CHARGE_DISPLAY"
-.LASF315:
-	.string	"load_addr"
-.LASF98:
-	.string	"complete"
-.LASF89:
-	.string	"_datarelrolocal_start_ofs"
-.LASF97:
-	.string	"help"
-.LASF268:
-	.string	"addr"
-.LASF101:
-	.string	"CMD_RET_FAILURE"
-.LASF8:
-	.string	"unsigned int"
-.LASF16:
-	.string	"ushort"
-.LASF320:
-	.string	"eth_device"
-.LASF372:
-	.string	"priv_auto_alloc_size"
-.LASF297:
-	.string	"malloc_limit"
-.LASF218:
-	.string	"UCLASS_PMIC"
-.LASF422:
-	.string	"capacity"
-.LASF139:
-	.string	"legacy_hdr_os"
-.LASF108:
-	.string	"off_dt_strings"
-.LASF312:
-	.string	"monitor_flash_len"
-.LASF204:
-	.string	"UCLASS_MISC"
-.LASF67:
-	.string	"bi_memsize"
-.LASF438:
-	.string	"flag"
-.LASF24:
-	.string	"image_base"
-.LASF236:
-	.string	"UCLASS_SYSRESET"
-.LASF383:
-	.string	"current"
-.LASF191:
-	.string	"UCLASS_FIRMWARE"
-.LASF450:
-	.string	"min_freq"
-.LASF201:
-	.string	"UCLASS_LPC"
-.LASF197:
-	.string	"UCLASS_IDE"
-.LASF405:
-	.string	"list"
-.LASF306:
-	.string	"phandle"
-.LASF300:
-	.string	"video_top"
-.LASF397:
-	.string	"per_device_platdata_auto_alloc_size"
-.LASF165:
-	.string	"bootm_headers_t"
-.LASF73:
-	.string	"bi_arm_freq"
-.LASF224:
-	.string	"UCLASS_REMOTEPROC"
-.LASF465:
-	.string	"data_cpu_2_io"
-.LASF325:
-	.string	"recv"
-.LASF135:
-	.string	"type"
-.LASF146:
-	.string	"fit_hdr_rd"
-.LASF276:
-	.string	"env_addr"
-.LASF72:
-	.string	"bi_sramsize"
-.LASF449:
-	.string	"scan_freq"
-.LASF431:
-	.string	"start_adr"
-.LASF288:
-	.string	"uclass_root"
-.LASF190:
-	.string	"UCLASS_GPIO"
-.LASF219:
-	.string	"UCLASS_PWM"
-.LASF444:
-	.string	"test_banks"
-.LASF58:
-	.string	"long double"
-.LASF278:
-	.string	"ram_top"
-.LASF421:
-	.string	"baseaddr"
-.LASF480:
-	.string	"/home/typ/src/u-boot_gerrit/u-boot-ddr"
-.LASF155:
-	.string	"rd_start"
-.LASF220:
-	.string	"UCLASS_POWER_DOMAIN"
-.LASF223:
-	.string	"UCLASS_REGULATOR"
-.LASF317:
-	.string	"save_size"
-.LASF183:
-	.string	"UCLASS_CLK"
-.LASF31:
-	.string	"uclass_platdata"
-.LASF322:
-	.string	"iobase"
-.LASF429:
-	.string	"random_test"
-.LASF88:
-	.string	"_datarel_start_ofs"
-.LASF265:
-	.string	"pre_serial"
-.LASF128:
-	.string	"ih_name"
-.LASF435:
-	.string	"next_col"
-.LASF124:
-	.string	"ih_os"
-.LASF162:
-	.string	"cmdline_end"
-.LASF343:
-	.string	"net_rx_packet"
-.LASF256:
-	.string	"LOGF_MAX_CATEGORIES"
-.LASF289:
-	.string	"fdt_blob"
-.LASF386:
-	.string	"udevice_id"
-.LASF51:
-	.string	"size"
-.LASF10:
-	.string	"long long unsigned int"
-.LASF395:
-	.string	"destroy"
-.LASF116:
-	.string	"image_header"
-.LASF377:
-	.string	"length"
-.LASF20:
-	.string	"__be32"
-.LASF68:
-	.string	"bi_flashstart"
-.LASF145:
-	.string	"fit_noffset_os"
-.LASF205:
-	.string	"UCLASS_MMC"
-.LASF327:
-	.string	"write_hwaddr"
-.LASF479:
-	.string	"cmd/ddr_tool/ddr_test_code.c"
-.LASF255:
-	.string	"UCLASS_INVALID"
-.LASF471:
-	.string	"data_cpu_2_io_init"
-.LASF94:
-	.string	"maxargs"
-.LASF242:
-	.string	"UCLASS_USB_HUB"
-.LASF414:
-	.string	"DIAGONALSCAN"
-.LASF371:
-	.string	"child_post_remove"
-.LASF93:
-	.string	"cmd_tbl_s"
-.LASF99:
-	.string	"cmd_tbl_t"
-.LASF41:
-	.string	"sibling_node"
-.LASF292:
-	.string	"of_root"
-.LASF461:
-	.string	"memset"
-.LASF57:
-	.string	"flash_info"
-.LASF110:
-	.string	"version"
-.LASF326:
-	.string	"halt"
-.LASF62:
-	.string	"region"
-.LASF114:
-	.string	"size_dt_struct"
-.LASF286:
-	.string	"dm_root"
-.LASF304:
-	.string	"sys_start_tick"
-.LASF308:
-	.string	"properties"
-.LASF207:
-	.string	"UCLASS_MTD"
-.LASF103:
-	.string	"fdt32_t"
-.LASF285:
-	.string	"new_gd"
-.LASF468:
-	.string	"get_print_available_addr"
-.LASF208:
-	.string	"UCLASS_NORTHBRIDGE"
-.LASF78:
-	.string	"bi_enetaddr"
-.LASF477:
-	.string	"malloc"
-.LASF369:
-	.string	"child_post_bind"
-.LASF483:
-	.string	"exit"
-.LASF318:
-	.string	"in_addr"
-.LASF344:
-	.string	"net_rx_packet_len"
-.LASF323:
-	.string	"init"
-.LASF102:
-	.string	"CMD_RET_USAGE"
-.LASF313:
-	.string	"__dtb_dt_begin"
-.LASF225:
-	.string	"UCLASS_RESET"
-.LASF148:
-	.string	"fit_noffset_rd"
-.LASF436:
-	.string	"err_adr"
-.LASF181:
-	.string	"UCLASS_AHCI"
-.LASF12:
-	.string	"phys_size_t"
-.LASF27:
-	.string	"driver"
-.LASF87:
-	.string	"FIQ_STACK_START"
-.LASF163:
-	.string	"verify"
-.LASF381:
-	.string	"ofnode"
-.LASF28:
-	.string	"name"
-.LASF441:
-	.string	"test_case"
-.LASF211:
-	.string	"UCLASS_PANEL_BACKLIGHT"
-.LASF238:
-	.string	"UCLASS_TIMER"
-.LASF233:
-	.string	"UCLASS_SPI_FLASH"
-.LASF424:
-	.string	"reread_val"
-.LASF275:
-	.string	"have_console"
-.LASF81:
-	.string	"bi_busfreq"
-.LASF6:
-	.string	"short int"
-.LASF217:
-	.string	"UCLASS_PINCTRL"
-.LASF227:
-	.string	"UCLASS_RAMDISK"
-.LASF434:
-	.string	"pattern"
-.LASF176:
-	.string	"UCLASS_I2C_EMUL"
-.LASF232:
-	.string	"UCLASS_SPMI"
-.LASF96:
-	.string	"usage"
-.LASF366:
-	.string	"remove"
-.LASF173:
-	.string	"UCLASS_TEST_BUS"
-.LASF316:
-	.string	"save_addr"
-.LASF374:
-	.string	"per_child_auto_alloc_size"
-.LASF463:
-	.string	"flush_dcache_range"
-.LASF413:
-	.string	"CROSSTALK"
-.LASF298:
-	.string	"malloc_ptr"
-.LASF160:
-	.string	"initrd_end"
-.LASF391:
-	.string	"pre_unbind"
-.LASF267:
-	.string	"baudrate"
-.LASF90:
-	.string	"_datarellocal_start_ofs"
-.LASF40:
-	.string	"child_head"
-.LASF257:
-	.string	"arch_global_data"
-.LASF254:
-	.string	"UCLASS_COUNT"
-.LASF399:
-	.string	"stdio_dev"
-.LASF272:
-	.string	"pci_clk"
-.LASF49:
-	.string	"block_drvr"
-.LASF466:
-	.string	"memcpy"
-.LASF53:
-	.string	"flash_id"
-.LASF305:
-	.string	"device_node"
-.LASF280:
-	.string	"ram_size"
-.LASF154:
-	.string	"fit_noffset_setup"
-.LASF115:
-	.string	"working_fdt"
-.LASF336:
-	.string	"net_root_path"
-.LASF188:
-	.string	"UCLASS_DMA"
-.LASF85:
-	.string	"bd_t"
-.LASF319:
-	.string	"s_addr"
-.LASF393:
-	.string	"post_probe"
-.LASF345:
-	.string	"net_bcast_ethaddr"
-.LASF83:
-	.string	"bi_boot_params"
-.LASF19:
-	.string	"uint32_t"
-.LASF362:
-	.string	"mem_malloc_brk"
-.LASF331:
-	.string	"net_gateway"
-.LASF373:
-	.string	"platdata_auto_alloc_size"
-.LASF403:
-	.string	"tstc"
-.LASF66:
-	.string	"bi_memstart"
-.LASF245:
-	.string	"UCLASS_VIDEO_CONSOLE"
-.LASF406:
-	.string	"stdio_devices"
-.LASF329:
-	.string	"eth_current"
-.LASF420:
-	.string	"_u_boot_list_2_cmd_2_ddr_test"
-.LASF368:
-	.string	"ofdata_to_platdata"
-.LASF64:
-	.string	"reserved"
-.LASF410:
-	.string	"CHANGEFREQ"
-.LASF433:
-	.string	"page_size"
-.LASF415:
-	.string	"FASTTEST"
-.LASF409:
-	.string	"cd_count"
-.LASF84:
-	.string	"bi_dram"
-.LASF2:
-	.string	"short unsigned int"
-.LASF105:
-	.string	"magic"
-.LASF152:
-	.string	"fit_hdr_setup"
-.LASF141:
-	.string	"legacy_hdr_valid"
-.LASF411:
-	.string	"SCANFREQ"
-.LASF60:
-	.string	"base"
-.LASF442:
-	.string	"err_case"
-.LASF228:
-	.string	"UCLASS_RTC"
-.LASF258:
-	.string	"timer_rate_hz"
-.LASF52:
-	.string	"sector_count"
-.LASF127:
-	.string	"ih_comp"
-.LASF390:
-	.string	"post_bind"
-.LASF367:
-	.string	"unbind"
-.LASF157:
-	.string	"ft_addr"
-.LASF474:
-	.string	"uclass_get_device"
-.LASF4:
-	.string	"uchar"
-.LASF158:
-	.string	"ft_len"
-.LASF47:
-	.string	"next"
-.LASF388:
-	.string	"data"
-.LASF100:
-	.string	"CMD_RET_SUCCESS"
-.LASF153:
-	.string	"fit_uname_setup"
-.LASF48:
-	.string	"prev"
-.LASF212:
-	.string	"UCLASS_PCH"
-.LASF213:
-	.string	"UCLASS_PCI"
-.LASF332:
-	.string	"net_netmask"
-.LASF33:
-	.string	"driver_data"
-.LASF86:
-	.string	"IRQ_STACK_START"
-.LASF180:
-	.string	"UCLASS_ADC"
-.LASF175:
-	.string	"UCLASS_SPI_EMUL"
-.LASF262:
-	.string	"tlb_size"
-.LASF150:
-	.string	"fit_uname_fdt"
-	.hidden	malloc
-	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
-	.section	.note.GNU-stack,"",@progbits
diff --git a/u-boot/cmd/memtester/ddr_tester_common.c b/u-boot/cmd/ddr_tool/ddr_tool_common.c
similarity index 92%
rename from u-boot/cmd/memtester/ddr_tester_common.c
rename to u-boot/cmd/ddr_tool/ddr_tool_common.c
index 713d1a9..e2faf6a 100644
--- a/u-boot/cmd/memtester/ddr_tester_common.c
+++ b/u-boot/cmd/ddr_tool/ddr_tool_common.c
@@ -5,7 +5,7 @@
 
 #include <common.h>
 #include <power/regulator.h>
-#include "ddr_tester_common.h"
+#include "ddr_tool_common.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -84,6 +84,13 @@
 	for (i = 0; i < max_bank; i++) {
 		start_adr[i] = gd->bd->bi_dram[i].start;
 		length[i] = gd->bd->bi_dram[i].size;
+#if defined(CONFIG_ROCKCHIP_RV1126)
+		/* On RV1126, writing data to 0x00600000 will cause a crash. */
+		if (start_adr[i] == 0 && length[i] > 0x00700000) {
+			start_adr[i] = 0x00700000;
+			length[i] -= 0x00700000;
+		}
+#endif
 	}
 
 	length[max_bank - 1] = (gd->start_addr_sp - RESERVED_SP_SIZE -
diff --git a/u-boot/cmd/memtester/ddr_tester_common.h b/u-boot/cmd/ddr_tool/ddr_tool_common.h
similarity index 81%
rename from u-boot/cmd/memtester/ddr_tester_common.h
rename to u-boot/cmd/ddr_tool/ddr_tool_common.h
index 2ff3fd7..59422b2 100644
--- a/u-boot/cmd/memtester/ddr_tester_common.h
+++ b/u-boot/cmd/ddr_tool/ddr_tool_common.h
@@ -4,8 +4,8 @@
  */
 
 /* Function declaration. */
-#ifndef _CMD_MEMTESTER_DDR_TOOL_COMMON_H
-#define _CMD_MEMTESTER_DDR_TOOL_COMMON_H
+#ifndef __CMD_DDR_TOOL_DDR_TOOL_COMMON_H
+#define __CMD_DDR_TOOL_DDR_TOOL_COMMON_H
 
 /* reserved 1MB for stack */
 #define RESERVED_SP_SIZE		0x100000
@@ -17,4 +17,4 @@
 void get_print_available_addr(ulong *start_adr, ulong *length, int print_en);
 int judge_test_addr(ulong *arg, ulong *start_adr, ulong *length);
 int set_vdd_logic(u32 uv);
-#endif /* _CMD_MEMTESTER_DDR_TOOL_COMMON_H */
+#endif /* __CMD_DDR_TOOL_DDR_TOOL_COMMON_H */
diff --git a/u-boot/cmd/ddr_tool/ddr_tool_mp.S b/u-boot/cmd/ddr_tool/ddr_tool_mp.S
new file mode 100644
index 0000000..ca53486
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/ddr_tool_mp.S
@@ -0,0 +1,171 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
+/*
+ * Copyright (C) 2023 Rockchip Electronics Co., Ltd.
+ */
+
+	.global __sp
+
+	.global secondary_main
+	.global secondary_init
+	.global get_cpu_id
+	.global lock_byte_mutex
+	.global unlock_byte_mutex
+
+#ifndef CONFIG_ARM64
+	.align	7
+vectors_2:
+	ldr	pc, =die_loop	/* reset */
+	ldr	pc, =die_loop	/* undefine */
+	ldr	pc, =die_loop	/* swi */
+	ldr	pc, =die_loop	/* iabort */
+	ldr	pc, =die_loop	/* dabort */
+	ldr	pc, =die_loop	/* reserved */
+	ldr	pc, =die_loop	/* irq */
+	ldr	pc, =die_loop	/* fiq */
+
+	.align	7
+die_loop:
+	b	die_loop
+
+	.align	7
+	.type	secondary_init, %function
+secondary_init:
+	bl	irq_disable
+	bl	icache_invalid
+
+	/* set sp */
+	ldr	r2, =__sp
+	ldr	r1, [r2]
+	bic	r1, r1, #0xf
+	mov	sp, r1
+	bl	icache_invalid
+
+	mrc	p15, 0, r0, c1, c0, 0	/* CP15 C1 System Control Register */
+	bic	r0, r0, #0x2000		/* clear V (bit[13], VBAR) */
+	mcr	p15, 0, r0, c1, c0, 0	/* for remap VBAR */
+	ldr	r0, =vectors_2
+	mcr	p15, 0, r0, c12, c0, 0
+	bl	icache_invalid
+
+	b	secondary_main
+
+irq_disable:
+	mrs	r0, cpsr
+	orr	r0, r0, #0xc0
+	msr	cpsr, r0
+	bx	lr
+
+icache_invalid:
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c5, 0
+	bx	lr
+
+	.type	get_cpu_id, %function
+get_cpu_id:
+	mrc	p15, 0, r0, c0, c0, 5
+	and	r0, r0, #0x3
+	bx	lr
+
+	.align	7
+	.type	lock_byte_mutex, %function
+lock_byte_mutex:
+	mov	r2, #0x1
+try:
+	ldrex	r1, [r0]
+	cmp	r1, #0
+	strexeq	r1, r2, [r0]
+	cmpeq	r1, #0
+	bne	try
+	dmb
+	bx	lr
+
+	.align	7
+	.type	unlock_byte_mutex, %function
+unlock_byte_mutex:
+	dmb
+	mov	r1, #0
+	str	r1, [r0]
+	dsb
+	bx	lr
+#else /* CONFIG_ARM64 */
+	.align	7
+el2_vectors:
+synchronous_sp0:
+	b	secondary_init
+	.align	7
+irq_sp0:
+	b	irq_sp0
+	.align	7
+fiq_sp0:
+	b	fiq_sp0
+	.align	7
+serror_sp0:
+	b	serror_sp0
+	.align	7
+synchronous_spx:
+	b	synchronous_spx
+	.align	7
+irq_spx:
+	b	irq_spx
+	.align	7
+fiq_spx:
+	b	fiq_spx
+	.align	7
+serror_spx:
+	b	serror_spx
+
+	.align	7
+	.type	secondary_init, %function
+secondary_init:
+	bl	irq_disable
+
+	/* set sp */
+	ldr	x2, =__sp
+	ldr	x1, [x2]
+	bic	x1, x1, #0xf
+	mov	sp, x1
+	bl	icache_invalid
+
+	ldr	w0, =el2_vectors
+	msr	vbar_el2, x0
+	bl	icache_invalid
+
+	bl	secondary_main
+
+	.type	irq_disable, %function
+irq_disable:
+	msr	daifset, #0x3
+	ic	iallu
+	ret
+
+	.type	icache_invalid, %function
+icache_invalid:
+	ic	iallu
+	ret
+
+	.align	7
+	.type	lock_byte_mutex, %function
+lock_byte_mutex:
+	ldxrb	w1, [x0]
+	cmp	w1, #1
+	bne	1f
+	wfe
+	b	lock_byte_mutex
+1:
+	mov	x1, #1
+	stxrb	w2, w1, [x0]
+	cmp	w2, #0
+	bne	lock_byte_mutex
+	dmb	sy
+	ret
+
+	.align	7
+	.type	unlock_byte_mutex, %function
+unlock_byte_mutex:
+	dmb	sy
+	mov	x1, #0
+	strb	w1, [x0]
+	dsb	sy
+	sev
+	ret
+#endif	/* #ifdef CONFIG_ARM */
diff --git a/u-boot/cmd/memtester/io_map.c b/u-boot/cmd/ddr_tool/io_map.c
similarity index 100%
rename from u-boot/cmd/memtester/io_map.c
rename to u-boot/cmd/ddr_tool/io_map.c
diff --git a/u-boot/cmd/memtester/io_map.h b/u-boot/cmd/ddr_tool/io_map.h
similarity index 64%
rename from u-boot/cmd/memtester/io_map.h
rename to u-boot/cmd/ddr_tool/io_map.h
index 3b17440..5ec4994 100644
--- a/u-boot/cmd/memtester/io_map.h
+++ b/u-boot/cmd/ddr_tool/io_map.h
@@ -3,12 +3,12 @@
  * Copyright (C) 2019 Rockchip Electronics Co., Ltd.
  */
 
-#ifndef _CMD_MEMTESTER_IO_MAP_H
-#define _CMD_MEMTESTER_IO_MAP_H
+#ifndef __CMD_DDR_TOOL_MEMTESTER_IO_MAP_H
+#define __CMD_DDR_TOOL_MEMTESTER_IO_MAP_H
 
 #define CPU_2_IO_ALIGN_LEN		(16)	/* 16 byte */
 
 int data_cpu_2_io(void *p, u32 len);
 void data_cpu_2_io_init(void);
 
-#endif /* _CMD_MEMTESTER_IO_MAP_H */
+#endif /* __CMD_DDR_TOOL_MEMTESTER_IO_MAP_H */
diff --git a/u-boot/cmd/ddr_tool/memtester/Makefile b/u-boot/cmd/ddr_tool/memtester/Makefile
new file mode 100644
index 0000000..7e26994
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/memtester/Makefile
@@ -0,0 +1,8 @@
+#
+# (C) Copyright 2023 Rockchip Electronics Co., Ltd.
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-$(CONFIG_CMD_MEMTESTER) += memtester.o
+obj-$(CONFIG_CMD_MEMTESTER) += tests.o
diff --git a/u-boot/cmd/memtester/memtester.c b/u-boot/cmd/ddr_tool/memtester/memtester.c
similarity index 98%
rename from u-boot/cmd/memtester/memtester.c
rename to u-boot/cmd/ddr_tool/memtester/memtester.c
index 7936c03..37aaa5c 100644
--- a/u-boot/cmd/memtester/memtester.c
+++ b/u-boot/cmd/ddr_tool/memtester/memtester.c
@@ -20,8 +20,8 @@
 #include "sizes.h"
 #include "types.h"
 #include "tests.h"
-#include "io_map.h"
-#include "ddr_tester_common.h"
+#include "../ddr_tool_common.h"
+#include "../io_map.h"
 
 #define EXIT_FAIL_NONSTARTER    0x01
 #define EXIT_FAIL_ADDRESSLINES  0x02
diff --git a/u-boot/cmd/memtester/memtester.h b/u-boot/cmd/ddr_tool/memtester/memtester.h
similarity index 86%
rename from u-boot/cmd/memtester/memtester.h
rename to u-boot/cmd/ddr_tool/memtester/memtester.h
index 5275a8c..8e5d91f 100644
--- a/u-boot/cmd/memtester/memtester.h
+++ b/u-boot/cmd/ddr_tool/memtester/memtester.h
@@ -13,8 +13,8 @@
  * See other comments in that file.
  *
  */
-#ifndef _CMD_MEMTESTER_H
-#define _CMD_MEMTESTER_H
+#ifndef __CMD_DDR_TOOL_MEMTESTER_MEMTESTER_H
+#define __CMD_DDR_TOOL_MEMTESTER_MEMTESTER_H
 #include <linux/types.h>
 
 /* extern declarations. */
@@ -25,4 +25,4 @@
 int doing_memtester(unsigned long *arg, unsigned long testenable,
 		    unsigned long loops, unsigned long err_exit,
 		    unsigned long fix_bit, unsigned long fix_level);
-#endif /* _CMD_MEMTESTER_H */
+#endif /* __CMD_DDR_TOOL_MEMTESTER_MEMTESTER_H */
diff --git a/u-boot/cmd/memtester/sizes.h b/u-boot/cmd/ddr_tool/memtester/sizes.h
similarity index 86%
rename from u-boot/cmd/memtester/sizes.h
rename to u-boot/cmd/ddr_tool/memtester/sizes.h
index 8c86e11..71d1988 100644
--- a/u-boot/cmd/memtester/sizes.h
+++ b/u-boot/cmd/ddr_tool/memtester/sizes.h
@@ -12,8 +12,8 @@
  * This file contains some macro definitions for handling 32/64 bit platforms.
  *
  */
-#ifndef __MEMTESTER_SIZES_H
-#define __MEMTESTER_SIZES_H
+#ifndef __CMD_DDR_TOOL_MEMTESTER_SIZES_H
+#define __CMD_DDR_TOOL_MEMTESTER_SIZES_H
 
 #include <common.h>
 
@@ -26,4 +26,4 @@
 #define CHECKERBOARD2 0xaaaaaaaa
 #define UL_BYTE(x) ((x | x << 8 | x << 16 | x << 24))
 
-#endif /* __MEMTESTER_SIZES_H */
+#endif /* __CMD_DDR_TOOL_MEMTESTER_SIZES_H */
diff --git a/u-boot/cmd/memtester/tests.c b/u-boot/cmd/ddr_tool/memtester/tests.c
similarity index 99%
rename from u-boot/cmd/memtester/tests.c
rename to u-boot/cmd/ddr_tool/memtester/tests.c
index 4f27c1c..b4aa288 100644
--- a/u-boot/cmd/memtester/tests.c
+++ b/u-boot/cmd/ddr_tool/memtester/tests.c
@@ -17,7 +17,7 @@
 #include "memtester.h"
 #include "sizes.h"
 #include "types.h"
-#include "io_map.h"
+#include "../io_map.h"
 
 union {
 	unsigned char bytes[UL_LEN / 8];
diff --git a/u-boot/cmd/memtester/tests.h b/u-boot/cmd/ddr_tool/memtester/tests.h
similarity index 94%
rename from u-boot/cmd/memtester/tests.h
rename to u-boot/cmd/ddr_tool/memtester/tests.h
index b3ddcae..5082dbc 100644
--- a/u-boot/cmd/memtester/tests.h
+++ b/u-boot/cmd/ddr_tool/memtester/tests.h
@@ -15,6 +15,9 @@
  *
  */
 
+#ifndef __CMD_DDR_TOOL_MEMTESTER_TESTS_H
+#define __CMD_DDR_TOOL_MEMTESTER_TESTS_H
+
 /* Function declaration. */
 
 int test_stuck_address(u32v *bufa, size_t count);
@@ -54,3 +57,5 @@
 int test_16bit_wide_random(u32v *bufa, u32v *bufb, size_t count,
 			   ul fix_bit, ul fix_level);
 #endif
+
+#endif /* __CMD_DDR_TOOL_MEMTESTER_TESTS_H */
diff --git a/u-boot/cmd/memtester/types.h b/u-boot/cmd/ddr_tool/memtester/types.h
similarity index 100%
rename from u-boot/cmd/memtester/types.h
rename to u-boot/cmd/ddr_tool/memtester/types.h
diff --git a/u-boot/cmd/ddr_tool/stressapptest/Makefile b/u-boot/cmd/ddr_tool/stressapptest/Makefile
new file mode 100644
index 0000000..94e332f
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/stressapptest/Makefile
@@ -0,0 +1,7 @@
+#
+# (C) Copyright 2023 Rockchip Electronics Co., Ltd.
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-$(CONFIG_CMD_STRESSAPPTEST) += stressapptest.o
diff --git a/u-boot/cmd/ddr_tool/stressapptest/stressapptest.c b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.c
new file mode 100644
index 0000000..35b493c
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.c
@@ -0,0 +1,1207 @@
+// Copyright 2006 Google Inc. All Rights Reserved.
+/* Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* This is stressapptest for Rockchip platform in U-Boot, the design idea and
+ * the patterns are from code.google.com/p/stressapptest.
+ */
+
+#include <common.h>
+#include <amp.h>
+#include <div64.h>
+#include <malloc.h>
+#include <asm/arch/rockchip_smccc.h>
+#include "stressapptest.h"
+#include "../ddr_tool_common.h"
+
+#define __version__ "v1.2.0 20230619"
+
+#if defined(CONFIG_ARM64)
+/* Float operation in TOOLCHAIN_ARM32 will cause the compile error */
+#define WARM_CPU
+#endif
+
+#define PAT_NUM			26
+#define PATTERN_LIST_SIZE	(PAT_NUM * 2 * 4)
+
+#define CPU_NUM_MAX		16
+
+static u32 walking_1_data[] = {
+	0x00000001, 0x00000002, 0x00000004, 0x00000008,
+	0x00000010, 0x00000020, 0x00000040, 0x00000080,
+	0x00000100, 0x00000200, 0x00000400, 0x00000800,
+	0x00001000, 0x00002000, 0x00004000, 0x00008000,
+	0x00010000, 0x00020000, 0x00040000, 0x00080000,
+	0x00100000, 0x00200000, 0x00400000, 0x00800000,
+	0x01000000, 0x02000000, 0x04000000, 0x08000000,
+	0x10000000, 0x20000000, 0x40000000, 0x80000000,
+	0x40000000, 0x20000000, 0x10000000, 0x08000000,
+	0x04000000, 0x02000000, 0x01000000, 0x00800000,
+	0x00400000, 0x00200000, 0x00100000, 0x00080000,
+	0x00040000, 0x00020000, 0x00010000, 0x00008000,
+	0x00004000, 0x00002000, 0x00001000, 0x00000800,
+	0x00000400, 0x00000200, 0x00000100, 0x00000080,
+	0x00000040, 0x00000020, 0x00000010, 0x00000008,
+	0x00000004, 0x00000002, 0x00000001, 0x00000000
+};
+
+static struct pat walking_1 = {
+	"walking_1",
+	walking_1_data,
+	ARRAY_SIZE(walking_1_data) - 1,	/* mask */
+	{1, 1, 2, 1}	/* weight */
+};
+
+static u32 walking_1_x16_data[] =   {
+	0x00020001, 0x00080004, 0x00200010, 0x00800040,
+	0x02000100, 0x08000400, 0x20001000, 0x80004000,
+	0x20004000, 0x08001000, 0x02000400, 0x00800100,
+	0x00200040, 0x00080010, 0x00020004, 0x00000001
+};
+
+static struct pat walking_1_x16 = {
+	"walking_1_x16",
+	walking_1_x16_data,
+	ARRAY_SIZE(walking_1_x16_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* Weight for choosing 32/64/128/256 bit wide of this pattern */
+	/* Reuse for walking_0_x16, because of invert */
+};
+
+static u32 walking_1_x16_repeat_data[] =   {
+	0x00010001, 0x00020002, 0x00040004, 0x00080008,
+	0x00100010, 0x00200020, 0x00400040, 0x00800080,
+	0x01000100, 0x02000200, 0x04000400, 0x08000800,
+	0x10001000, 0x20002000, 0x40004000, 0x80008000,
+	0x40004000, 0x20002000, 0x10001000, 0x08000800,
+	0x04000400, 0x02000200, 0x01000100, 0x00800080,
+	0x00400040, 0x00200020, 0x00100010, 0x00080008,
+	0x00040004, 0x00020002, 0x00010001, 0x00000000
+};
+
+static struct pat walking_1_x16_repeat = {
+	"walking_1_x16_repeat",
+	walking_1_x16_repeat_data,
+	ARRAY_SIZE(walking_1_x16_repeat_data) - 1,	/* mask */
+	{2, 4, 2, 0}	/* Weight for choosing 32/64/128/256 bit wide of this pattern */
+	/* Reuse for walking_0_x16_repeat, because of invert */
+};
+
+static u32 walking_inv_1_data[] = {
+	0x00000001, 0xfffffffe, 0x00000002, 0xfffffffd,
+	0x00000004, 0xfffffffb, 0x00000008, 0xfffffff7,
+	0x00000010, 0xffffffef, 0x00000020, 0xffffffdf,
+	0x00000040, 0xffffffbf, 0x00000080, 0xffffff7f,
+	0x00000100, 0xfffffeff, 0x00000200, 0xfffffdff,
+	0x00000400, 0xfffffbff, 0x00000800, 0xfffff7ff,
+	0x00001000, 0xffffefff, 0x00002000, 0xffffdfff,
+	0x00004000, 0xffffbfff, 0x00008000, 0xffff7fff,
+	0x00010000, 0xfffeffff, 0x00020000, 0xfffdffff,
+	0x00040000, 0xfffbffff, 0x00080000, 0xfff7ffff,
+	0x00100000, 0xffefffff, 0x00200000, 0xffdfffff,
+	0x00400000, 0xffbfffff, 0x00800000, 0xff7fffff,
+	0x01000000, 0xfeffffff, 0x02000000, 0xfdffffff,
+	0x04000000, 0xfbffffff, 0x08000000, 0xf7ffffff,
+	0x10000000, 0xefffffff, 0x20000000, 0xdfffffff,
+	0x40000000, 0xbfffffff, 0x80000000, 0x7fffffff,
+	0x40000000, 0xbfffffff, 0x20000000, 0xdfffffff,
+	0x10000000, 0xefffffff, 0x08000000, 0xf7ffffff,
+	0x04000000, 0xfbffffff, 0x02000000, 0xfdffffff,
+	0x01000000, 0xfeffffff, 0x00800000, 0xff7fffff,
+	0x00400000, 0xffbfffff, 0x00200000, 0xffdfffff,
+	0x00100000, 0xffefffff, 0x00080000, 0xfff7ffff,
+	0x00040000, 0xfffbffff, 0x00020000, 0xfffdffff,
+	0x00010000, 0xfffeffff, 0x00008000, 0xffff7fff,
+	0x00004000, 0xffffbfff, 0x00002000, 0xffffdfff,
+	0x00001000, 0xffffefff, 0x00000800, 0xfffff7ff,
+	0x00000400, 0xfffffbff, 0x00000200, 0xfffffdff,
+	0x00000100, 0xfffffeff, 0x00000080, 0xffffff7f,
+	0x00000040, 0xffffffbf, 0x00000020, 0xffffffdf,
+	0x00000010, 0xffffffef, 0x00000008, 0xfffffff7,
+	0x00000004, 0xfffffffb, 0x00000002, 0xfffffffd,
+	0x00000001, 0xfffffffe, 0x00000000, 0xffffffff
+};
+
+static struct pat walking_inv_1 = {
+	"walking_inv_1",
+	walking_inv_1_data,
+	ARRAY_SIZE(walking_inv_1_data) - 1,	/* mask */
+	{2, 2, 5, 5}	/* weight */
+};
+
+static u32 walking_inv_1_x16_data[] = {
+	0xfffe0001, 0xfffd0002, 0xfffb0004, 0xfff70008,
+	0xffef0010, 0xffdf0020, 0xffbf0040, 0xff7f0080,
+	0xfeff0100, 0xfdff0200, 0xfbff0400, 0xf7ff0800,
+	0xefff1000, 0xdfff2000, 0xbfff4000, 0x7fff8000,
+	0xbfff4000, 0xdfff2000, 0xefff1000, 0xf7ff0800,
+	0xfbff0400, 0xfdff0200, 0xfeff0100, 0xff7f0080,
+	0xffbf0040, 0xffdf0020, 0xffef0010, 0xfff70008,
+	0xfffb0004, 0xfffd0002, 0xfffe0001, 0xffff0000
+};
+
+static struct pat walking_inv_1_x16 = {
+	"walking_inv_1_x16",
+	walking_inv_1_x16_data,
+	ARRAY_SIZE(walking_inv_1_x16_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 walking_inv_1_x16_repeat_data[] = {
+	0x00010001, 0xfffefffe, 0x00020002, 0xfffdfffd,
+	0x00040004, 0xfffbfffb, 0x00080008, 0xfff7fff7,
+	0x00100010, 0xffefffef, 0x00200020, 0xffdfffdf,
+	0x00400040, 0xffbfffbf, 0x00800080, 0xff7fff7f,
+	0x01000100, 0xfefffeff, 0x02000200, 0xfdfffdff,
+	0x04000400, 0xfbfffbff, 0x08000800, 0xf7fff7ff,
+	0x10001000, 0xefffefff, 0x20002000, 0xdfffdfff,
+	0x40004000, 0xbfffbfff, 0x80008000, 0x7fff7fff,
+	0x40004000, 0xbfffbfff, 0x20002000, 0xdfffdfff,
+	0x10001000, 0xefffefff, 0x08000800, 0xf7fff7ff,
+	0x04000400, 0xfbfffbff, 0x02000200, 0xfdfffdff,
+	0x01000100, 0xfefffeff, 0x00800080, 0xff7fff7f,
+	0x00400040, 0xffbfffbf, 0x00200020, 0xffdfffdf,
+	0x00100010, 0xffefffef, 0x00080008, 0xfff7fff7,
+	0x00040004, 0xfffbfffb, 0x00020002, 0xfffdfffd,
+	0x00010001, 0xfffefffe, 0x00000000, 0xffffffff
+};
+
+static struct pat walking_inv_1_x16_repeat = {
+	"walking_inv_1_x16_repeat",
+	walking_inv_1_x16_repeat_data,
+	ARRAY_SIZE(walking_inv_1_x16_repeat_data) - 1,	/* mask */
+	{2, 5, 5, 0}	/* weight */
+};
+
+static u32 walking_0_data[] = {
+	0xfffffffe, 0xfffffffd, 0xfffffffb, 0xfffffff7,
+	0xffffffef, 0xffffffdf, 0xffffffbf, 0xffffff7f,
+	0xfffffeff, 0xfffffdff, 0xfffffbff, 0xfffff7ff,
+	0xffffefff, 0xffffdfff, 0xffffbfff, 0xffff7fff,
+	0xfffeffff, 0xfffdffff, 0xfffbffff, 0xfff7ffff,
+	0xffefffff, 0xffdfffff, 0xffbfffff, 0xff7fffff,
+	0xfeffffff, 0xfdffffff, 0xfbffffff, 0xf7ffffff,
+	0xefffffff, 0xdfffffff, 0xbfffffff, 0x7fffffff,
+	0xbfffffff, 0xdfffffff, 0xefffffff, 0xf7ffffff,
+	0xfbffffff, 0xfdffffff, 0xfeffffff, 0xff7fffff,
+	0xffbfffff, 0xffdfffff, 0xffefffff, 0xfff7ffff,
+	0xfffbffff, 0xfffdffff, 0xfffeffff, 0xffff7fff,
+	0xffffbfff, 0xffffdfff, 0xffffefff, 0xfffff7ff,
+	0xfffffbff, 0xfffffdff, 0xfffffeff, 0xffffff7f,
+	0xffffffbf, 0xffffffdf, 0xffffffef, 0xfffffff7,
+	0xfffffffb, 0xfffffffd, 0xfffffffe, 0xffffffff
+};
+
+static struct pat walking_0 = {
+	"walking_0",
+	walking_0_data,
+	ARRAY_SIZE(walking_0_data) - 1,	/* mask */
+	{1, 1, 2, 1}	/* weight */
+};
+
+static u32 one_zero_data[] = {0x00000000, 0xffffffff};
+
+static struct pat one_zero = {
+	"one_zero",
+	one_zero_data,
+	ARRAY_SIZE(one_zero_data) - 1,	/* mask */
+	{5, 5, 15, 5}	/* weight */
+};
+
+static unsigned int one_zero_x16_data[] = {0x0000ffff, 0x0000ffff};
+
+static struct pat one_zero_x16 = {
+	"one_zero_x16",
+	one_zero_x16_data,
+	ARRAY_SIZE(one_zero_x16_data) - 1,	/* mask */
+	{5, 0, 0, 0}	/* weight */
+};
+
+static u32 just_0_data[] = {0x00000000, 0x00000000};
+
+static struct pat just_0 = {
+	"just_0",
+	just_0_data,
+	ARRAY_SIZE(just_0_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 just_1_data[] = {0xffffffff, 0xffffffff};
+
+static struct pat just_1 = {
+	"just_1",
+	just_1_data,
+	ARRAY_SIZE(just_1_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 just_5_data[] = {0x55555555, 0x55555555};
+
+static struct pat just_5 = {
+	"just_5",
+	just_5_data,
+	ARRAY_SIZE(just_5_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 just_a_data[] = {0xaaaaaaaa, 0xaaaaaaaa};
+
+static struct pat just_a = {
+	"just_a",
+	just_a_data,
+	ARRAY_SIZE(just_a_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 five_a_data[] = {0x55555555, 0xaaaaaaaa};
+
+static struct pat five_a = {
+	"five_a",
+	five_a_data,
+	ARRAY_SIZE(five_a_data) - 1,	/* mask */
+	{1, 1, 1, 1}	/* weight */
+};
+
+static unsigned int five_a_x16_data[] = {0x5555aaaa, 0x5555aaaa};
+
+static struct pat five_a_x16 = {
+	"five_a_x16",
+	five_a_x16_data,
+	ARRAY_SIZE(five_a_x16_data) - 1,	/* mask */
+	{1, 0, 0, 0}	/* weight */
+};
+
+static u32 five_a8_data[] = {
+	0x5aa5a55a, 0xa55a5aa5, 0xa55a5aa5, 0x5aa5a55a
+};
+
+static struct pat five_a8 = {
+	"five_a8",
+	five_a8_data,
+	ARRAY_SIZE(five_a8_data) - 1,	/* mask */
+	{1, 1, 1, 1}	/* weight */
+};
+
+static u32 five_a8_x16_data[] = {0x5aa5a55a, 0xa55a5aa5};
+
+static struct pat five_a8_x16 = {
+	"five_a8_x16",
+	five_a8_x16_data,
+	ARRAY_SIZE(five_a8_x16_data) - 1,	/* mask */
+	{1, 0, 0, 0}	/* weight */
+};
+
+static unsigned int five_a8_x16_repeat_data[] = {
+	0x5aa55aa5, 0xa55aa55a, 0xa55aa55a, 0x5aa55aa5
+};
+
+static struct pat five_a8_x16_repeat = {
+	"five_a8_x16_repeat",
+	five_a8_x16_repeat_data,
+	ARRAY_SIZE(five_a8_x16_repeat_data) - 1,	/* mask */
+	{1, 1, 1, 0}	/* weight */
+};
+
+static u32 long_8b10b_data[] = {0x16161616, 0x16161616};
+
+static struct pat long_8b10b = {
+	"long_8b10b",
+	long_8b10b_data,
+	ARRAY_SIZE(long_8b10b_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 short_8b10b_data[] = {0xb5b5b5b5, 0xb5b5b5b5};
+
+static struct pat short_8b10b = {
+	"short_8b10b",
+	short_8b10b_data,
+	ARRAY_SIZE(short_8b10b_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 checker_8b10b_data[] = {0xb5b5b5b5, 0x4a4a4a4a};
+
+static struct pat checker_8b10b = {
+	"checker_8b10b",
+	checker_8b10b_data,
+	ARRAY_SIZE(checker_8b10b_data) - 1,	/* mask */
+	{1, 0, 1, 1}	/* weight */
+};
+
+static u32 checker_8b10b_x16_data[] = {0xb5b54a4a, 0xb5b54a4a};
+
+static struct pat checker_8b10b_x16 = {
+	"checker_8b10b_x16",
+	checker_8b10b_x16_data,
+	ARRAY_SIZE(checker_8b10b_x16_data) - 1,	/* mask */
+	{1, 0, 0, 0}	/* weight */
+};
+
+static u32 five_7_data[] = {0x55555557, 0x55575555};
+
+static struct pat five_7 = {
+	"five_7",
+	five_7_data,
+	ARRAY_SIZE(five_7_data) - 1,	/* mask */
+	{0, 2, 0, 0}	/* weight */
+};
+
+static u32 five_7_x16_data[] = {0x55575557, 0x57555755};
+
+static struct pat five_7_x16 = {
+	"five_7_x16",
+	five_7_x16_data,
+	ARRAY_SIZE(five_7_x16_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static u32 zero2_fd_data[] = {0x00020002, 0xfffdfffd};
+
+static struct pat zero2_fd = {
+	"zero2_fd",
+	zero2_fd_data,
+	ARRAY_SIZE(zero2_fd_data) - 1,	/* mask */
+	{0, 2, 0, 0}	/* weight */
+};
+
+static u32 zero2_fd_x16_data[] = {0x02020202, 0xfdfdfdfd};
+
+static struct pat zero2_fd_x16 = {
+	"zero2_fd_x16",
+	zero2_fd_x16_data,
+	ARRAY_SIZE(zero2_fd_x16_data) - 1,	/* mask */
+	{2, 0, 0, 0}	/* weight */
+};
+
+static struct pat *pat_array[] = {
+	&walking_1,
+	&walking_1_x16,
+	&walking_1_x16_repeat,
+	&walking_inv_1,
+	&walking_inv_1_x16,
+	&walking_inv_1_x16_repeat,
+	&walking_0,
+	&one_zero,
+	&one_zero_x16,
+	&just_0,
+	&just_1,
+	&just_5,
+	&just_a,
+	&five_a,
+	&five_a_x16,
+	&five_a8,
+	&five_a8_x16,
+	&five_a8_x16_repeat,
+	&long_8b10b,
+	&short_8b10b,
+	&checker_8b10b,
+	&checker_8b10b_x16,
+	&five_7,
+	&five_7_x16,
+	&zero2_fd,
+	&zero2_fd_x16
+};
+
+static u32 cpu_copy_err[CPU_NUM_MAX];
+static u32 cpu_inv_err[CPU_NUM_MAX];
+
+static u64 start_time_us;
+static u64 test_time_us;
+
+static bool cpu_init_finish[CPU_NUM_MAX];
+static bool cpu_test_finish[CPU_NUM_MAX];
+static bool pattern_page_init_finish;
+
+#if (CPU_NUM_MAX > 1)
+static ulong test_count = 0;
+static ulong __gd;	/* set r9/x18 of secondary cpu to gd addr */
+#endif
+ulong __sp;		/* set sp of secondary cpu */
+
+u32 print_mutex;	/* 0: unlock, 1: lock */
+
+static u64 get_time_us(void)
+{
+	return lldiv(get_ticks(), CONFIG_SYS_HZ_CLOCK / (CONFIG_SYS_HZ * 1000));
+}
+
+static u64 run_time_us(void)
+{
+	return get_time_us() - start_time_us;
+}
+
+static void print_time_stamp(void)
+{
+	u64 time_us;
+
+	time_us = run_time_us();
+
+	printf("[%5d.%06d] ", (u32)(time_us / 1000000), (u32)(time_us % 1000000));
+}
+
+static u32 pattern_get(struct pattern *pattern, u32 offset)
+{
+	u32 ret;
+
+	ret = pattern->pat->data_array[(offset >> pattern->repeat) &
+				       pattern->pat->mask];
+
+	return pattern->inv ? ~ret : ret;
+}
+
+static void pattern_adler_sum_calc(struct pattern *pattern,
+				   struct stressapptest_params *sat)
+{
+	int i = 0;
+	u64 a1 = 1;
+	u64 b1 = 0;
+	u64 a2 = 1;
+	u64 b2 = 0;
+
+	while (i < sat->block_size_byte / sizeof(u32)) {
+		a1 += (u64)pattern_get(pattern, i++);
+		b1 += a1;
+		a1 += pattern_get(pattern, i++);
+		b1 += a1;
+
+		a2 += (u64)pattern_get(pattern, i++);
+		b2 += a2;
+		a2 += pattern_get(pattern, i++);
+		b2 += a2;
+	}
+
+	pattern->adler_sum.a1 = a1;
+	pattern->adler_sum.b1 = b1;
+	pattern->adler_sum.a2 = a2;
+	pattern->adler_sum.b2 = b2;
+}
+
+static void pattern_list_init(struct pattern *pattern_list,
+			      struct stressapptest_params *sat)
+{
+	u32 weight_count = 0;
+	int k = 0;
+
+	for (int i = 0; i < PAT_NUM; i++) {
+		for (int j = 0; j < 8; j++) {
+			pattern_list[k].pat = pat_array[i];
+			pattern_list[k].inv = j % 2;
+			pattern_list[k].repeat = j / 2;
+			pattern_list[k].weight = pattern_list[k].pat->weight[j / 2];
+			pattern_adler_sum_calc(&pattern_list[k], sat);
+			weight_count += pattern_list[k].weight;
+			k++;
+		}
+	}
+
+	sat->weight_count = weight_count;
+}
+
+static u32 get_max_page_num(ulong page_size_byte)
+{
+	ulong start_adr[CONFIG_NR_DRAM_BANKS], length[CONFIG_NR_DRAM_BANKS];
+	u32 page_num = 0;
+
+	get_print_available_addr(start_adr, length, 0);
+
+	page_num = 0;
+	for (int i = 0; i < ARRAY_SIZE(start_adr) || i < ARRAY_SIZE(length); i++) {
+		if ((start_adr[i] == 0 && length[i] == 0))
+			break;
+		page_num += (u32)(length[i] / page_size_byte);
+	}
+
+	return page_num;
+}
+
+static int get_page_addr(struct page *page_list,
+			 struct stressapptest_params *sat)
+{
+	ulong start_adr[CONFIG_NR_DRAM_BANKS], length[CONFIG_NR_DRAM_BANKS];
+	ulong used_length;
+	u32 page = 0;
+
+	get_print_available_addr(start_adr, length, 0);
+
+	printf("Address for test:\n	Start         End         Length\n");
+	for (int i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+		if ((start_adr[i] == 0 && length[i] == 0) || page >= sat->page_num)
+			break;
+		if (start_adr[i] + length[i] < sat->total_start_addr)
+			continue;
+		if (start_adr[i] < sat->total_start_addr) {
+			length[i] -= sat->total_start_addr - start_adr[i];
+			start_adr[i] = sat->total_start_addr;
+		}
+
+		used_length = 0;
+		while (page < sat->page_num &&
+		       length[i] >= used_length + sat->page_size_byte) {
+			page_list[page].base_addr = (void *)(start_adr[i] + used_length);
+			used_length += sat->page_size_byte;
+			page++;
+		}
+		printf("	0x%09lx - 0x%09lx 0x%09lx\n",
+		       start_adr[i], start_adr[i] + used_length, used_length);
+	}
+
+	printf("page_num = %d, page_size = 0x%lx, total_test_size = 0x%lx\n",
+	       page, sat->page_size_byte, sat->page_size_byte * page);
+
+	if (sat->total_test_size_mb == 0) {
+		/* No arg for total_test_size_mb, test all available space by default. */
+		sat->page_num = page;
+	} else if (page < sat->page_num || page < sat->cpu_num * 4) {
+		printf("ERROR: Cannot get enough pages to test.\n");
+		printf("Please decrease page_size or test_size\n");
+
+		return -1;
+	}
+
+	return 0;
+}
+
+static void page_init_valid(struct page *page, struct pattern *pattern_list,
+			    struct stressapptest_params *sat)
+{
+	int target;
+	int i = 0;
+	u64 *mem;
+
+	target = (rand() % sat->weight_count) + 1;
+	do {
+		target -= pattern_list[i++].weight;
+		if (target <= 0)
+			break;
+	} while (i < PATTERN_LIST_SIZE);
+	page->pattern = &pattern_list[--i];
+	page->valid = 1;
+
+	mem = (u64 *)page->base_addr;
+	for (i = 0; i < sat->page_size_byte / sizeof(u64); i++)
+		mem[i] = (u64)pattern_get(page->pattern, i * 2) |
+			 (u64)pattern_get(page->pattern, i * 2 + 1) << 32;
+}
+
+static void page_init_empty(struct page *page)
+{
+	page->valid = 0;
+}
+
+static void page_init(struct pattern *pattern_list,
+		      struct stressapptest_params *sat)
+{
+	int i, cpu;
+	u32 empty_page_num;
+
+	for (cpu = 0; cpu < sat->cpu_num; cpu++) {
+		empty_page_num = 0;
+		for (i = cpu; i < sat->page_num; i += sat->cpu_num) {
+			if (rand() % 5 < 3) {
+				page_list[i].valid = 1;
+			} else {
+				page_list[i].valid = 0;
+				empty_page_num++;
+			}
+		}
+		while (empty_page_num >= sat->page_num / sat->cpu_num / 2 && i > 0) {
+			i -= sat->cpu_num;
+			if (page_list[i].valid == 0) {
+				page_list[i].valid = 1;
+				empty_page_num--;
+			}
+		}
+		i = cpu;
+		while (empty_page_num < 2 && i < sat->page_num) {
+			if (page_list[i].valid == 1) {
+				page_list[i].valid = 0;
+				empty_page_num++;
+			}
+			i += sat->cpu_num;
+		}
+	}
+
+	for (i = 0; i < sat->page_num; i++) {
+		if (page_list[i].valid == 1)
+			page_init_valid(&page_list[i], pattern_list, sat);
+		else
+			page_init_empty(&page_list[i]);
+	}
+	flush_dcache_all();
+}
+
+static u32 page_rand_pick(struct page *page_list, bool valid,
+			  struct stressapptest_params *sat, u8 cpu_id)
+{
+	u32 pick;
+
+	pick = rand() % sat->page_num;
+	pick = pick / sat->cpu_num * sat->cpu_num + cpu_id;
+	if (pick >= sat->page_num)
+		pick = cpu_id;
+
+	while (page_list[pick].valid != valid) {
+		pick += sat->cpu_num;
+		if (pick >= sat->page_num)
+			pick = cpu_id;
+	}
+
+	return pick;
+}
+
+static u32 block_mis_search(void *dst_addr, struct pattern *src_pattern, char *item,
+			    struct stressapptest_params *sat, u8 cpu_id)
+{
+	u32 *dst_mem;
+	u32 read, reread, expected;
+	u32 err = 0;
+	u32 *print_addr;
+	int i, j;
+
+	dst_mem = (u32 *)dst_addr;
+
+	for (i = 0; i < sat->block_size_byte / sizeof(u32); i++) {
+		read = dst_mem[i];
+		expected = pattern_get(src_pattern, i);
+
+		if (read != expected) {
+			flush_dcache_range((ulong)&dst_mem[i], (ulong)&dst_mem[i + 1]);
+			reread = dst_mem[i];
+
+			lock_byte_mutex(&print_mutex);
+
+			print_time_stamp();
+			printf("%s Hardware Error: miscompare on CPU %d at 0x%lx:\n",
+			       item, cpu_id, (ulong)&dst_mem[i]);
+			printf("	read:    0x%08x\n", read);
+			printf("	reread:  0x%08x(reread^read:0x%08x)\n",
+			       reread, reread ^ read);
+			printf("	expected:0x%08x(expected^read:0x%08x)\n",
+			       expected, expected ^ read);
+			printf("	\'%s%s%d\'", src_pattern->pat->name,
+							  src_pattern->inv ? "~" : "",
+							  32 << src_pattern->repeat);
+			if (reread == expected)
+				printf(" read error");
+			printf("\n");
+
+			/* Dump data around the error address */
+			print_addr = &dst_mem[i] - 64;
+			for (j = 0; j < 128; j += 8)
+				printf("  [0x%010lx] 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
+				       (ulong)(print_addr + j),
+				       *(print_addr + j), *(print_addr + j + 1),
+				       *(print_addr + j + 2), *(print_addr + j + 3),
+				       *(print_addr + j + 4), *(print_addr + j + 5),
+				       *(print_addr + j + 6), *(print_addr + j + 7));
+
+			unlock_byte_mutex(&print_mutex);
+
+			/* fix the error */
+			dst_mem[i] = expected;
+			err++;
+		}
+	}
+	flush_dcache_all();
+
+	if (err == 0) {
+		lock_byte_mutex(&print_mutex);
+		printf("%s ERROR detected but cannot find mismatch data (maybe read error).\n", item);
+		unlock_byte_mutex(&print_mutex);
+	}
+
+	return err;
+}
+
+static u32 block_inv_check(void *dst_addr, struct pattern *src_pattern,
+			   struct stressapptest_params *sat, u8 cpu_id)
+{
+	u32 *dst_mem;
+	u32 err = 0;
+	int i = 0;
+#if defined(WARM_CPU)
+	double a, b, c, d;
+#endif
+
+	struct adler_sum adler_sum = {
+		1, 0, 1, 0
+	};
+
+	dst_mem = (u32 *)dst_addr;
+
+#if defined(WARM_CPU)
+	a = 2.0 * dst_mem[0];
+	b = 5.0 * dst_mem[0];
+	c = 7.0 * dst_mem[0];
+	d = 9.0 * dst_mem[0];
+#endif
+
+	while (i < sat->block_size_byte / sizeof(u32)) {
+		adler_sum.a1 += dst_mem[i++];
+		adler_sum.b1 += adler_sum.a1;
+		adler_sum.a1 += dst_mem[i++];
+		adler_sum.b1 += adler_sum.a1;
+
+#if defined(WARM_CPU)
+		a = a * b;
+		b = b + c;
+#endif
+
+		adler_sum.a2 += dst_mem[i++];
+		adler_sum.b2 += adler_sum.a2;
+		adler_sum.a2 += dst_mem[i++];
+		adler_sum.b2 += adler_sum.a2;
+#if defined(WARM_CPU)
+		c = c * d;
+		d = d + d;
+#endif
+	}
+
+#if defined(WARM_CPU)
+	d = a + b + c + d;
+	if (d == 1.0)
+		/* Reference the result so that it can't be discarded by the compiler. */
+		printf("This will probably never happen.\n");
+#endif
+
+	if (adler_sum.a1 != src_pattern->adler_sum.a1 ||
+	    adler_sum.b1 != src_pattern->adler_sum.b1 ||
+	    adler_sum.a2 != src_pattern->adler_sum.a2 ||
+	    adler_sum.b2 != src_pattern->adler_sum.b2)
+		err = block_mis_search(dst_addr, src_pattern, "Inv", sat, cpu_id);
+
+	return err;
+}
+
+static void page_inv_up(void *src_addr, struct stressapptest_params *sat)
+{
+	void *dst_addr = src_addr;
+	uint data;
+	uint *dst_mem;
+
+	for (int i = 0; i < sat->block_num; i++) {
+		dst_mem = (uint *)dst_addr;
+		for (int j = 0; j < sat->block_size_byte / sizeof(uint); j++) {
+			data = dst_mem[j];
+			dst_mem[j] = ~data;
+		}
+		dst_addr += sat->block_size_byte;
+		flush_dcache_all();
+	}
+}
+
+static void page_inv_down(void *src_addr, struct stressapptest_params *sat)
+{
+	void *dst_addr = src_addr;
+	uint data;
+	uint *dst_mem;
+
+	dst_addr += sat->block_size_byte * (sat->block_num - 1);
+
+	for (int i = sat->block_num - 1; i >= 0; i--) {
+		dst_mem = (uint *)dst_addr;
+		for (int j = sat->block_size_byte / sizeof(uint) - 1; j >= 0; j--) {
+			data = dst_mem[j];
+			dst_mem[j] = ~data;
+		}
+		dst_addr -= sat->block_size_byte;
+		flush_dcache_all();
+	}
+}
+
+static u32 page_inv(struct stressapptest_params *sat, u8 cpu_id)
+{
+	u32 src;
+	void *dst_block_addr;
+	u32 err = 0;
+
+	src = page_rand_pick(page_list, 1, sat, cpu_id);	/* pick a valid page */
+	dst_block_addr = page_list[src].base_addr;
+
+	for (int i = 0; i < 4; i++) {
+		if (rand() % 2 == 0)
+			page_inv_up(page_list[src].base_addr, sat);
+		else
+			page_inv_down(page_list[src].base_addr, sat);
+	}
+
+	for (int i = 0; i < sat->block_num; i++) {
+		err += block_inv_check(dst_block_addr, page_list[src].pattern, sat, cpu_id);
+		dst_block_addr += sat->block_size_byte;
+	}
+
+	flush_dcache_all();
+
+	return err;
+}
+
+static u32 block_copy_check(void *dst_addr, struct adler_sum *adler_sum,
+			    struct pattern *src_pattern, struct stressapptest_params *sat,
+			    u8 cpu_id)
+{
+	u32 err = 0;
+
+	if (adler_sum->a1 != src_pattern->adler_sum.a1 ||
+	    adler_sum->b1 != src_pattern->adler_sum.b1 ||
+	    adler_sum->a2 != src_pattern->adler_sum.a2 ||
+	    adler_sum->b2 != src_pattern->adler_sum.b2)
+		err = block_mis_search(dst_addr, src_pattern, "Copy", sat, cpu_id);
+
+	return err;
+}
+
+static u32 block_copy(void *dst_addr, void *src_addr,
+		      struct pattern *src_pattern,
+		      struct stressapptest_params *sat, u8 cpu_id)
+{
+	u64 *dst_mem;
+	u64 *src_mem;
+	u64 data;
+	int i = 0;
+#if defined(WARM_CPU)
+	double a, b, c, d;
+#endif
+
+	struct adler_sum adler_sum = {
+		1, 0, 1, 0
+	};
+
+	dst_mem = (u64 *)dst_addr;
+	src_mem = (u64 *)src_addr;
+
+#if defined(WARM_CPU)
+	a = 2.0 * src_mem[0];
+	b = 5.0 * src_mem[0];
+	c = 7.0 * src_mem[0];
+	d = 9.0 * src_mem[0];
+#endif
+
+	while (i < sat->block_size_byte / sizeof(u64)) {
+		data = src_mem[i];
+		adler_sum.a1 += data & 0xffffffff;
+		adler_sum.b1 += adler_sum.a1;
+		adler_sum.a1 += data >> 32;
+		adler_sum.b1 += adler_sum.a1;
+		dst_mem[i] = data;
+		i++;
+
+#if defined(WARM_CPU)
+		a = a * b;
+		b = b + c;
+#endif
+
+		data = src_mem[i];
+		adler_sum.a2 += data & 0xffffffff;
+		adler_sum.b2 += adler_sum.a2;
+		adler_sum.a2 += data >> 32;
+		adler_sum.b2 += adler_sum.a2;
+		dst_mem[i] = data;
+		i++;
+
+#if defined(WARM_CPU)
+		c = c * d;
+		d = d + d;
+#endif
+	}
+
+	flush_dcache_all();
+
+#if defined(WARM_CPU)
+	d = a + b + c + d;
+	if (d == 1.0)
+		/* Reference the result so that it can't be discarded by the compiler. */
+		printf("This will probably never happen.\n");
+#endif
+
+	return block_copy_check(dst_addr, &adler_sum, src_pattern, sat, cpu_id);
+}
+
+static u32 page_copy(struct stressapptest_params *sat, u8 cpu_id)
+{
+	u32 dst;
+	u32 src;
+	void *dst_block_addr;
+	void *src_block_addr;
+	u32 err = 0;
+
+	dst = page_rand_pick(page_list, 0, sat, cpu_id);	/* pick a empty page */
+	dst_block_addr = page_list[dst].base_addr;
+	src = page_rand_pick(page_list, 1, sat, cpu_id);	/* pick a valid page */
+	src_block_addr = page_list[src].base_addr;
+	flush_dcache_all();
+
+	for (int i = 0; i < sat->block_num; i++) {
+		err += block_copy(dst_block_addr, src_block_addr,
+				  page_list[src].pattern, sat, cpu_id);
+		dst_block_addr += sat->block_size_byte;
+		src_block_addr += sat->block_size_byte;
+	}
+
+	page_list[dst].pattern = page_list[src].pattern;
+	page_list[dst].valid = 1;
+	page_list[src].valid = 0;
+	flush_dcache_all();
+
+	return err;
+}
+
+void secondary_main(void)
+{
+#if (CPU_NUM_MAX > 1)
+	u8 cpu_id;
+	ulong test = 0;
+
+#ifndef CONFIG_ARM64
+	asm volatile("mov r9, %0" : : "r" (__gd));	/* set r9 to gd addr */
+#else
+	asm volatile("mov x18, %0" : : "r" (__gd));	/* set x18 to gd addr */
+#endif
+	dcache_enable();
+	icache_enable();
+
+	udelay(100);
+
+	flush_dcache_all();
+
+	cpu_id = sat.cpu_num;
+	cpu_init_finish[cpu_id] = 1;
+	printf("CPU%d start OK.\n", cpu_id);
+
+	while (pattern_page_init_finish == 0) {
+		udelay(100);
+		flush_dcache_all();
+	}
+
+	while (1) {
+		udelay(100);
+		flush_dcache_all();
+		while (test < test_count) {
+			cpu_test_finish[cpu_id] = 0;
+			flush_dcache_all();
+			while (run_time_us() < test_time_us) {
+				if (rand() % 2 == 0)
+					cpu_copy_err[cpu_id] += page_copy(&sat, cpu_id);
+				else
+					cpu_inv_err[cpu_id] += page_inv(&sat, cpu_id);
+			}
+			test++;
+			cpu_test_finish[cpu_id] = 1;
+			flush_dcache_all();
+		}
+	}
+#else
+	return;
+#endif
+}
+
+static int doing_stressapptest(void)
+{
+	int i;
+	u32 pre_10s;
+	u32 now_10s;
+
+	struct pattern pattern_list[PATTERN_LIST_SIZE];
+	void *page_info;
+
+	u32 all_copy_err = 0;
+	u32 all_inv_err = 0;
+	u32 cpu_no_response_err = 0;
+
+	int ret = CMD_RET_SUCCESS;
+
+	for (i = 0; i < CPU_NUM_MAX; i++) {
+		cpu_copy_err[i] = 0;
+		cpu_inv_err[i] = 0;
+		cpu_init_finish[i] = 0;
+		cpu_test_finish[i] = 0;
+	}
+	pattern_page_init_finish = 0;
+	print_mutex = 0;
+	asm volatile("clrex");
+
+#if (CPU_NUM_MAX > 1)
+	if (test_count == 0) {
+		__gd = (ulong)gd;
+		asm volatile("mov %0, sp" : "=r" (__sp));
+		printf("CPU0 sp is at 0x%lx now.\n", __sp);
+		__sp &= ~(ulong)0xffff;
+		for (sat.cpu_num = 1; sat.cpu_num < CPU_NUM_MAX; sat.cpu_num++) {
+			__sp -= 0x10000;
+			flush_dcache_all();
+			if (psci_cpu_on(sat.cpu_num, (ulong)secondary_init) == 0) {
+				mdelay(10);
+				printf("Calling CPU%d, sp = 0x%lx\n", sat.cpu_num, __sp);
+			} else {
+				break;
+			}
+			while (cpu_init_finish[sat.cpu_num] == 0) {
+				udelay(1000);
+				flush_dcache_all();
+			}
+		}
+	}
+#else
+	sat.cpu_num = 1;
+#endif
+
+	if (sat.total_test_size_mb == 0)
+		sat.page_num = get_max_page_num(sat.page_size_byte);
+	else
+		sat.page_num = (sat.total_test_size_mb << 20) / sat.page_size_byte;
+	sat.block_num = sat.page_size_byte / sat.block_size_byte;
+
+	udelay(100);
+
+	page_info = malloc(sizeof(struct page) * sat.page_num);
+	if (page_info == 0) {
+		printf("ERROR: StressAppTest fail to malloc.\n");
+		printf("Please try increasing CONFIG_SYS_MALLOC_LEN in include/configs/rxxxxx_common.h.\n");
+		ret = CMD_RET_FAILURE;
+		goto out;
+	}
+	page_list = (struct page *)page_info;
+
+	if (get_page_addr(page_list, &sat) < 0) {
+		ret = CMD_RET_FAILURE;
+		goto out;
+	}
+
+	pattern_list_init(pattern_list, &sat);
+	page_init(pattern_list, &sat);
+
+#if (CPU_NUM_MAX > 1)
+	if (sat.cpu_num > 1) {
+		pattern_page_init_finish = 1;
+		test_count++;
+		flush_dcache_all();
+	}
+#endif
+
+	pre_10s = (u32)(run_time_us() / 1000000 / 10);
+	lock_byte_mutex(&print_mutex);
+	print_time_stamp();
+	printf("Start StressAppTest in U-Boot:\n");
+	unlock_byte_mutex(&print_mutex);
+
+	while (run_time_us() < test_time_us) {
+		if (rand() % 2 == 0)
+			cpu_copy_err[0] += page_copy(&sat, 0);
+		else
+			cpu_inv_err[0] += page_inv(&sat, 0);
+
+		/* Print every 10 seconds */
+		now_10s = (u32)(run_time_us() / 1000000 / 10);
+		if (now_10s > pre_10s) {
+			pre_10s = now_10s;
+			lock_byte_mutex(&print_mutex);
+			print_time_stamp();
+			printf("Seconds remaining: %d\n", (u32)(test_time_us / 1000000 - now_10s * 10));
+			unlock_byte_mutex(&print_mutex);
+		}
+	}
+
+#if (CPU_NUM_MAX > 1)
+	for (i = 1; i < sat.cpu_num; i++) {
+		while (cpu_test_finish[i] == 0) {
+			if ((u32)(run_time_us() / 1000000 / 10) > pre_10s + 6) {
+				/* wait for secondary CPU in 60s */
+				lock_byte_mutex(&print_mutex);
+				print_time_stamp();
+				printf("ERROR: Cannot wait for CPU%d to finish!\n", i);
+				unlock_byte_mutex(&print_mutex);
+				cpu_no_response_err++;
+				break;
+			}
+			mdelay(1);
+			flush_dcache_all();
+		}
+	}
+#endif
+
+	for (i = 0; i < sat.cpu_num; i++) {
+		all_copy_err += cpu_copy_err[i];
+		all_inv_err += cpu_inv_err[i];
+	}
+	print_time_stamp();
+	printf("StressAppTest Result: ");
+	if (all_copy_err == 0 && all_inv_err == 0 && cpu_no_response_err == 0)
+		printf("Pass.\n");
+	else
+		printf("FAIL!\nStressAppTest detects %d copy errors, %d inv errors.\n",
+		       all_copy_err, all_inv_err);
+
+out:
+	free(page_info);
+
+	return ret;
+}
+
+static int do_stressapptest(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+	ulong test_time_sec = 20;
+	ulong page_size_kb = 1024;
+
+	sat.total_test_size_mb = 0;
+	sat.block_size_byte = 4096;
+	sat.total_start_addr = 0x0;
+
+	printf("StressAppTest in U-Boot, " __version__ "\n");
+
+	if (argc > 1) {
+		if (strict_strtoul(argv[1], 0, &test_time_sec) < 0)
+			return CMD_RET_USAGE;
+		if (test_time_sec < 1)
+			test_time_sec = 20;
+	}
+	if (argc > 2) {
+		if (strict_strtoul(argv[2], 0, &sat.total_test_size_mb) < 0)
+			return CMD_RET_USAGE;
+		if (sat.total_test_size_mb < 1)
+			sat.total_test_size_mb = 0;
+	}
+	if (argc > 3) {
+		if (strict_strtoul(argv[3], 0, &sat.total_start_addr) < 0)
+			return CMD_RET_USAGE;
+		if (sat.total_start_addr < 0x1)
+			sat.total_start_addr = 0x0;
+	}
+	if (argc > 4) {
+		if (strict_strtoul(argv[4], 0, &page_size_kb) < 0)
+			return CMD_RET_USAGE;
+		if (page_size_kb < 1)
+			page_size_kb = 1024;
+	}
+
+	sat.page_size_byte = page_size_kb << 10;
+
+	start_time_us = get_time_us();
+	test_time_us = (u64)test_time_sec * 1000000;
+
+	/* Change rand seed. If not do this, rand() would be same after boot.*/
+	srand((unsigned int)(start_time_us & 0xffffffff));
+
+	return doing_stressapptest();
+}
+
+U_BOOT_CMD(stressapptest,	5,	1,	do_stressapptest,
+	   "StressAppTest for Rockchip\n",
+	   "\narg1: test time in second, default value is 20s.\n"
+	   "arg2: test size in MB, default value is all available space.\n"
+	   "arg3: start addr for test.\n"
+	   "arg4: test page size in kB, default value is 1024kB(1MB).\n"
+	   "example:\n"
+	   "	stressapptest: test for 20s, test size is all available space, each page size is 1MB.\n"
+	   "	stressapptest 43200 64: test for 12h, test size is 64MB, each page size is 1MB (64 pages).\n"
+	   "	stressapptest 86400 1024 0x80000000: test for 24h, test size is 1024MB, start addr for test is 0x80000000, each page size is 1MB (1024 pages).\n"
+	   "	stressapptest 43200 16 0x40000000 512: test for 12h, test size is 16MB, start addr for test is 0x40000000, each page size is 512kB (32 pages).\n"
+);
diff --git a/u-boot/cmd/ddr_tool/stressapptest/stressapptest.h b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.h
new file mode 100644
index 0000000..e1e8fb7
--- /dev/null
+++ b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.h
@@ -0,0 +1,70 @@
+/* Copyright 2006 Google Inc. All Rights Reserved. */
+/* Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* This is stressapptest for Rockchip platform in U-Boot, the design idea and
+ * the patterns are from code.google.com/p/stressapptest.
+ */
+
+#ifndef __CMD_DDR_TOOL_STRESSAPPTEST_STRESSAPPTEST_H
+#define __CMD_DDR_TOOL_STRESSAPPTEST_STRESSAPPTEST_H
+
+struct stressapptest_params {
+	ulong total_start_addr;
+	ulong total_test_size_mb;
+	/* total_test_size = page_size * page_num */
+	ulong page_size_byte;
+	u32 page_num;
+	/* page_size = block_size * block_num */
+	u32 block_size_byte;
+	u32 block_num;
+
+	u32 weight_count;
+
+	u8 cpu_num;
+} sat;
+
+struct pat {
+	const char *name;
+	const unsigned int *data_array;
+	/* mask = size - 1, So data_array[index & mask] is always valid. */
+	const unsigned int mask;
+	const unsigned int weight[4];	/* Weighted frequency of this pattern. */
+};
+
+struct adler_sum {
+	u64 a1;
+	u64 b1;
+	u64 a2;
+	u64 b2;
+};
+
+struct pattern {
+	struct pat *pat;
+	bool inv;
+	u32 repeat;
+	u32 weight;
+	struct adler_sum adler_sum;
+};
+
+struct page {
+	void *base_addr;
+	struct pattern *pattern;
+	bool valid;	/* 1: valid, 0: empty */
+} *page_list;
+
+extern void secondary_init(void);
+extern void lock_byte_mutex(u32 *flag);
+extern u32 unlock_byte_mutex(u32 *flag);
+
+#endif /* __CMD_DDR_TOOL_STRESSAPPTEST_STRESSAPPTEST_H */
diff --git a/u-boot/cmd/memtester/Makefile b/u-boot/cmd/memtester/Makefile
deleted file mode 100644
index 6a4347a..0000000
--- a/u-boot/cmd/memtester/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-obj-$(CONFIG_CMD_MEMTESTER) += tests.o
-obj-$(CONFIG_CMD_MEMTESTER) += memtester.o
-obj-$(CONFIG_CMD_MEMTESTER) += io_map.o
-obj-$(CONFIG_CMD_MEMTESTER) += ddr_tester_common.o
diff --git a/u-boot/cmd/mmc.c b/u-boot/cmd/mmc.c
index 0813330..ef6321f 100644
--- a/u-boot/cmd/mmc.c
+++ b/u-boot/cmd/mmc.c
@@ -129,6 +129,7 @@
 static int do_mmc_test_secure_storage(cmd_tbl_t *cmdtp,
 				      int flag, int argc, char * const argv[])
 {
+#ifdef CONFIG_MMC
 	struct mmc *mmc;
 
 	if (curr_device < 0) {
@@ -143,7 +144,8 @@
 
 	mmc = init_mmc_device(curr_device, false);
 	if (!mmc)
-		return CMD_RET_FAILURE;
+		printf("No mmc device\n");
+#endif
 
 	int i, count = 100;
 
diff --git a/u-boot/cmd/mtd.c b/u-boot/cmd/mtd.c
index 31ef7be..1f7542e 100644
--- a/u-boot/cmd/mtd.c
+++ b/u-boot/cmd/mtd.c
@@ -13,6 +13,10 @@
 #include <mapmem.h>
 #include <mtd.h>
 
+#define DEV_NAME_MAX_LENGTH	0x40
+static char g_devname[DEV_NAME_MAX_LENGTH];
+static struct mtd_info *g_mtd;
+
 static uint mtd_len_to_pages(struct mtd_info *mtd, u64 len)
 {
 	do_div(len, mtd->writesize);
@@ -244,14 +248,20 @@
 		return CMD_RET_USAGE;
 
 	mtd_name = argv[2];
-	mtd_probe_devices();
-	mtd = get_mtd_device_nm(mtd_name);
-	if (IS_ERR_OR_NULL(mtd)) {
-		printf("MTD device %s not found, ret %ld\n",
-		       mtd_name, PTR_ERR(mtd));
-		return CMD_RET_FAILURE;
+	if (!strncmp(mtd_name, g_devname, strlen(mtd_name)) && g_mtd) {
+		mtd = g_mtd;
+	} else {
+		mtd_probe_devices();
+		mtd = get_mtd_device_nm(mtd_name);
+		if (IS_ERR_OR_NULL(mtd)) {
+			printf("MTD device %s not found, ret %ld\n",
+			       mtd_name, PTR_ERR(mtd));
+			return CMD_RET_FAILURE;
+		}
+		put_mtd_device(mtd);
+		g_mtd = mtd;
+		strncpy(g_devname, mtd_name, strlen(mtd_name));
 	}
-	put_mtd_device(mtd);
 
 	argc -= 3;
 	argv += 3;
diff --git a/u-boot/cmd/pci.c b/u-boot/cmd/pci.c
index b8c799f..6eecd69 100644
--- a/u-boot/cmd/pci.c
+++ b/u-boot/cmd/pci.c
@@ -47,7 +47,6 @@
 	return pci_byte_size(size) * 2;
 }
 
-#ifdef CONFIG_DM_PCI
 static void pci_show_regs(struct udevice *dev, struct pci_reg_info *regs)
 {
 	for (; regs->name; regs++) {
@@ -59,41 +58,8 @@
 		       pci_field_width(regs->size), val);
 	}
 }
-#else
-static unsigned long pci_read_config(pci_dev_t dev, int offset,
-				     enum pci_size_t size)
-{
-	u32 val32;
-	u16 val16;
-	u8 val8;
 
-	switch (size) {
-	case PCI_SIZE_8:
-		pci_read_config_byte(dev, offset, &val8);
-		return val8;
-	case PCI_SIZE_16:
-		pci_read_config_word(dev, offset, &val16);
-		return val16;
-	case PCI_SIZE_32:
-	default:
-		pci_read_config_dword(dev, offset, &val32);
-		return val32;
-	}
-}
-
-static void pci_show_regs(pci_dev_t dev, struct pci_reg_info *regs)
-{
-	for (; regs->name; regs++) {
-		printf("  %s =%*s%#.*lx\n", regs->name,
-		       (int)(28 - strlen(regs->name)), "",
-		       pci_field_width(regs->size),
-		       pci_read_config(dev, regs->offset, regs->size));
-	}
-}
-#endif
-
-#ifdef CONFIG_DM_PCI
-int pci_bar_show(struct udevice *dev)
+static int pci_bar_show(struct udevice *dev)
 {
 	u8 header_type;
 	int bar_cnt, bar_id, mem_type;
@@ -105,9 +71,14 @@
 	int prefetchable;
 
 	dm_pci_read_config8(dev, PCI_HEADER_TYPE, &header_type);
+	header_type &= 0x7f;
 
 	if (header_type == PCI_HEADER_TYPE_CARDBUS) {
 		printf("CardBus doesn't support BARs\n");
+		return -ENOSYS;
+	} else if (header_type != PCI_HEADER_TYPE_NORMAL &&
+		   header_type != PCI_HEADER_TYPE_BRIDGE) {
+		printf("unknown header type\n");
 		return -ENOSYS;
 	}
 
@@ -149,7 +120,7 @@
 
 		if ((!is_64 && size_low) || (is_64 && size)) {
 			size = ~size + 1;
-			printf(" %d   %#016llx  %#016llx  %d     %s   %s\n",
+			printf(" %d   %#018llx  %#018llx  %d     %s   %s\n",
 			       bar_id, (unsigned long long)base,
 			       (unsigned long long)size, is_64 ? 64 : 32,
 			       is_io ? "I/O" : "MEM",
@@ -162,7 +133,6 @@
 
 	return 0;
 }
-#endif
 
 static struct pci_reg_info regs_start[] = {
 	{ "vendor ID", PCI_SIZE_16, PCI_VENDOR_ID },
@@ -258,29 +228,18 @@
  *
  * @dev: Bus+Device+Function number
  */
-#ifdef CONFIG_DM_PCI
-void pci_header_show(struct udevice *dev)
-#else
-void pci_header_show(pci_dev_t dev)
-#endif
+static void pci_header_show(struct udevice *dev)
 {
-#ifdef CONFIG_DM_PCI
 	unsigned long class, header_type;
 
 	dm_pci_read_config(dev, PCI_CLASS_CODE, &class, PCI_SIZE_8);
 	dm_pci_read_config(dev, PCI_HEADER_TYPE, &header_type, PCI_SIZE_8);
-#else
-	u8 class, header_type;
-
-	pci_read_config_byte(dev, PCI_CLASS_CODE, &class);
-	pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);
-#endif
 	pci_show_regs(dev, regs_start);
 	printf("  class code =                  0x%.2x (%s)\n", (int)class,
 	       pci_class_str(class));
 	pci_show_regs(dev, regs_rest);
 
-	switch (header_type & 0x03) {
+	switch (header_type & 0x7f) {
 	case PCI_HEADER_TYPE_NORMAL:	/* "normal" PCI device */
 		pci_show_regs(dev, regs_normal);
 		break;
@@ -297,17 +256,14 @@
     }
 }
 
-void pciinfo_header(int busnum, bool short_listing)
+static void pciinfo_header(bool short_listing)
 {
-	printf("Scanning PCI devices on bus %d\n", busnum);
-
 	if (short_listing) {
 		printf("BusDevFun  VendorId   DeviceId   Device Class       Sub-Class\n");
 		printf("_____________________________________________________________\n");
 	}
 }
 
-#ifdef CONFIG_DM_PCI
 /**
  * pci_header_show_brief() - Show the short-form PCI device header
  *
@@ -330,11 +286,15 @@
 	       pci_class_str(class), subclass);
 }
 
-static void pciinfo(struct udevice *bus, bool short_listing)
+static void pciinfo(struct udevice *bus, bool short_listing, bool multi)
 {
 	struct udevice *dev;
 
-	pciinfo_header(bus->seq, short_listing);
+	if (!multi)
+		printf("Scanning PCI devices on bus %d\n", bus->seq);
+
+	if (!multi || bus->seq == 0)
+		pciinfo_header(short_listing);
 
 	for (device_find_first_child(bus, &dev);
 	     dev;
@@ -353,102 +313,6 @@
 		}
 	}
 }
-
-#else
-
-/**
- * pci_header_show_brief() - Show the short-form PCI device header
- *
- * Reads and prints the header of the specified PCI device in short form.
- *
- * @dev: Bus+Device+Function number
- */
-void pci_header_show_brief(pci_dev_t dev)
-{
-	u16 vendor, device;
-	u8 class, subclass;
-
-	pci_read_config_word(dev, PCI_VENDOR_ID, &vendor);
-	pci_read_config_word(dev, PCI_DEVICE_ID, &device);
-	pci_read_config_byte(dev, PCI_CLASS_CODE, &class);
-	pci_read_config_byte(dev, PCI_CLASS_SUB_CODE, &subclass);
-
-	printf("0x%.4x     0x%.4x     %-23s 0x%.2x\n",
-	       vendor, device,
-	       pci_class_str(class), subclass);
-}
-
-/**
- * pciinfo() - Show a list of devices on the PCI bus
- *
- * Show information about devices on PCI bus. Depending on @short_pci_listing
- * the output will be more or less exhaustive.
- *
- * @bus_num: The number of the bus to be scanned
- * @short_pci_listing: true to use short form, showing only a brief header
- * for each device
- */
-void pciinfo(int bus_num, int short_pci_listing)
-{
-	struct pci_controller *hose = pci_bus_to_hose(bus_num);
-	int device;
-	int function;
-	unsigned char header_type;
-	unsigned short vendor_id;
-	pci_dev_t dev;
-	int ret;
-
-	if (!hose)
-		return;
-
-	pciinfo_header(bus_num, short_pci_listing);
-
-	for (device = 0; device < PCI_MAX_PCI_DEVICES; device++) {
-		header_type = 0;
-		vendor_id = 0;
-		for (function = 0; function < PCI_MAX_PCI_FUNCTIONS;
-		     function++) {
-			/*
-			 * If this is not a multi-function device, we skip
-			 * the rest.
-			 */
-			if (function && !(header_type & 0x80))
-				break;
-
-			dev = PCI_BDF(bus_num, device, function);
-
-			if (pci_skip_dev(hose, dev))
-				continue;
-
-			ret = pci_read_config_word(dev, PCI_VENDOR_ID,
-						   &vendor_id);
-			if (ret)
-				goto error;
-			if ((vendor_id == 0xFFFF) || (vendor_id == 0x0000))
-				continue;
-
-			if (!function) {
-				pci_read_config_byte(dev, PCI_HEADER_TYPE,
-						     &header_type);
-			}
-
-			if (short_pci_listing) {
-				printf("%02x.%02x.%02x   ", bus_num, device,
-				       function);
-				pci_header_show_brief(dev);
-			} else {
-				printf("\nFound PCI device %02x.%02x.%02x:\n",
-				       bus_num, device, function);
-				pci_header_show(dev);
-			}
-		}
-	}
-
-	return;
-error:
-	printf("Cannot read bus configuration: %d\n", ret);
-}
-#endif
 
 /**
  * get_pci_dev() - Convert the "bus.device.function" identifier into a number
@@ -481,13 +345,8 @@
 	return PCI_BDF(bdfs[0], bdfs[1], bdfs[2]);
 }
 
-#ifdef CONFIG_DM_PCI
 static int pci_cfg_display(struct udevice *dev, ulong addr,
 			   enum pci_size_t size, ulong length)
-#else
-static int pci_cfg_display(pci_dev_t bdf, ulong addr, enum pci_size_t size,
-			   ulong length)
-#endif
 {
 #define DISP_LINE_LEN	16
 	ulong i, nbytes, linebytes;
@@ -508,11 +367,7 @@
 		for (i = 0; i < linebytes; i += byte_size) {
 			unsigned long val;
 
-#ifdef CONFIG_DM_PCI
 			dm_pci_read_config(dev, addr, &val, size);
-#else
-			val = pci_read_config(bdf, addr, size);
-#endif
 			printf(" %0*lx", pci_field_width(size), val);
 			addr += byte_size;
 		}
@@ -527,31 +382,8 @@
 	return (rc);
 }
 
-#ifndef CONFIG_DM_PCI
-static int pci_cfg_write (pci_dev_t bdf, ulong addr, ulong size, ulong value)
-{
-	if (size == 4) {
-		pci_write_config_dword(bdf, addr, value);
-	}
-	else if (size == 2) {
-		ushort val = value & 0xffff;
-		pci_write_config_word(bdf, addr, val);
-	}
-	else {
-		u_char val = value & 0xff;
-		pci_write_config_byte(bdf, addr, val);
-	}
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_DM_PCI
 static int pci_cfg_modify(struct udevice *dev, ulong addr, ulong size,
 			  ulong value, int incrflag)
-#else
-static int pci_cfg_modify(pci_dev_t bdf, ulong addr, ulong size, ulong value,
-			  int incrflag)
-#endif
 {
 	ulong	i;
 	int	nbytes;
@@ -562,11 +394,7 @@
 	 */
 	do {
 		printf("%08lx:", addr);
-#ifdef CONFIG_DM_PCI
 		dm_pci_read_config(dev, addr, &val, size);
-#else
-		val = pci_read_config(bdf, addr, size);
-#endif
 		printf(" %0*lx", pci_field_width(size), val);
 
 		nbytes = cli_readline(" ? ");
@@ -593,11 +421,7 @@
 				/* good enough to not time out
 				 */
 				bootretry_reset_cmd_timeout();
-#ifdef CONFIG_DM_PCI
 				dm_pci_write_config(dev, addr, i, size);
-#else
-				pci_cfg_write(bdf, addr, size, i);
-#endif
 				if (incrflag)
 					addr += size;
 			}
@@ -607,7 +431,6 @@
 	return 0;
 }
 
-#ifdef CONFIG_DM_PCI
 static const struct pci_flag_info {
 	uint flag;
 	const char *name;
@@ -621,7 +444,7 @@
 
 static void pci_show_regions(struct udevice *bus)
 {
-	struct pci_controller *hose = dev_get_uclass_priv(bus);
+	struct pci_controller *hose = dev_get_uclass_priv(pci_get_controller(bus));
 	const struct pci_region *reg;
 	int i, j;
 
@@ -630,10 +453,11 @@
 		return;
 	}
 
-	printf("#   %-16s %-16s %-16s  %s\n", "Bus start", "Phys start", "Size",
+	printf("Buses %02x-%02x\n", hose->first_busno, hose->last_busno);
+	printf("#   %-18s %-18s %-18s  %s\n", "Bus start", "Phys start", "Size",
 	       "Flags");
 	for (i = 0, reg = hose->regions; i < hose->region_count; i++, reg++) {
-		printf("%d   %#016llx %#016llx %#016llx  ", i,
+		printf("%d   %#018llx %#018llx %#018llx  ", i,
 		       (unsigned long long)reg->bus_start,
 		       (unsigned long long)reg->phys_start,
 		       (unsigned long long)reg->size);
@@ -646,7 +470,6 @@
 		printf("\n");
 	}
 }
-#endif
 
 /* PCI Configuration Space access commands
  *
@@ -660,15 +483,12 @@
 {
 	ulong addr = 0, value = 0, cmd_size = 0;
 	enum pci_size_t size = PCI_SIZE_32;
-#ifdef CONFIG_DM_PCI
 	struct udevice *dev, *bus;
-#else
-	pci_dev_t dev;
-#endif
-	int busnum = 0;
+	int busnum = -1;
 	pci_dev_t bdf = 0;
 	char cmd = 's';
 	int ret = 0;
+	char *endp;
 
 	if (argc > 1)
 		cmd = argv[1][0];
@@ -686,19 +506,15 @@
 		if (argc > 4)
 			value = simple_strtoul(argv[4], NULL, 16);
 	case 'h':		/* header */
-#ifdef CONFIG_DM_PCI
 	case 'b':		/* bars */
-#endif
 		if (argc < 3)
 			goto usage;
 		if ((bdf = get_pci_dev(argv[2])) == -1)
 			return 1;
 		break;
-#if defined(CONFIG_DM_PCI)
 	case 'e':
 		pci_init();
 		return 0;
-#endif
 	case 'r': /* no break */
 	default:		/* scan bus */
 		value = 1; /* short listing */
@@ -707,10 +523,37 @@
 				value = 0;
 				argc--;
 			}
-			if (argc > 1)
-				busnum = simple_strtoul(argv[1], NULL, 16);
+			if (argc > 2 || (argc > 1 && cmd != 'r' && argv[1][0] != 's')) {
+				if (argv[argc - 1][0] != '*') {
+					busnum = simple_strtoul(argv[argc - 1], &endp, 16);
+					if (*endp)
+						goto usage;
+				}
+				argc--;
+			}
+			if (cmd == 'r' && argc > 2)
+				goto usage;
+			else if (cmd != 'r' && (argc > 2 || (argc == 2 && argv[1][0] != 's')))
+				goto usage;
 		}
-#ifdef CONFIG_DM_PCI
+		if (busnum == -1) {
+			if (cmd != 'r') {
+				for (busnum = 0;
+				     uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus) == 0;
+				     busnum++)
+					pciinfo(bus, value, true);
+			} else {
+				for (busnum = 0;
+				     uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus) == 0;
+				     busnum++) {
+					/* Regions are controller specific so skip non-root buses */
+					if (device_is_on_pci_bus(bus))
+						continue;
+					pci_show_regions(bus);
+				}
+			}
+			return 0;
+		}
 		ret = uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus);
 		if (ret) {
 			printf("No such bus\n");
@@ -719,22 +562,15 @@
 		if (cmd == 'r')
 			pci_show_regions(bus);
 		else
-			pciinfo(bus, value);
-#else
-		pciinfo(busnum, value);
-#endif
+			pciinfo(bus, value, false);
 		return 0;
 	}
 
-#ifdef CONFIG_DM_PCI
 	ret = dm_pci_bus_find_bdf(bdf, &dev);
 	if (ret) {
 		printf("No such device\n");
 		return CMD_RET_FAILURE;
 	}
-#else
-	dev = bdf;
-#endif
 
 	switch (argv[1][0]) {
 	case 'h':		/* header */
@@ -755,17 +591,10 @@
 	case 'w':		/* write */
 		if (argc < 5)
 			goto usage;
-#ifdef CONFIG_DM_PCI
 		ret = dm_pci_write_config(dev, addr, value, size);
-#else
-		ret = pci_cfg_write(dev, addr, size, value);
-#endif
 		break;
-#ifdef CONFIG_DM_PCI
-
 	case 'b':		/* bars */
 		return pci_bar_show(dev);
-#endif
 	default:
 		ret = CMD_RET_USAGE;
 		break;
@@ -780,20 +609,16 @@
 
 #ifdef CONFIG_SYS_LONGHELP
 static char pci_help_text[] =
-	"[bus] [long]\n"
+	"[bus|*] [long]\n"
 	"    - short or long list of PCI devices on bus 'bus'\n"
-#if defined(CONFIG_DM_PCI)
 	"pci enum\n"
 	"    - Enumerate PCI buses\n"
-#endif
 	"pci header b.d.f\n"
 	"    - show header of PCI device 'bus.device.function'\n"
-#ifdef CONFIG_DM_PCI
 	"pci bar b.d.f\n"
 	"    - show BARs base and size for device b.d.f'\n"
-	"pci regions\n"
+	"pci regions [bus|*]\n"
 	"    - show PCI regions\n"
-#endif
 	"pci display[.b, .w, .l] b.d.f [address] [# of objects]\n"
 	"    - display PCI configuration space (CFG)\n"
 	"pci next[.b, .w, .l] b.d.f address\n"
diff --git a/u-boot/cmd/script_update.c b/u-boot/cmd/script_update.c
index 2d6e423..d4a7da7 100644
--- a/u-boot/cmd/script_update.c
+++ b/u-boot/cmd/script_update.c
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <malloc.h>
+#include <dm/device.h>
 
 /*
  * Script file example:
@@ -144,6 +145,8 @@
 			 int argc, char * const argv[])
 {
 	struct blk_desc *desc;
+	struct udevice *dev;
+	int devnum = -1;
 	int part_type;
 	char cmd[128];
 	char *buf;
@@ -151,9 +154,31 @@
 
 	printf("## retrieving usb_update.txt ...\n");
 
-	desc = blk_get_devnum_by_type(IF_TYPE_USB, 0);
-	if (!desc)
+	if (run_command("usb reset", 0))
 		return CMD_RET_FAILURE;
+
+	for (blk_first_device(IF_TYPE_USB, &dev);
+	     dev;
+	     blk_next_device(&dev)) {
+		desc = dev_get_uclass_platdata(dev);
+		if (desc->type == DEV_TYPE_UNKNOWN)
+			continue;
+
+		if (desc->lba > 0L && desc->blksz > 0L) {
+			devnum = desc->devnum;
+			break;
+		}
+	}
+	if (devnum < 0) {
+		printf("No available udisk\n");
+		return CMD_RET_FAILURE;
+	}
+
+	desc = blk_get_devnum_by_type(IF_TYPE_USB, devnum);
+	if (!desc) {
+		printf("No usb %d found\n", devnum);
+		return CMD_RET_FAILURE;
+	}
 
 	buf = memalign(ARCH_DMA_MINALIGN, SCRIPT_FILE_MAX_SIZE * 2);
 	if (!buf)
@@ -162,18 +187,15 @@
 	part_type = desc->part_type;
 	desc->part_type = PART_TYPE_DOS;
 
-	snprintf(cmd, sizeof(cmd), "usb reset");
+	printf("## scanning usb %d\n", devnum);
+	snprintf(cmd, sizeof(cmd), "fatload usb %d 0x%08lx usb_update.txt",
+		 devnum, (ulong)buf);
 	ret = run_command(cmd, 0);
-	if (!ret) {
-		snprintf(cmd, sizeof(cmd), "fatload usb 0 0x%08lx usb_update.txt", (ulong)buf);
-		ret = run_command(cmd, 0);
-	}
 	if (!ret) {
 		snprintf(cmd, sizeof(cmd), "script 0x%08lx", (ulong)buf);
 		ret = run_command(cmd, 0);
 	}
 	free(buf);
-
 	desc->part_type = part_type;
 
 	return ret;
diff --git a/u-boot/cmd/ufs.c b/u-boot/cmd/ufs.c
new file mode 100644
index 0000000..5b25788
--- /dev/null
+++ b/u-boot/cmd/ufs.c
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0+
+/**
+ * ufs.c - UFS specific U-boot commands
+ *
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
+ *
+ */
+#include <common.h>
+#include <command.h>
+#include <ufs.h>
+
+static int do_ufs(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	int dev, ret;
+
+	if (argc >= 2) {
+		if (!strcmp(argv[1], "init")) {
+			if (argc == 3) {
+				dev = simple_strtoul(argv[2], NULL, 10);
+				ret = ufs_probe_dev(dev);
+				if (ret)
+					return CMD_RET_FAILURE;
+			} else {
+				ufs_probe();
+			}
+
+			return CMD_RET_SUCCESS;
+		}
+	}
+
+	return CMD_RET_USAGE;
+}
+
+U_BOOT_CMD(ufs, 3, 1, do_ufs,
+	   "UFS  sub system",
+	   "init [dev] - init UFS subsystem\n"
+);
diff --git a/u-boot/common/Kconfig b/u-boot/common/Kconfig
index 2de87b3..cc0753c 100644
--- a/u-boot/common/Kconfig
+++ b/u-boot/common/Kconfig
@@ -682,5 +682,17 @@
 
 endmenu
 
+menu "MT support"
+
+config MP_BOOT
+	bool "Support MT boot"
+	default n
+
+config MP_BOOT_BOOTM
+	bool "MT simple bootm image"
+	depends on MP_BOOT
+
+endmenu
+
 source "common/spl/Kconfig"
 source "common/usbplug/Kconfig"
diff --git a/u-boot/common/Makefile b/u-boot/common/Makefile
index 1901154..e6f1c11 100644
--- a/u-boot/common/Makefile
+++ b/u-boot/common/Makefile
@@ -49,7 +49,6 @@
 obj-$(CONFIG_CONSOLE_MUX) += iomux.o
 obj-$(CONFIG_MTD_NOR_FLASH) += flash.o
 obj-$(CONFIG_CMD_KGDB) += kgdb.o kgdb_stubs.o
-obj-$(CONFIG_I2C_EDID) += edid.o
 obj-$(CONFIG_KALLSYMS) += kallsyms.o
 obj-y += splash.o
 obj-$(CONFIG_SPLASH_SOURCE) += splash_source.o
@@ -67,6 +66,7 @@
 
 endif # !CONFIG_SPL_BUILD
 
+obj-$(CONFIG_$(SPL_TPL_)I2C_EDID) += edid.o
 obj-$(CONFIG_$(SPL_TPL_)BOOTSTAGE) += bootstage.o
 
 ifdef CONFIG_SPL_BUILD
@@ -166,3 +166,11 @@
 obj-$(CONFIG_ANDROID_KEYMASTER_CA) += keymaster.o
 obj-$(CONFIG_ANDROID_KEYMASTER_CA) += attestation_key.o
 endif
+
+ifdef CONFIG_MP_BOOT
+ifndef CONFIG_SPL_BUILD
+obj-$(CONFIG_ROCKCHIP_RK3528) += mp_boot_rk3528.o
+else
+obj-$(CONFIG_ROCKCHIP_RK3528) += spl_mp_boot_rk3528.o
+endif
+endif
diff --git a/u-boot/common/android_ab.c b/u-boot/common/android_ab.c
index 2182d3d..5655274 100644
--- a/u-boot/common/android_ab.c
+++ b/u-boot/common/android_ab.c
@@ -406,7 +406,7 @@
 	return 0;
 }
 
-void ab_update_root_uuid(void)
+static void ab_update_root_uuid(void)
 {
 	/*
 	 * In android a/b & avb process, the system.img is mandory and the
@@ -441,6 +441,60 @@
 	}
 }
 
+void ab_update_root_partition(void)
+{
+	char *boot_args = env_get("bootargs");
+	char root_part_dev[64] = {0};
+	disk_partition_t part_info;
+	struct blk_desc *dev_desc;
+	const char *part_type;
+	int part_num;
+
+	dev_desc = rockchip_get_bootdev();
+	if (!dev_desc)
+		return;
+
+	if (ab_is_support_dynamic_partition(dev_desc))
+		return;
+
+	/* Get 'system' partition device number. */
+	part_num = part_get_info_by_name(dev_desc, ANDROID_PARTITION_SYSTEM, &part_info);
+	if (part_num < 0) {
+		printf("%s: Failed to get partition '%s'.\n", __func__, ANDROID_PARTITION_SYSTEM);
+		return;
+	}
+
+	/* Get partition type. */
+	part_type = part_get_type(dev_desc);
+	if (!part_type)
+		return;
+
+	/* Judge the partition device type. */
+	switch (dev_desc->if_type) {
+	case IF_TYPE_MMC:
+		if (strstr(part_type, "ENV"))
+			snprintf(root_part_dev, 64, "root=/dev/mmcblk0p%d", part_num);
+		else if (strstr(part_type, "EFI"))
+			ab_update_root_uuid();
+		break;
+	case IF_TYPE_MTD:
+		if (dev_desc->devnum == BLK_MTD_NAND || dev_desc->devnum == BLK_MTD_SPI_NAND) {
+			if (strstr(boot_args, "rootfstype=squashfs") || strstr(boot_args, "rootfstype=erofs"))
+				snprintf(root_part_dev, 64, "ubi.mtd=%d root=/dev/ubiblock0_0", part_num - 1);
+			else if (strstr(boot_args, "rootfstype=ubifs"))
+				snprintf(root_part_dev, 64, "ubi.mtd=%d root=ubi0:system", part_num - 1);
+		} else if (dev_desc->devnum == BLK_MTD_SPI_NOR) {
+			snprintf(root_part_dev, 64, "root=/dev/mtdblock%d", part_num - 1);
+		}
+		break;
+	default:
+		printf("%s: Not found part type, failed to set root part device.\n", __func__);
+		return;
+	}
+
+	env_update("bootargs", root_part_dev);
+}
+
 int ab_get_slot_suffix(char *slot_suffix)
 {
 	/* TODO: get from pre-loader or misc partition */
diff --git a/u-boot/common/android_bootloader.c b/u-boot/common/android_bootloader.c
index 772e6bf..ab080b8 100644
--- a/u-boot/common/android_bootloader.c
+++ b/u-boot/common/android_bootloader.c
@@ -18,6 +18,7 @@
 #include <dt_table.h>
 #include <image-android-dt.h>
 #include <malloc.h>
+#include <mp_boot.h>
 #include <fdt_support.h>
 #include <fs.h>
 #include <boot_rkimg.h>
@@ -462,15 +463,305 @@
 	slot->successful_boot = 0;
 }
 
+static char *join_str(const char *a, const char *b)
+{
+	size_t len = strlen(a) + strlen(b) + 1 /* null term */;
+	char *ret = (char *)malloc(len);
+
+	if (!ret) {
+		debug("failed to alloc %zu\n", len);
+		return NULL;
+	}
+	strcpy(ret, a);
+	strcat(ret, b);
+
+	return ret;
+}
+
+static size_t get_partition_size(AvbOps *ops, char *name,
+				 const char *slot_suffix)
+{
+	char *partition_name = join_str(name, slot_suffix);
+	uint64_t size = 0;
+	AvbIOResult res;
+
+	if (partition_name == NULL)
+		goto bail;
+
+	res = ops->get_size_of_partition(ops, partition_name, &size);
+	if (res != AVB_IO_RESULT_OK && res != AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION)
+		size = 0;
+bail:
+	if (partition_name)
+		free(partition_name);
+
+	return size;
+}
+
+static struct AvbOpsData preload_user_data;
+
+static int avb_image_distribute_prepare(AvbSlotVerifyData *slot_data,
+					AvbOps *ops, char *slot_suffix)
+{
+	struct AvbOpsData *data = (struct AvbOpsData *)(ops->user_data);
+	size_t vendor_boot_size;
+	size_t init_boot_size;
+	size_t resource_size;
+	size_t boot_size;
+	void *image_buf;
+
+	boot_size = max(get_partition_size(ops, ANDROID_PARTITION_BOOT, slot_suffix),
+		get_partition_size(ops, ANDROID_PARTITION_RECOVERY, slot_suffix));
+	init_boot_size = get_partition_size(ops,
+				ANDROID_PARTITION_INIT_BOOT, slot_suffix);
+	vendor_boot_size = get_partition_size(ops,
+				ANDROID_PARTITION_VENDOR_BOOT, slot_suffix);
+	resource_size = get_partition_size(ops,
+				ANDROID_PARTITION_RESOURCE, slot_suffix);
+	image_buf = sysmem_alloc(MEM_AVB_ANDROID,
+				 boot_size + init_boot_size +
+				 vendor_boot_size + resource_size);
+	if (!image_buf) {
+		printf("avb: sysmem alloc failed\n");
+		return -ENOMEM;
+	}
+
+	/* layout: | boot/recovery | vendor_boot | init_boot | resource | */
+	data->slot_suffix = slot_suffix;
+	data->boot.addr = image_buf;
+	data->boot.size = 0;
+	data->vendor_boot.addr = data->boot.addr + boot_size;
+	data->vendor_boot.size = 0;
+	data->init_boot.addr = data->vendor_boot.addr + vendor_boot_size;
+	data->init_boot.size = 0;
+	data->resource.addr = data->init_boot.addr + init_boot_size;
+	data->resource.size = 0;
+
+	return 0;
+}
+
+static int avb_image_distribute_finish(AvbSlotVerifyData *slot_data,
+				       AvbSlotVerifyFlags flags,
+				       ulong *load_address)
+{
+	struct andr_img_hdr *hdr;
+	ulong load_addr = *load_address;
+	void *vendor_boot_hdr = NULL;
+	void *init_boot_hdr = NULL;
+	void *boot_hdr = NULL;
+	char *part_name;
+	int i, ret;
+
+	for (i = 0; i < slot_data->num_loaded_partitions; i++) {
+		part_name = slot_data->loaded_partitions[i].partition_name;
+		if (!strncmp(ANDROID_PARTITION_BOOT, part_name, 4) ||
+		    !strncmp(ANDROID_PARTITION_RECOVERY, part_name, 8)) {
+			boot_hdr = slot_data->loaded_partitions[i].data;
+		} else if (!strncmp(ANDROID_PARTITION_INIT_BOOT, part_name, 9)) {
+			init_boot_hdr = slot_data->loaded_partitions[i].data;
+		} else if (!strncmp(ANDROID_PARTITION_VENDOR_BOOT, part_name, 11)) {
+			vendor_boot_hdr = slot_data->loaded_partitions[i].data;
+		}
+	}
+
+	/*
+	 *		populate boot_img_hdr_v34
+	 *
+	 * If allow verification error: the images are loaded by
+	 * ops->get_preloaded_partition() which auto populates
+	 * boot_img_hdr_v34.
+	 *
+	 * If not allow verification error: the images are full loaded
+	 * by ops->read_from_partition() which doesn't populate
+	 * boot_img_hdr_v34, we need to fix it here for bootm and
+	 */
+
+	hdr = boot_hdr;
+	if (hdr->header_version >= 3 &&
+	    !(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR)) {
+		hdr = malloc(sizeof(struct andr_img_hdr));
+		if (!hdr)
+			return -ENOMEM;
+
+		ret = populate_boot_info(boot_hdr, vendor_boot_hdr,
+					 init_boot_hdr, hdr, true);
+		if (ret < 0) {
+			printf("avb: populate boot info failed, ret=%d\n", ret);
+			return ret;
+		}
+		memcpy(boot_hdr, hdr, sizeof(*hdr));
+	}
+
+	/* distribute ! */
+	load_addr -= hdr->page_size;
+	if (android_image_memcpy_separate(boot_hdr, &load_addr)) {
+		printf("Failed to separate copy android image\n");
+		return AVB_SLOT_VERIFY_RESULT_ERROR_IO;
+	}
+
+	*load_address = load_addr;
+
+	return 0;
+}
+
+int android_image_verify_resource(const char *boot_part, ulong *resc_buf)
+{
+	const char *requested_partitions[] = {
+		NULL,
+		NULL,
+	};
+	struct AvbOpsData *data;
+	uint8_t unlocked = true;
+	AvbOps *ops;
+	AvbSlotVerifyFlags flags;
+	AvbSlotVerifyData *slot_data = {NULL};
+	AvbSlotVerifyResult verify_result;
+	char slot_suffix[3] = {0};
+	char *part_name;
+	void *image_buf = NULL;
+	int retry_no_vbmeta_partition = 1;
+	int i, ret;
+
+	ops = avb_ops_user_new();
+	if (ops == NULL) {
+		printf("avb_ops_user_new() failed!\n");
+		return -AVB_SLOT_VERIFY_RESULT_ERROR_OOM;
+	}
+
+	if (ops->read_is_device_unlocked(ops, (bool *)&unlocked) != AVB_IO_RESULT_OK)
+		printf("Error determining whether device is unlocked.\n");
+
+	printf("Device is: %s\n", (unlocked & LOCK_MASK)? "UNLOCKED" : "LOCKED");
+
+	if (unlocked & LOCK_MASK) {
+		*resc_buf = 0;
+		return 0;
+	}
+
+	flags = AVB_SLOT_VERIFY_FLAGS_NONE;
+	if (strcmp(boot_part, ANDROID_PARTITION_RECOVERY) == 0)
+		flags |= AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION;
+
+#ifdef CONFIG_ANDROID_AB
+	part_name = strdup(boot_part);
+	*(part_name + strlen(boot_part) - 2) = '\0';
+	requested_partitions[0] = part_name;
+
+	ret = rk_avb_get_current_slot(slot_suffix);
+	if (ret) {
+		printf("Failed to get slot suffix, ret=%d\n", ret);
+		return ret;
+	}
+#else
+	requested_partitions[0] = boot_part;
+#endif
+	data = (struct AvbOpsData *)(ops->user_data);
+	ret = avb_image_distribute_prepare(slot_data, ops, slot_suffix);
+	if (ret) {
+		printf("avb image distribute prepare failed %d\n", ret);
+		return ret;
+	}
+
+retry_verify:
+	verify_result =
+	avb_slot_verify(ops,
+			requested_partitions,
+			slot_suffix,
+			flags,
+			AVB_HASHTREE_ERROR_MODE_RESTART,
+			&slot_data);
+	if (verify_result != AVB_SLOT_VERIFY_RESULT_OK &&
+	    verify_result != AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED) {
+		if (retry_no_vbmeta_partition && strcmp(boot_part, ANDROID_PARTITION_RECOVERY) == 0) {
+			printf("Verify recovery with vbmeta.\n");
+			flags &= ~AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION;
+			retry_no_vbmeta_partition = 0;
+			goto retry_verify;
+		}
+	}
+
+	if (verify_result != AVB_SLOT_VERIFY_RESULT_OK || !slot_data) {
+		sysmem_free((ulong)data->boot.addr);
+		return verify_result;
+	}
+
+	for (i = 0; i < slot_data->num_loaded_partitions; i++) {
+		part_name = slot_data->loaded_partitions[i].partition_name;
+		if (!strncmp(ANDROID_PARTITION_RESOURCE, part_name, 8)) {
+			image_buf = slot_data->loaded_partitions[i].data;
+			break;
+		} else if (!strncmp(ANDROID_PARTITION_BOOT, part_name, 4) ||
+			   !strncmp(ANDROID_PARTITION_RECOVERY, part_name, 8)) {
+			struct andr_img_hdr *hdr;
+
+			hdr = (void *)slot_data->loaded_partitions[i].data;
+			if (android_image_check_header(hdr))
+				continue;
+
+			if (hdr->header_version <= 2) {
+				image_buf = (void *)hdr + hdr->page_size +
+					ALIGN(hdr->kernel_size, hdr->page_size) +
+					ALIGN(hdr->ramdisk_size, hdr->page_size);
+				break;
+			}
+		}
+	}
+
+	if (image_buf) {
+		memcpy((char *)&preload_user_data, (char *)data, sizeof(*data));
+		*resc_buf = (ulong)image_buf;
+	}
+
+	return 0;
+}
+
+/*
+ *		AVB Policy.
+ *
+ * == avb with unlock:
+ * Don't process hash verify.
+ * Go pre-loaded path: Loading vendor_boot and init_boot
+ * directly to where they should be, while loading the
+ * boot/recovery. The boot message tells like:
+ * ···
+ * preloaded: distribute image from 'boot_a'
+ * preloaded: distribute image from 'init_boot_a'
+ * preloaded: distribute image from 'vendor_boot_a'
+ * ···
+ *
+ * == avb with lock:
+ * Process hash verify.
+ * Go pre-loaded path: Loading full vendor_boot, init_boot and
+ * boot/recovery one by one to verify, and distributing them to
+ * where they should be by memcpy at last.
+ *
+ * The three images share a large memory buffer that allocated
+ * by sysmem_alloc(), it locate at high memory address that
+ * just lower than SP bottom. The boot message tells like:
+ * ···
+ * preloaded: full image from 'boot_a' at 0xe47f90c0 - 0xe7a4b0c0
+ * preloaded: full image from 'init_boot_a' at 0xeaff90c0 - 0xeb2950c0
+ * preloaded: full image from 'vendor_boot_a' at 0xe87f90c0 - 0xe9f6e0c0
+ * ···
+ */
 static AvbSlotVerifyResult android_slot_verify(char *boot_partname,
 			       unsigned long *android_load_address,
 			       char *slot_suffix)
 {
-	const char *requested_partitions[1] = {NULL};
+	const char *requested_partitions[] = {
+		boot_partname,
+		NULL,
+		NULL,
+		NULL,
+	};
+	struct AvbOpsData *data;
+	struct blk_desc *dev_desc;
+	struct andr_img_hdr *hdr;
+	disk_partition_t part_info;
 	uint8_t unlocked = true;
 	AvbOps *ops;
 	AvbSlotVerifyFlags flags;
-	AvbSlotVerifyData *slot_data[1] = {NULL};
+	AvbSlotVerifyData *slot_data = {NULL};
 	AvbSlotVerifyResult verify_result;
 	AvbABData ab_data, ab_data_orig;
 	size_t slot_index_to_boot = 0;
@@ -478,9 +769,29 @@
 	char can_boot = 1;
 	char retry_no_vbmeta_partition = 1;
 	unsigned long load_address = *android_load_address;
-	struct andr_img_hdr *hdr;
+	int ret;
 
-	requested_partitions[0] = boot_partname;
+	dev_desc = rockchip_get_bootdev();
+	if (!dev_desc)
+		return AVB_IO_RESULT_ERROR_IO;
+
+	if (part_get_info_by_name(dev_desc, boot_partname, &part_info) < 0) {
+		printf("Could not find \"%s\" partition\n", boot_partname);
+		return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
+	}
+
+	hdr = populate_andr_img_hdr(dev_desc, &part_info);
+	if (!hdr) {
+		printf("No valid android hdr\n");
+		return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;
+	}
+
+	if (hdr->header_version >= 4) {
+		requested_partitions[1] = ANDROID_PARTITION_VENDOR_BOOT;
+		if (((hdr->os_version >> 25) & 0x7f) >= 13)
+			requested_partitions[2] = ANDROID_PARTITION_INIT_BOOT;
+	}
+
 	ops = avb_ops_user_new();
 	if (ops == NULL) {
 		printf("avb_ops_user_new() failed!\n");
@@ -497,7 +808,7 @@
 	if (unlocked & LOCK_MASK)
 		flags |= AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR;
 
-	if(load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) {
+	if (load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) {
 		printf("Can not load metadata\n");
 		return AVB_SLOT_VERIFY_RESULT_ERROR_IO;
 	}
@@ -509,8 +820,30 @@
 	else
 		slot_index_to_boot = 0;
 
-	if (strcmp(boot_partname, "recovery") == 0)
+	if (strcmp(boot_partname, ANDROID_PARTITION_RECOVERY) == 0)
 		flags |= AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION;
+
+#ifdef CONFIG_MP_BOOT
+	preload_user_data.boot.addr = (void *)mpb_post(1);
+	preload_user_data.boot.size = (size_t)mpb_post(2);
+#endif
+
+	/* use preload one if available */
+	if (preload_user_data.boot.addr) {
+		data = (struct AvbOpsData *)(ops->user_data);
+
+		data->slot_suffix = slot_suffix;
+		data->boot = preload_user_data.boot;
+		data->vendor_boot = preload_user_data.vendor_boot;
+		data->init_boot = preload_user_data.init_boot;
+		data->resource = preload_user_data.resource;
+	} else {
+		ret = avb_image_distribute_prepare(slot_data, ops, slot_suffix);
+		if (ret < 0) {
+			printf("avb image distribute prepare failed %d\n", ret);
+			return AVB_SLOT_VERIFY_RESULT_ERROR_OOM;
+		}
+	}
 
 retry_verify:
 	verify_result =
@@ -519,10 +852,10 @@
 			slot_suffix,
 			flags,
 			AVB_HASHTREE_ERROR_MODE_RESTART,
-			&slot_data[0]);
+			&slot_data);
 	if (verify_result != AVB_SLOT_VERIFY_RESULT_OK &&
 	    verify_result != AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED) {
-		if (retry_no_vbmeta_partition && strcmp(boot_partname, "recovery") == 0) {
+		if (retry_no_vbmeta_partition && strcmp(boot_partname, ANDROID_PARTITION_RECOVERY) == 0) {
 			printf("Verify recovery with vbmeta.\n");
 			flags &= ~AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION;
 			retry_no_vbmeta_partition = 0;
@@ -558,7 +891,7 @@
 		break;
 	}
 
-	if (!slot_data[0]) {
+	if (!slot_data) {
 		can_boot = 0;
 		goto out;
 	}
@@ -569,12 +902,12 @@
 		int len = 0;
 		char *bootargs, *newbootargs;
 #ifdef CONFIG_ANDROID_AVB_ROLLBACK_INDEX
-		if (rk_avb_update_stored_rollback_indexes_for_slot(ops, slot_data[0]))
+		if (rk_avb_update_stored_rollback_indexes_for_slot(ops, slot_data))
 			printf("Fail to update the rollback indexes.\n");
 #endif
-		if (*slot_data[0]->cmdline) {
-			debug("Kernel command line: %s\n", slot_data[0]->cmdline);
-			len += strlen(slot_data[0]->cmdline);
+		if (slot_data->cmdline) {
+			debug("Kernel command line: %s\n", slot_data->cmdline);
+			len += strlen(slot_data->cmdline);
 		}
 
 		bootargs = env_get("bootargs");
@@ -593,49 +926,15 @@
 			strcpy(newbootargs, bootargs);
 			strcat(newbootargs, " ");
 		}
-		if (*slot_data[0]->cmdline)
-			strcat(newbootargs, slot_data[0]->cmdline);
+		if (slot_data->cmdline)
+			strcat(newbootargs, slot_data->cmdline);
 		env_set("bootargs", newbootargs);
 
-		hdr = (void *)slot_data[0]->loaded_partitions->data;
-
-		/*
-		 *		populate boot_img_hdr_v34
-		 *
-		 * If allow verification error: the image is loaded by
-		 * ops->get_preloaded_partition() which auto populates
-		 * boot_img_hdr_v34.
-		 *
-		 * If not allow verification error: the image is full loaded
-		 * by ops->read_from_partition() which doesn't populate
-		 * boot_img_hdr_v34, we need to fix it here.
-		 */
-		if (hdr->header_version >= 3 &&
-		    !(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR)) {
-			struct andr_img_hdr *v3hdr;
-			struct blk_desc *dev_desc;
-			disk_partition_t part;
-
-			dev_desc = rockchip_get_bootdev();
-			if (!dev_desc)
-				return -1;
-
-			if (part_get_info_by_name(dev_desc,
-						  boot_partname, &part) < 0)
-				return -1;
-
-			v3hdr = populate_andr_img_hdr(dev_desc, &part);
-			if (v3hdr) {
-				memcpy(hdr, v3hdr, sizeof(*v3hdr));
-				free(v3hdr);
-			}
-		}
-
-		/* Reserve page_size */
-		load_address -= hdr->page_size;
-		if (android_image_memcpy_separate(hdr, &load_address)) {
-			printf("Failed to separate copy android image\n");
-			return AVB_SLOT_VERIFY_RESULT_ERROR_IO;
+		/* if need, distribute full image to where they should be */
+		ret = avb_image_distribute_finish(slot_data, flags, &load_address);
+		if (ret) {
+			printf("avb image distribute finish failed %d\n", ret);
+			return ret;
 		}
 		*android_load_address = load_address;
 	} else {
@@ -649,8 +948,8 @@
 		verify_result = AVB_SLOT_VERIFY_RESULT_ERROR_IO;
 	}
 
-	if (slot_data[0] != NULL)
-		avb_slot_verify_data_free(slot_data[0]);
+	if (slot_data != NULL)
+		avb_slot_verify_data_free(slot_data);
 
 	if ((unlocked & LOCK_MASK) && can_boot)
 		return 0;
@@ -1047,10 +1346,6 @@
 		printf("Android image load failed\n");
 		return -1;
 	}
-#endif
-
-#ifdef CONFIG_ANDROID_AB
-	ab_update_root_uuid();
 #endif
 
 	/* Set Android root variables. */
diff --git a/u-boot/common/board_f.c b/u-boot/common/board_f.c
index 190e5a4..dd76efc 100644
--- a/u-boot/common/board_f.c
+++ b/u-boot/common/board_f.c
@@ -21,6 +21,7 @@
 #include <init_helpers.h>
 #include <malloc.h>
 #include <mapmem.h>
+#include <mp_boot.h>
 #include <os.h>
 #include <post.h>
 #include <relocate.h>
@@ -254,6 +255,9 @@
 	/* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */
 	gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE;
 #endif
+#ifdef CONFIG_MP_BOOT
+	mpb_init_x(3);
+#endif
 	return 0;
 }
 
diff --git a/u-boot/common/board_info.c b/u-boot/common/board_info.c
index b48fd1e..1d0155e 100644
--- a/u-boot/common/board_info.c
+++ b/u-boot/common/board_info.c
@@ -26,6 +26,7 @@
 	if (model)
 		printf("Model: %s\n", model);
 #endif
+	printf("MPIDR: 0x%lx\n", (ulong)read_mpidr());
 
 #ifdef CONFIG_ARM64_BOOT_AARCH32
 	if (!(gd->flags & GD_FLG_RELOC))
diff --git a/u-boot/common/board_r.c b/u-boot/common/board_r.c
index 74fee37..c3d7d9c 100644
--- a/u-boot/common/board_r.c
+++ b/u-boot/common/board_r.c
@@ -481,21 +481,6 @@
 }
 #endif
 
-#ifdef CONFIG_MTD_BLK
-static int initr_mtd_blk(void)
-{
-#ifndef CONFIG_USING_KERNEL_DTB
-	struct blk_desc *dev_desc;
-
-	puts("mtd_blk:   ");
-	dev_desc = rockchip_get_bootdev();
-	if (dev_desc)
-		mtd_blk_map_partitions(dev_desc);
-#endif
-	return 0;
-}
-#endif
-
 #if !defined(CONFIG_USING_KERNEL_DTB) || !defined(CONFIG_ENV_IS_NOWHERE)
 /*
  * Tell if it's OK to load the environment early in boot.
@@ -966,9 +951,6 @@
 #endif
 #ifdef CONFIG_CMD_ONENAND
 	initr_onenand,
-#endif
-#ifdef CONFIG_MTD_BLK
-	initr_mtd_blk,
 #endif
 #ifdef CONFIG_MMC
 	initr_mmc,
diff --git a/u-boot/common/bootm.c b/u-boot/common/bootm.c
index fcb561d..1bc426b 100644
--- a/u-boot/common/bootm.c
+++ b/u-boot/common/bootm.c
@@ -31,7 +31,7 @@
 #include <image.h>
 
 #ifdef USE_HOSTCC
-#define CONFIG_SYS_BOOTM_LEN	0x4000000
+#define CONFIG_SYS_BOOTM_LEN	0x10000000
 #endif
 
 #ifndef CONFIG_SYS_BOOTM_LEN
diff --git a/u-boot/common/fb_mmc.c b/u-boot/common/fb_mmc.c
index e083daa..f292d0d 100755
--- a/u-boot/common/fb_mmc.c
+++ b/u-boot/common/fb_mmc.c
@@ -31,6 +31,15 @@
 #define CONFIG_FASTBOOT_MBR_NAME "mbr"
 #endif
 
+#ifndef CONFIG_FASTBOOT_IDBLOCK_NAME
+#define CONFIG_FASTBOOT_IDBLOCK_NAME "idblock"
+#endif
+
+#define CONFIG_FASTBOOT_MMC_BLOCK_SIZE 512
+#define CONFIG_FASTBOOT_IDBLOCK_SECTOR 64
+/* idblock sector:64 ~ 64 + 5 * 1024(512K for each MiniloadAll.bin) */
+#define CONFIG_FASTBOOT_IDBLOCK_SECTOR_SIZE 5184
+
 #define BOOT_PARTITION_NAME "boot"
 #define FASTBOOT_MAX_BLK_WRITE 16384
 static ulong timer;
@@ -363,6 +372,14 @@
 	}
 #endif
 
+	if (strcmp(cmd, CONFIG_FASTBOOT_IDBLOCK_NAME) == 0) {
+		printf("%s: updating IDBLOCK\n", __func__);
+		info.blksz = CONFIG_FASTBOOT_MMC_BLOCK_SIZE;
+		info.start = CONFIG_FASTBOOT_IDBLOCK_SECTOR;
+		info.size = CONFIG_FASTBOOT_IDBLOCK_SECTOR_SIZE;
+		goto download;
+	}
+
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
 	if (strncasecmp(cmd, "zimage", 6) == 0) {
 		fb_mmc_update_zimage(dev_desc, download_buffer, download_bytes, response);
@@ -376,6 +393,7 @@
 		return;
 	}
 
+download:
 	if (is_sparse_image(download_buffer)) {
 		struct fb_mmc_sparse sparse_priv;
 		struct sparse_storage sparse;
diff --git a/u-boot/common/image-android.c b/u-boot/common/image-android.c
index fbd9bad..a77c0f3 100644
--- a/u-boot/common/image-android.c
+++ b/u-boot/common/image-android.c
@@ -6,14 +6,16 @@
 
 #include <common.h>
 #include <image.h>
-#include <android_image.h>
+#include <android_ab.h>
 #include <android_bootloader.h>
+#include <android_image.h>
 #include <malloc.h>
 #include <mapmem.h>
 #include <errno.h>
 #include <boot_rkimg.h>
 #include <crypto.h>
 #include <sysmem.h>
+#include <mp_boot.h>
 #include <u-boot/sha1.h>
 #ifdef CONFIG_RKIMG_BOOTLOADER
 #include <asm/arch/resource_img.h>
@@ -28,8 +30,8 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 #define ANDROID_IMAGE_DEFAULT_KERNEL_ADDR	0x10008000
-#define ANDROID_Q_VER				10
 #define ANDROID_PARTITION_VENDOR_BOOT		"vendor_boot"
+#define ANDROID_PARTITION_INIT_BOOT		"init_boot"
 
 #define BLK_CNT(_num_bytes, _block_size)	\
 		((_num_bytes + _block_size - 1) / _block_size)
@@ -37,27 +39,110 @@
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 static u32 android_kernel_comp_type = IH_COMP_NONE;
 
-u32 android_image_major_version(void)
+static int android_version_init(void)
 {
-	/* MSB 7-bits */
-	return gd->bd->bi_andr_version >> 25;
+	struct andr_img_hdr *hdr = NULL;
+	struct blk_desc *desc;
+	const char *part_name = PART_BOOT;
+	disk_partition_t part;
+	int os_version;
+
+	desc = rockchip_get_bootdev();
+	if (!desc) {
+		printf("No bootdev\n");
+		return -1;
+	}
+
+#ifdef CONFIG_ANDROID_AB
+	part_name = ab_can_find_recovery_part() ? PART_RECOVERY : PART_BOOT;
+#endif
+	if (part_get_info_by_name(desc, part_name, &part) < 0)
+		return -1;
+
+	hdr = populate_andr_img_hdr(desc, &part);
+	if (!hdr)
+		return -1;
+
+	os_version = hdr->os_version;
+	if (os_version)
+		printf("Android %u.%u, Build %u.%u, v%d\n",
+		       (os_version >> 25) & 0x7f, (os_version >> 18) & 0x7F,
+		       ((os_version >> 4) & 0x7f) + 2000, os_version & 0x0F,
+		       hdr->header_version);
+	free(hdr);
+
+	return (os_version >> 25) & 0x7f;
 }
 
 u32 android_bcb_msg_sector_offset(void)
 {
+	static int android_version = -1;	/* static */
+
 	/*
-	 * Rockchip platforms defines BCB message at the 16KB offset of
-	 * misc partition while the Google defines it at 0x00 offset.
+	 * get android os version:
 	 *
-	 * From Android-Q, the 0x00 offset is mandary on Google VTS, so that
-	 * this is a compatibility according to android image 'os_version'.
+	 * There are two types of misc.img:
+	 *	Rockchip platforms defines BCB message at the 16KB offset of
+	 *	misc.img except for the Android version >= 10. Because Google
+	 *	defines it at 0x00 offset, and from Android-10 it becoms mandary
+	 *	on Google VTS.
+	 *
+	 * So we must get android 'os_version' to identify which type we
+	 * are using, then we could able to use rockchip_get_boot_mode()
+	 * which reads BCB from misc.img.
 	 */
 #ifdef CONFIG_RKIMG_BOOTLOADER
-	return (android_image_major_version() >= ANDROID_Q_VER) ? 0x00 : 0x20;
+	if (android_version < 0)
+		android_version = android_version_init();
+
+	return (android_version >= 10) ? 0x00 : 0x20;
 #else
 	return 0x00;
 #endif
 }
+
+#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
+int android_image_init_resource(struct blk_desc *desc,
+				disk_partition_t *out_part,
+				ulong *out_blk_offset)
+{
+	struct andr_img_hdr *hdr = NULL;
+	const char *part_name = ANDROID_PARTITION_BOOT;
+	disk_partition_t part;
+	ulong offset;
+	int ret = 0;
+
+	if (!desc)
+		return -ENODEV;
+
+#ifndef CONFIG_ANDROID_AB
+	if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY)
+		part_name = ANDROID_PARTITION_RECOVERY;
+#endif
+	if (part_get_info_by_name(desc, part_name, &part) < 0)
+		return -ENOENT;
+
+	hdr = populate_andr_img_hdr(desc, &part);
+	if (!hdr)
+		return -EINVAL;
+
+	if (hdr->header_version >= 2 && hdr->dtb_size)
+		env_update("bootargs", "androidboot.dtb_idx=0");
+
+	if (hdr->header_version <= 2) {
+		offset = hdr->page_size +
+			ALIGN(hdr->kernel_size, hdr->page_size) +
+			ALIGN(hdr->ramdisk_size, hdr->page_size);
+		*out_part = part;
+		*out_blk_offset = DIV_ROUND_UP(offset, desc->blksz);
+	} else {
+		ret = -EINVAL;
+	}
+	free(hdr);
+
+	return ret;
+}
+#endif
 
 static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr)
 {
@@ -323,7 +408,7 @@
 
 typedef enum {
 	IMG_KERNEL,
-	IMG_RAMDISK,
+	IMG_RAMDISK,	/* within boot.img or init_boot.img(Android-13 or later) */
 	IMG_SECOND,
 	IMG_RECOVERY_DTBO,
 	IMG_RK_DTB,	/* within resource.img in second position */
@@ -343,7 +428,9 @@
 {
 	struct blk_desc *desc = rockchip_get_bootdev();
 	disk_partition_t part_vendor_boot;
+	disk_partition_t part_init_boot;
 	__maybe_unused u32 typesz;
+	u32 andr_version = (hdr->os_version >> 25) & 0x7f;
 	ulong pgsz = hdr->page_size;
 	ulong blksz = desc->blksz;
 	ulong blkcnt, blkoff;
@@ -352,6 +439,7 @@
 	ulong extra = 0;
 	ulong length;
 	void *buffer;
+	void *tmp = NULL;
 	int ret = 0;
 
 	switch (img) {
@@ -366,17 +454,20 @@
 			return -ENOMEM;
 		break;
 	case IMG_VENDOR_RAMDISK:
-		if (part_get_info_by_name(desc,
-					  ANDROID_PARTITION_VENDOR_BOOT,
-					  &part_vendor_boot) < 0) {
-			printf("No vendor boot partition\n");
-			return -ENOENT;
+		if (hdr->vendor_boot_buf) {
+			ram_base = hdr->vendor_boot_buf;
+		} else {
+			if (part_get_info_by_name(desc,
+						  ANDROID_PARTITION_VENDOR_BOOT,
+						  &part_vendor_boot) < 0) {
+				printf("No vendor boot partition\n");
+				return -ENOENT;
+			}
+			ram_base = 0;
 		}
-		/* Always load vendor boot from storage: avb full load boot/recovery */
+
 		blkstart = part_vendor_boot.start;
 		pgsz = hdr->vendor_page_size;
-		ram_base = 0;
-
 		bsoffs = ALIGN(VENDOR_BOOT_HDRv3_SIZE, pgsz);
 		length = hdr->vendor_ramdisk_size;
 		buffer = (void *)env_get_ulong("ramdisk_addr_r", 16, 0);
@@ -400,7 +491,25 @@
 			return -ENOMEM;
 		break;
 	case IMG_RAMDISK:
-		bsoffs = pgsz + ALIGN(hdr->kernel_size, pgsz);
+		/* get ramdisk from init_boot.img ? */
+		if (hdr->header_version >= 4 && andr_version >= 13) {
+			if (hdr->init_boot_buf) {
+				ram_base = hdr->init_boot_buf;
+			} else {
+				if (part_get_info_by_name(desc,
+				    ANDROID_PARTITION_INIT_BOOT, &part_init_boot) < 0) {
+					printf("No init boot partition\n");
+					return -ENOENT;
+				}
+				blkstart = part_init_boot.start;
+				ram_base = 0;
+			}
+			bsoffs = pgsz;
+		} else {
+			/* get ramdisk from generic boot.img */
+			bsoffs = pgsz + ALIGN(hdr->kernel_size, pgsz);
+		}
+
 		length = hdr->ramdisk_size;
 		buffer = (void *)env_get_ulong("ramdisk_addr_r", 16, 0);
 		blkcnt = DIV_ROUND_UP(hdr->ramdisk_size, blksz);
@@ -412,15 +521,20 @@
 		 *	|    ramdisk     |
 		 *	|----------------|
 		 *
-		 * ramdisk_addr_r v3:
+		 * ramdisk_addr_r v3 (Android-11 and later):
 		 *	|----------------|---------|
 		 *	| vendor-ramdisk | ramdisk |
 		 *	|----------------|---------|
 		 *
-		 * ramdisk_addr_r v4:
+		 * ramdisk_addr_r v4 (Android-12 and later):
 		 *	|----------------|---------|------------|------------|
 		 *	| vendor-ramdisk | ramdisk | bootconfig | bootparams |
 		 *	|----------------|---------|------------|------------|
+		 *
+		 * ramdisk_addr_r v4 + init_boot(Android-13 and later):
+		 *	|----------------|----------------|------------|------------|
+		 *	| vendor-ramdisk | (init_)ramdisk | bootconfig | bootparams |
+		 *	|----------------|----------------|------------|------------|
 		 */
 		if (hdr->header_version >= 3) {
 			buffer += hdr->vendor_ramdisk_size;
@@ -439,17 +553,20 @@
 	case IMG_BOOTCONFIG:
 		if (hdr->header_version < 4)
 			return 0;
-		if (part_get_info_by_name(desc,
-					  ANDROID_PARTITION_VENDOR_BOOT,
-					  &part_vendor_boot) < 0) {
-			printf("No vendor boot partition\n");
-			return -ENOENT;
-		}
 
+		if (hdr->vendor_boot_buf) {
+			ram_base = hdr->vendor_boot_buf;
+		} else {
+			if (part_get_info_by_name(desc,
+						  ANDROID_PARTITION_VENDOR_BOOT,
+						  &part_vendor_boot) < 0) {
+				printf("No vendor boot partition\n");
+				return -ENOENT;
+			}
+			ram_base = 0;
+		}
 		blkstart = part_vendor_boot.start;
 		pgsz = hdr->vendor_page_size;
-		ram_base = 0;
-
 		bsoffs = ALIGN(VENDOR_BOOT_HDRv4_SIZE, pgsz) +
 			 ALIGN(hdr->vendor_ramdisk_size, pgsz) +
 			 ALIGN(hdr->dtb_size, pgsz) +
@@ -471,7 +588,7 @@
 			 ALIGN(hdr->ramdisk_size, pgsz);
 		length = hdr->second_size;
 		blkcnt = DIV_ROUND_UP(hdr->second_size, blksz);
-		buffer = malloc(blkcnt * blksz);
+		buffer = tmp = malloc(blkcnt * blksz);
 		typesz = sizeof(hdr->second_size);
 		break;
 	case IMG_RECOVERY_DTBO:
@@ -481,7 +598,7 @@
 			 ALIGN(hdr->second_size, pgsz);
 		length = hdr->recovery_dtbo_size;
 		blkcnt = DIV_ROUND_UP(hdr->recovery_dtbo_size, blksz);
-		buffer = malloc(blkcnt * blksz);
+		buffer = tmp = malloc(blkcnt * blksz);
 		typesz = sizeof(hdr->recovery_dtbo_size);
 		break;
 	case IMG_DTB:
@@ -492,7 +609,7 @@
 			 ALIGN(hdr->recovery_dtbo_size, pgsz);
 		length = hdr->dtb_size;
 		blkcnt = DIV_ROUND_UP(hdr->dtb_size, blksz);
-		buffer = malloc(blkcnt * blksz);
+		buffer = tmp = malloc(blkcnt * blksz);
 		typesz = sizeof(hdr->dtb_size);
 		break;
 	case IMG_RK_DTB:
@@ -540,14 +657,19 @@
 	if (hdr->header_version < 3) {
 #ifdef CONFIG_ANDROID_BOOT_IMAGE_HASH
 #ifdef CONFIG_DM_CRYPTO
-		crypto_sha_update(crypto, (u32 *)buffer, length);
-		crypto_sha_update(crypto, (u32 *)&length, typesz);
+		if (crypto) {
+			crypto_sha_update(crypto, (u32 *)buffer, length);
+			crypto_sha_update(crypto, (u32 *)&length, typesz);
+		}
 #else
 		sha1_update(&sha1_ctx, (void *)buffer, length);
 		sha1_update(&sha1_ctx, (void *)&length, typesz);
 #endif
 #endif
 	}
+
+	if (tmp)
+		free(tmp);
 
 	return 0;
 }
@@ -605,7 +727,12 @@
 		return -1;
 
 #ifdef CONFIG_ANDROID_BOOT_IMAGE_HASH
-	if (hdr->header_version < 3) {
+	int verify = 1;
+
+#ifdef CONFIG_MP_BOOT
+	verify = mpb_post(3);
+#endif
+	if (hdr->header_version < 3 && verify) {
 		struct udevice *dev = NULL;
 		uchar hash[20];
 #ifdef CONFIG_DM_CRYPTO
@@ -936,6 +1063,7 @@
 			      const disk_partition_t *boot_img)
 {
 	struct boot_img_hdr_v34 *boot_hdr;
+	disk_partition_t part;
 	long blk_cnt, blks_read;
 
 	blk_cnt = BLK_CNT(sizeof(struct boot_img_hdr_v34), dev_desc->blksz);
@@ -960,6 +1088,13 @@
 		printf("boot header %d, is not >= v3.\n",
 		       boot_hdr->header_version);
 		return NULL;
+	}
+
+	/* Start from android-13 GKI, it doesn't assign 'os_version' */
+	if (boot_hdr->header_version >= 4 && boot_hdr->os_version == 0) {
+		if (part_get_info_by_name(dev_desc,
+				ANDROID_PARTITION_INIT_BOOT, &part) > 0)
+			boot_hdr->os_version = 13 << 25;
 	}
 
 	return boot_hdr;
@@ -1003,19 +1138,26 @@
 	return vboot_hdr;
 }
 
-static int populate_boot_info(const struct boot_img_hdr_v34 *boot_hdr,
-			      const struct vendor_boot_img_hdr_v34 *vendor_hdr,
-			      struct andr_img_hdr *hdr)
+int populate_boot_info(const struct boot_img_hdr_v34 *boot_hdr,
+		       const struct vendor_boot_img_hdr_v34 *vendor_boot_hdr,
+		       const struct boot_img_hdr_v34 *init_boot_hdr,
+		       struct andr_img_hdr *hdr, bool save_hdr)
 {
 	memset(hdr->magic, 0, ANDR_BOOT_MAGIC_SIZE);
 	memcpy(hdr->magic, boot_hdr->magic, ANDR_BOOT_MAGIC_SIZE);
 
 	hdr->kernel_size = boot_hdr->kernel_size;
-	/* don't use vendor_hdr->kernel_addr, we prefer "hdr + hdr->page_size" */
+	/* don't use vendor_boot_hdr->kernel_addr, we prefer "hdr + hdr->page_size" */
 	hdr->kernel_addr = ANDROID_IMAGE_DEFAULT_KERNEL_ADDR;
-	/* generic ramdisk: immediately following the vendor ramdisk */
-	hdr->boot_ramdisk_size = boot_hdr->ramdisk_size;
-	hdr->ramdisk_size = boot_hdr->ramdisk_size;
+
+	/*
+	 * generic ramdisk: immediately following the vendor ramdisk.
+	 * It can be from init_boot.img or boot.img.
+	 */
+	if (init_boot_hdr)
+		hdr->ramdisk_size = init_boot_hdr->ramdisk_size;
+	else
+		hdr->ramdisk_size = boot_hdr->ramdisk_size;
 
 	/* actually, useless */
 	hdr->ramdisk_addr = env_get_ulong("ramdisk_addr_r", 16, 0);
@@ -1024,7 +1166,7 @@
 	hdr->second_size = 0;
 	hdr->second_addr = 0;
 
-	hdr->tags_addr = vendor_hdr->tags_addr;
+	hdr->tags_addr = vendor_boot_hdr->tags_addr;
 
 	/* fixed in v3 */
 	hdr->page_size = 4096;
@@ -1032,7 +1174,7 @@
 	hdr->os_version = boot_hdr->os_version;
 
 	memset(hdr->name, 0, ANDR_BOOT_NAME_SIZE);
-	strncpy(hdr->name, (const char *)vendor_hdr->name, ANDR_BOOT_NAME_SIZE);
+	strncpy(hdr->name, (const char *)vendor_boot_hdr->name, ANDR_BOOT_NAME_SIZE);
 
 	/* removed in v3 */
 	memset(hdr->cmdline, 0, ANDR_BOOT_ARGS_SIZE);
@@ -1042,14 +1184,14 @@
 	hdr->recovery_dtbo_offset = 0;
 
 	hdr->header_size = boot_hdr->header_size;
-	hdr->dtb_size = vendor_hdr->dtb_size;
-	hdr->dtb_addr = vendor_hdr->dtb_addr;
+	hdr->dtb_size = vendor_boot_hdr->dtb_size;
+	hdr->dtb_addr = vendor_boot_hdr->dtb_addr;
 
 	/* boot_img_hdr_v34 fields */
-	hdr->vendor_ramdisk_size = vendor_hdr->vendor_ramdisk_size;
-	hdr->vendor_page_size = vendor_hdr->page_size;
-	hdr->vendor_header_version = vendor_hdr->header_version;
-	hdr->vendor_header_size = vendor_hdr->header_size;
+	hdr->vendor_ramdisk_size = vendor_boot_hdr->vendor_ramdisk_size;
+	hdr->vendor_page_size = vendor_boot_hdr->page_size;
+	hdr->vendor_header_version = vendor_boot_hdr->header_version;
+	hdr->vendor_header_size = vendor_boot_hdr->header_size;
 
 	hdr->total_cmdline = calloc(1, TOTAL_BOOT_ARGS_SIZE);
 	if (!hdr->total_cmdline)
@@ -1057,30 +1199,33 @@
 	strncpy(hdr->total_cmdline, (const char *)boot_hdr->cmdline,
 		sizeof(boot_hdr->cmdline));
 	strncat(hdr->total_cmdline, " ", 1);
-	strncat(hdr->total_cmdline, (const char *)vendor_hdr->cmdline,
-		sizeof(vendor_hdr->cmdline));
+	strncat(hdr->total_cmdline, (const char *)vendor_boot_hdr->cmdline,
+		sizeof(vendor_boot_hdr->cmdline));
 
 	/* new for header v4 */
-	if (vendor_hdr->header_version > 3) {
+	if (vendor_boot_hdr->header_version >= 4) {
 		hdr->vendor_ramdisk_table_size =
-				vendor_hdr->vendor_ramdisk_table_size;
+				vendor_boot_hdr->vendor_ramdisk_table_size;
 		hdr->vendor_ramdisk_table_entry_num =
-				vendor_hdr->vendor_ramdisk_table_entry_num;
+				vendor_boot_hdr->vendor_ramdisk_table_entry_num;
 		hdr->vendor_ramdisk_table_entry_size =
-				vendor_hdr->vendor_ramdisk_table_entry_size;
+				vendor_boot_hdr->vendor_ramdisk_table_entry_size;
 		/*
 		 * If we place additional "androidboot.xxx" parameters after
 		 * bootconfig, this field value should be increased,
 		 * but not over than ANDROID_ADDITION_BOOTCONFIG_PARAMS_MAX_SIZE.
 		 */
 		hdr->vendor_bootconfig_size =
-				vendor_hdr->vendor_bootconfig_size;
+				vendor_boot_hdr->vendor_bootconfig_size;
 	} else {
 		hdr->vendor_ramdisk_table_size = 0;
 		hdr->vendor_ramdisk_table_entry_num = 0;
 		hdr->vendor_ramdisk_table_entry_size = 0;
 		hdr->vendor_bootconfig_size = 0;
 	}
+
+	hdr->init_boot_buf = save_hdr ? (void *)init_boot_hdr : 0;
+	hdr->vendor_boot_buf = save_hdr ? (void *)vendor_boot_hdr : 0;
 
 	if (hdr->page_size < sizeof(*hdr)) {
 		printf("android hdr is over size\n");
@@ -1110,10 +1255,13 @@
 					   disk_partition_t *part_boot)
 {
 	disk_partition_t part_vendor_boot;
-	struct vendor_boot_img_hdr_v34 *vboot_hdr;
-	struct boot_img_hdr_v34 *boot_hdr;
-	struct andr_img_hdr *andr_hdr;
+	disk_partition_t part_init_boot;
+	struct vendor_boot_img_hdr_v34 *vboot_hdr = NULL;
+	struct boot_img_hdr_v34 *iboot_hdr = NULL;
+	struct boot_img_hdr_v34 *boot_hdr = NULL;
+	struct andr_img_hdr *andr_hdr = NULL;
 	int header_version;
+	int andr_version;
 
 	if (!dev_desc || !part_boot)
 		return NULL;
@@ -1134,6 +1282,7 @@
 
 	header_version = andr_hdr->header_version;
 	free(andr_hdr);
+	andr_hdr = NULL;
 
 	if (header_version < 3) {
 		return extract_boot_image_v012_header(dev_desc, part_boot);
@@ -1150,6 +1299,23 @@
 		if (!boot_hdr || !vboot_hdr)
 			goto image_load_exit;
 
+		andr_version = (boot_hdr->os_version >> 25) & 0x7f;
+		if (header_version >= 4 && andr_version >= 13) {
+			if (part_get_info_by_name(dev_desc,
+						  ANDROID_PARTITION_INIT_BOOT,
+						  &part_init_boot) < 0) {
+				printf("No init boot partition\n");
+				return NULL;
+			}
+			iboot_hdr = extract_boot_image_v34_header(dev_desc, &part_init_boot);
+			if (!iboot_hdr)
+				goto image_load_exit;
+			if (!iboot_hdr->ramdisk_size) {
+				printf("No ramdisk in init boot partition\n");
+				goto image_load_exit;
+			}
+		}
+
 		andr_hdr = (struct andr_img_hdr *)
 				malloc(sizeof(struct andr_img_hdr));
 		if (!andr_hdr) {
@@ -1157,21 +1323,21 @@
 			goto image_load_exit;
 		}
 
-		if (populate_boot_info(boot_hdr, vboot_hdr, andr_hdr)) {
+		if (populate_boot_info(boot_hdr, vboot_hdr,
+				       iboot_hdr, andr_hdr, false)) {
 			printf("populate boot info failed\n");
 			goto image_load_exit;
 		}
 
-		free(boot_hdr);
-		free(vboot_hdr);
+image_load_exit:
+		if (boot_hdr)
+			free(boot_hdr);
+		if (iboot_hdr)
+			free(iboot_hdr);
+		if (vboot_hdr)
+			free(vboot_hdr);
 
 		return andr_hdr;
-
-image_load_exit:
-		free(boot_hdr);
-		free(vboot_hdr);
-
-		return NULL;
 	}
 
 	return NULL;
diff --git a/u-boot/common/image-fdt.c b/u-boot/common/image-fdt.c
index 2c79b96..2884880 100644
--- a/u-boot/common/image-fdt.c
+++ b/u-boot/common/image-fdt.c
@@ -78,39 +78,16 @@
 }
 #endif
 
-/**
- * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable
- * @lmb: pointer to lmb handle, will be used for memory mgmt
- * @fdt_blob: pointer to fdt blob base address
- *
- * Adds the memreserve regions in the dtb to the lmb block.  Adding the
- * memreserve regions prevents u-boot from using them to store the initrd
- * or the fdt blob.
- */
-void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
+void boot_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
 {
-	uint64_t addr, size;
-	int i, total;
 	int rsv_offset, offset;
 	fdt_size_t rsv_size;
 	fdt_addr_t rsv_addr;
-	/* we needn't repeat do reserve, do_bootm_linux would call this again */
-	static int rsv_done;
 	const void *prop;
+	int i = 0;
 
-	if (fdt_check_header(fdt_blob) != 0 || rsv_done)
+	if (fdt_check_header(fdt_blob) != 0)
 		return;
-
-	rsv_done = 1;
-
-	total = fdt_num_mem_rsv(fdt_blob);
-	for (i = 0; i < total; i++) {
-		if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0)
-			continue;
-		printf("   reserving fdt memory region: addr=%llx size=%llx\n",
-		       (unsigned long long)addr, (unsigned long long)size);
-		lmb_reserve(lmb, addr, size);
-	}
 
 	rsv_offset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory");
 	if (rsv_offset == -FDT_ERR_NOTFOUND)
@@ -128,13 +105,56 @@
 							      &rsv_size, false);
 		if (rsv_addr == FDT_ADDR_T_NONE || !rsv_size)
 			continue;
-		printf("  'reserved-memory' %s: addr=%llx size=%llx\n",
-			fdt_get_name(fdt_blob, offset, NULL),
-			(unsigned long long)rsv_addr, (unsigned long long)rsv_size);
-		lmb_reserve(lmb, rsv_addr, rsv_size);
+
+		i++;
+		/* be quiet while reserve */
+		if (lmb) {
+			lmb_reserve(lmb, rsv_addr, rsv_size);
+		} else {
+			if (i == 1)
+				printf("## reserved-memory:\n");
+
+			printf("  %s: addr=%llx size=%llx\n",
+				fdt_get_name(fdt_blob, offset, NULL),
+				(unsigned long long)rsv_addr, (unsigned long long)rsv_size);
+		}
 	}
 }
 
+/**
+ * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable
+ * @lmb: pointer to lmb handle, will be used for memory mgmt
+ * @fdt_blob: pointer to fdt blob base address
+ *
+ * Adds the memreserve regions in the dtb to the lmb block.  Adding the
+ * memreserve regions prevents u-boot from using them to store the initrd
+ * or the fdt blob.
+ */
+void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
+{
+	uint64_t addr, size;
+	int i, total;
+	/* we needn't repeat do reserve, do_bootm_linux would call this again */
+	static int rsv_done;
+
+	if (fdt_check_header(fdt_blob) != 0 || rsv_done)
+		return;
+
+	rsv_done = 1;
+
+	total = fdt_num_mem_rsv(fdt_blob);
+	for (i = 0; i < total; i++) {
+		if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0)
+			continue;
+		printf("   reserving fdt memory region: addr=%llx size=%llx\n",
+		       (unsigned long long)addr, (unsigned long long)size);
+		lmb_reserve(lmb, addr, size);
+	}
+
+	/* lmb_reserve() for "reserved-memory" */
+	boot_mem_rsv_regions(lmb, fdt_blob);
+}
+
 #ifdef CONFIG_SYSMEM
 /**
  * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable
diff --git a/u-boot/common/image-fit.c b/u-boot/common/image-fit.c
index d364788..0ee9eab 100644
--- a/u-boot/common/image-fit.c
+++ b/u-boot/common/image-fit.c
@@ -2175,6 +2175,7 @@
 		fit_image_check_os(fit, noffset, IH_OS_ARM_TRUSTED_FIRMWARE) ||
 		fit_image_check_os(fit, noffset, IH_OS_OP_TEE) ||
 		fit_image_check_os(fit, noffset, IH_OS_U_BOOT) ||
+		fit_image_check_os(fit, noffset, IH_OS_QNX) ||
 		fit_image_check_os(fit, noffset, IH_OS_OPENRTOS);
 
 	/*
diff --git a/u-boot/common/image-sparse.c b/u-boot/common/image-sparse.c
index f1382bd..505428e 100644
--- a/u-boot/common/image-sparse.c
+++ b/u-boot/common/image-sparse.c
@@ -56,10 +56,10 @@
 	lbaint_t blk;
 	lbaint_t blkcnt;
 	lbaint_t blks;
-	uint32_t bytes_written = 0;
+	uint64_t bytes_written = 0;
 	unsigned int chunk;
 	unsigned int offset;
-	unsigned int chunk_data_sz;
+	uint64_t chunk_data_sz;
 	uint32_t *fill_buf = NULL;
 	uint32_t fill_val;
 	sparse_header_t *sparse_header;
@@ -130,8 +130,8 @@
 				 sizeof(chunk_header_t));
 		}
 
-		chunk_data_sz = sparse_header->blk_sz * chunk_header->chunk_sz;
-		blkcnt = chunk_data_sz / info->blksz;
+		chunk_data_sz = ((u64)sparse_header->blk_sz) * chunk_header->chunk_sz;
+		blkcnt = DIV_ROUND_UP_ULL(chunk_data_sz, info->blksz);
 		switch (chunk_header->chunk_type) {
 		case CHUNK_TYPE_RAW:
 			if (chunk_header->total_sz !=
@@ -161,7 +161,7 @@
 				return;
 			}
 			blk += blks;
-			bytes_written += blkcnt * info->blksz;
+			bytes_written += ((u64)blkcnt) * info->blksz;
 			total_blocks += chunk_header->chunk_sz;
 			data += chunk_data_sz;
 			break;
@@ -222,8 +222,9 @@
 				blk += blks;
 				i += j;
 			}
-			bytes_written += blkcnt * info->blksz;
-			total_blocks += chunk_data_sz / sparse_header->blk_sz;
+			bytes_written += ((u64)blkcnt) * info->blksz;
+			total_blocks += DIV_ROUND_UP_ULL(chunk_data_sz,
+							 sparse_header->blk_sz);
 			free(fill_buf);
 			break;
 
@@ -253,7 +254,7 @@
 
 	debug("Wrote %d blocks, expected to write %d blocks\n",
 	      total_blocks, sparse_header->total_blks);
-	printf("........ wrote %u bytes to '%s'\n", bytes_written, part_name);
+	printf("........ wrote %llu bytes to '%s'\n", bytes_written, part_name);
 
 	if (total_blocks != sparse_header->total_blks)
 		fastboot_fail("sparse image write failure", response);
diff --git a/u-boot/common/mp_boot_rk3528.S b/u-boot/common/mp_boot_rk3528.S
new file mode 100644
index 0000000..6d7c51a
--- /dev/null
+++ b/u-boot/common/mp_boot_rk3528.S
@@ -0,0 +1,9682 @@
+	.arch armv8-a+nosimd
+	.file	"mp_boot.c"
+	.text
+.Ltext0:
+	.cfi_sections	.debug_frame
+	.section	.text.mpb_task_set_state,"ax",@progbits
+	.align	2
+	.type	mpb_task_set_state, %function
+mpb_task_set_state:
+.LFB225:
+	.file 1 "common/mp_boot.c"
+	.loc 1 227 0
+	.cfi_startproc
+.LVL0:
+.LBB30:
+.LBB31:
+	.loc 1 146 0
+	mov	x4, 136314880
+	mov	w3, 1
+	lsl	w3, w3, w1
+	ldr	w5, [x4]
+.LBE31:
+.LBE30:
+	.loc 1 232 0
+	tst	w3, w5
+	beq	.L11
+.LBB32:
+.LBB33:
+	.loc 1 199 0
+	uxtw	x5, w0
+	mov	x3, 328
+	umull	x0, w0, w3
+.LVL1:
+	madd	x4, x5, x3, x4
+	mov	w3, 0
+	ldrb	w6, [x4, 328]
+	mov	x4, 20
+	movk	x4, 0x820, lsl 16
+	add	x4, x0, x4
+.L3:
+.LVL2:
+	cmp	w3, w6
+	blt	.L5
+.LVL3:
+.L11:
+.LBE33:
+.LBE32:
+	.loc 1 252 0
+	mov	w0, 0
+	ret
+.LVL4:
+.L5:
+.LBB35:
+.LBB34:
+	.loc 1 200 0
+	ldr	w7, [x4], 40
+	cmp	w1, w7
+	beq	.L4
+	.loc 1 199 0
+	add	w3, w3, 1
+.LVL5:
+	b	.L3
+.L4:
+.LVL6:
+.LBE34:
+.LBE35:
+	.loc 1 239 0
+	mov	x8, 328
+	sxtw	x4, w3
+	mov	x7, 40
+	.loc 1 240 0
+	add	x0, x0, 16
+	.loc 1 239 0
+	mul	x5, x5, x8
+	.loc 1 227 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 239 0
+	nop // between mem op and mult-accumulate
+	madd	x4, x4, x7, x5
+	mov	x6, 136314880
+	.loc 1 240 0
+	smaddl	x3, w3, w7, x0
+	.loc 1 227 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 239 0
+	add	x4, x6, x4
+	.loc 1 227 0
+	.loc 1 239 0
+	add	w1, w1, w2
+.LVL7:
+	.loc 1 240 0
+	add	x0, x3, x6
+	.loc 1 239 0
+	str	w1, [x4, 16]
+	.loc 1 241 0
+	add	x1, x0, 4
+	bl	flush_dcache_range
+.LVL8:
+	.loc 1 252 0
+	mov	w0, 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE225:
+	.size	mpb_task_set_state, .-mpb_task_set_state
+	.section	.text.mpb_quit_load_image,"ax",@progbits
+	.align	2
+	.type	mpb_quit_load_image, %function
+mpb_quit_load_image:
+.LFB238:
+	.loc 1 560 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	.loc 1 563 0
+	bl	rockchip_get_boot_mode
+.LVL9:
+	cmp	w0, 1
+	bne	.L15
+	mov	w19, w0
+.LBB38:
+.LBB39:
+	.loc 1 564 0
+	adrp	x0, .LANCHOR0
+	ldr	w1, [x0, #:lo12:.LANCHOR0]
+	cbnz	w1, .L13
+	.loc 1 565 0
+	str	w19, [x0, #:lo12:.LANCHOR0]
+	.loc 1 566 0
+	adrp	x0, .LC1
+	add	x0, x0, :lo12:.LC1
+	bl	printf
+.LVL10:
+.L13:
+.LBE39:
+.LBE38:
+	.loc 1 573 0
+	mov	w0, w19
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+.L15:
+	.cfi_restore_state
+	.loc 1 572 0
+	mov	w19, 0
+	b	.L13
+	.cfi_endproc
+.LFE238:
+	.size	mpb_quit_load_image, .-mpb_quit_load_image
+	.section	.text.spl_init_display,"ax",@progbits
+	.align	2
+	.weak	spl_init_display
+	.type	spl_init_display, %function
+spl_init_display:
+.LFB252:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE252:
+	.size	spl_init_display, .-spl_init_display
+	.section	.text.spl_load_baseparamter,"ax",@progbits
+	.align	2
+	.weak	spl_load_baseparamter
+	.type	spl_load_baseparamter, %function
+spl_load_baseparamter:
+.LFB250:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE250:
+	.size	spl_load_baseparamter, .-spl_load_baseparamter
+	.section	.text.spl_load_fit,"ax",@progbits
+	.align	2
+	.weak	spl_load_fit
+	.type	spl_load_fit, %function
+spl_load_fit:
+.LFB248:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE248:
+	.size	spl_load_fit, .-spl_load_fit
+	.section	.text.spl_load_android,"ax",@progbits
+	.align	2
+	.weak	spl_load_android
+	.type	spl_load_android, %function
+spl_load_android:
+.LFB246:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE246:
+	.size	spl_load_android, .-spl_load_android
+	.section	.text.spl_hash_android,"ax",@progbits
+	.align	2
+	.weak	spl_hash_android
+	.type	spl_hash_android, %function
+spl_hash_android:
+.LFB244:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE244:
+	.size	spl_hash_android, .-spl_hash_android
+	.section	.text.spl_dummy,"ax",@progbits
+	.align	2
+	.weak	spl_dummy
+	.type	spl_dummy, %function
+spl_dummy:
+.LFB218:
+	.loc 1 52 0
+	.cfi_startproc
+.LVL11:
+	.loc 1 52 0
+	mov	w0, 0
+.LVL12:
+	ret
+	.cfi_endproc
+.LFE218:
+	.size	spl_dummy, .-spl_dummy
+	.section	.text.mpb_task_is_done,"ax",@progbits
+	.align	2
+	.global	mpb_task_is_done
+	.type	mpb_task_is_done, %function
+mpb_task_is_done:
+.LFB226:
+	.loc 1 261 0
+	.cfi_startproc
+.LVL13:
+.LBB40:
+.LBB41:
+	.loc 1 146 0
+	mov	x2, 136314880
+	mov	w1, 1
+	lsl	w1, w1, w0
+	ldr	w2, [x2]
+.LBE41:
+.LBE40:
+	.loc 1 265 0
+	tst	w1, w2
+	beq	.L39
+	.loc 1 261 0
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	mov	w19, w0
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	.loc 1 275 0
+	mov	w24, -559087616
+	.loc 1 261 0
+	str	x27, [sp, 80]
+	.loc 1 275 0
+	add	w24, w0, w24
+	.cfi_offset 27, -16
+	.loc 1 277 0
+	sub	w27, w0, #65536
+	.loc 1 261 0
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	mov	x21, 0
+.LVL14:
+.L31:
+	mov	x22, 16
+	mov	x20, 20
+	.loc 1 269 0
+	mov	x26, 328
+	movk	x22, 0x820, lsl 16
+	movk	x20, 0x820, lsl 16
+	add	x22, x21, x22
+	add	x20, x21, x20
+	.loc 1 261 0
+	mov	w23, 0
+	.loc 1 269 0
+	movk	x26, 0x820, lsl 16
+	.loc 1 279 0
+	mov	w25, 1431655765
+	b	.L27
+.LVL15:
+.L30:
+	.loc 1 270 0
+	ldr	w0, [x20]
+	cmp	w19, w0
+	beq	.L26
+.L29:
+	.loc 1 269 0
+	add	w23, w23, 1
+.LVL16:
+	add	x22, x22, 40
+	add	x20, x20, 40
+.LVL17:
+.L27:
+	.loc 1 269 0 is_stmt 0 discriminator 1
+	ldrb	w0, [x21, x26]
+	cmp	w23, w0
+	blt	.L30
+.LVL18:
+	add	x21, x21, 328
+	.loc 1 268 0 is_stmt 1 discriminator 2
+	cmp	x21, 1312
+	bne	.L31
+	.loc 1 286 0
+	mov	w0, 0
+.L23:
+	.loc 1 287 0
+	ldp	x19, x20, [sp, 16]
+.LVL19:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL20:
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+.LVL21:
+	ldp	x29, x30, [sp], 96
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 27
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL22:
+.L26:
+	.cfi_restore_state
+	.loc 1 272 0
+	mov	x0, x22
+	mov	x1, x20
+	bl	invalidate_dcache_range
+.LVL23:
+	.loc 1 275 0
+	ldr	w0, [x22]
+	cmp	w0, w24
+	beq	.L32
+	.loc 1 277 0
+	cmp	w0, w27
+	beq	.L24
+	.loc 1 279 0
+	add	w1, w19, w25
+	cmp	w0, w1
+	bne	.L29
+	.loc 1 280 0
+	mov	w0, -2
+	b	.L23
+.L24:
+	.loc 1 266 0
+	mov	w0, -1
+	b	.L23
+.L32:
+	.loc 1 276 0
+	mov	w0, 1
+	b	.L23
+.LVL24:
+.L39:
+	.cfi_def_cfa 31, 0
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 27
+	.cfi_restore 29
+	.cfi_restore 30
+	.loc 1 266 0
+	mov	w0, -1
+.LVL25:
+	.loc 1 287 0
+	ret
+	.cfi_endproc
+.LFE226:
+	.size	mpb_task_is_done, .-mpb_task_is_done
+	.section	.text.mpb_task_dump,"ax",@progbits
+	.align	2
+	.global	mpb_task_dump
+	.type	mpb_task_dump, %function
+mpb_task_dump:
+.LFB227:
+	.loc 1 290 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	.loc 1 294 0
+	mov	x0, 136314880
+	.loc 1 290 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 294 0
+	ldr	x1, [x0, 1360]
+	ldr	x2, [x0, 1368]
+	adrp	x0, .LC2
+	.loc 1 290 0
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.loc 1 294 0
+	mov	x20, 20
+	.loc 1 290 0
+	stp	x23, x24, [sp, 48]
+	.loc 1 294 0
+	movk	x20, 0x820, lsl 16
+	.loc 1 290 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.loc 1 299 0
+	adrp	x23, .LANCHOR1
+	adrp	x24, .LC3
+	.loc 1 296 0
+	mov	w21, 0
+	.loc 1 299 0
+	add	x23, x23, :lo12:.LANCHOR1
+	add	x24, x24, :lo12:.LC3
+	.loc 1 294 0
+	add	x0, x0, :lo12:.LC2
+	.loc 1 290 0
+	str	x25, [sp, 64]
+	.cfi_offset 25, -16
+	.loc 1 294 0
+	bl	printf
+.LVL26:
+.L43:
+	.loc 1 290 0
+	mov	x19, x20
+	mov	w22, 0
+	.loc 1 300 0
+	adrp	x25, .LC4
+	b	.L46
+.LVL27:
+.L44:
+	.loc 1 299 0 discriminator 3
+	ldr	w2, [x19]
+	mov	w1, w21
+	mov	x0, x24
+	.loc 1 297 0 discriminator 3
+	add	w22, w22, 1
+.LVL28:
+	add	x19, x19, 40
+	.loc 1 299 0 discriminator 3
+	ldr	x3, [x23, w2, uxtw 3]
+	bl	printf
+.LVL29:
+	.loc 1 300 0 discriminator 3
+	ldr	w1, [x19, -40]
+	add	x0, x25, :lo12:.LC4
+	bl	printf
+.LVL30:
+	.loc 1 301 0 discriminator 3
+	ldr	x1, [x19, -52]
+	adrp	x0, .LC5
+	add	x0, x0, :lo12:.LC5
+	bl	printf
+.LVL31:
+	.loc 1 302 0 discriminator 3
+	ldr	w1, [x19, -44]
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
+	bl	printf
+.LVL32:
+	.loc 1 303 0 discriminator 3
+	ldr	w1, [x19, -28]
+	adrp	x0, .LC7
+	add	x0, x0, :lo12:.LC7
+	bl	printf
+.LVL33:
+	.loc 1 304 0 discriminator 3
+	ldr	x1, [x19, -20]
+	adrp	x0, .LC8
+	add	x0, x0, :lo12:.LC8
+	bl	printf
+.LVL34:
+	.loc 1 305 0 discriminator 3
+	ldr	w1, [x19, -36]
+	adrp	x0, .LC9
+	add	x0, x0, :lo12:.LC9
+	bl	printf
+.LVL35:
+	.loc 1 306 0 discriminator 3
+	ldr	w1, [x19, -32]
+	adrp	x0, .LC10
+	add	x0, x0, :lo12:.LC10
+	bl	printf
+.LVL36:
+.L46:
+	.loc 1 297 0 discriminator 1
+	ldrb	w0, [x20, 308]
+	cmp	w22, w0
+	blt	.L44
+	.loc 1 296 0 discriminator 2
+	add	w21, w21, 1
+.LVL37:
+	add	x20, x20, 328
+	cmp	w21, 4
+	bne	.L43
+	.loc 1 310 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL38:
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE227:
+	.size	mpb_task_dump, .-mpb_task_dump
+	.section	.text.core_task_run.part.2,"ax",@progbits
+	.align	2
+	.type	core_task_run.part.2, %function
+core_task_run.part.2:
+.LFB242:
+	.loc 1 370 0
+	.cfi_startproc
+.LVL39:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	mov	w19, w0
+	stp	x21, x22, [sp, 32]
+	mov	w20, w2
+.LVL40:
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	and	x22, x1, 255
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -16
+	.cfi_offset 26, -8
+.LBB52:
+.LBB53:
+	.loc 1 319 0
+	cbz	w3, .L49
+	mov	w25, w3
+	mov	w23, 0
+	mov	w21, 0
+	.loc 1 324 0
+	mov	w26, 1
+.LVL41:
+.L54:
+	lsl	w0, w26, w21
+	tst	w0, w25
+	beq	.L50
+.L51:
+	.loc 1 319 0
+	mov	w24, 20000
+.L52:
+.LVL42:
+	.loc 1 329 0
+	mov	w0, w21
+	bl	mpb_task_is_done
+.LVL43:
+	cbz	w0, .L53
+	.loc 1 344 0
+	mov	w0, w21
+	bl	mpb_task_is_done
+.LVL44:
+	.loc 1 345 0
+	cmp	w0, 0
+	cinc	w23, w23, lt
+.LVL45:
+.L50:
+	.loc 1 323 0
+	add	w21, w21, 1
+.LVL46:
+	cmp	w21, 8
+	bne	.L54
+.LVL47:
+.LBE53:
+.LBE52:
+	.loc 1 387 0
+	cbz	w23, .L49
+.LVL48:
+	.loc 1 389 0
+	uxtw	x1, w19
+	mov	x2, 328
+	sxtw	x0, w22
+	mul	x1, x1, x2
+	mov	x2, 40
+	madd	x0, x0, x2, x1
+	mov	x1, 136314880
+	add	x0, x1, x0
+	ldr	w0, [x0, 28]
+	cbnz	w0, .L55
+.LVL49:
+.L56:
+	.loc 1 410 0
+	mov	w2, w20
+	mov	w1, w19
+	adrp	x0, .LC12
+	add	x0, x0, :lo12:.LC12
+	bl	printf
+.LVL50:
+	.loc 1 374 0
+	mov	w21, 0
+	.loc 1 411 0
+	mov	w2, 1431655765
+	mov	w1, w20
+	mov	w0, w19
+	bl	mpb_task_set_state
+.LVL51:
+	b	.L62
+.LVL52:
+.L53:
+.LBB55:
+.LBB54:
+	.loc 1 330 0
+	mov	x0, 100
+	bl	udelay
+.LVL53:
+	.loc 1 333 0
+	subs	w24, w24, #1
+.LVL54:
+	bne	.L52
+.LVL55:
+	.loc 1 337 0
+	bl	mpb_task_dump
+.LVL56:
+	b	.L51
+.LVL57:
+.L49:
+.LBE54:
+.LBE55:
+	.loc 1 392 0
+	uxtw	x1, w19
+	mov	x2, 328
+	sxtw	x0, w22
+	mul	x1, x1, x2
+	mov	x2, 40
+	madd	x0, x0, x2, x1
+	mov	x1, 136314880
+	add	x0, x1, x0
+	ldr	w0, [x0, 28]
+	cbnz	w0, .L56
+.L55:
+.LVL58:
+	.loc 1 397 0
+	mov	w2, w20
+	mov	w1, w19
+	adrp	x0, .LC13
+	add	x0, x0, :lo12:.LC13
+	bl	printf
+.LVL59:
+	.loc 1 401 0
+	uxtw	x24, w19
+	.loc 1 398 0
+	bl	get_ticks
+.LVL60:
+	mov	x23, x0
+.LVL61:
+	.loc 1 400 0
+	mov	w2, 286331153
+	mov	w1, w20
+	mov	w0, w19
+.LVL62:
+	bl	mpb_task_set_state
+.LVL63:
+	.loc 1 401 0
+	mov	x1, 328
+	mov	x0, 40
+	mul	x1, x24, x1
+	madd	x1, x22, x0, x1
+	mov	x0, 8
+	movk	x0, 0x820, lsl 16
+	ldr	x1, [x0, x1]
+	mov	x0, 1320
+	movk	x0, 0x820, lsl 16
+	blr	x1
+.LVL64:
+	mov	w21, w0
+.LVL65:
+	.loc 1 402 0
+	cbnz	w0, .L63
+	.loc 1 405 0
+	mov	w2, -559087616
+	b	.L81
+.L63:
+	.loc 1 403 0
+	mov	w2, -65536
+.L81:
+	.loc 1 405 0
+	mov	w1, w20
+	mov	w0, w19
+.LVL66:
+	bl	mpb_task_set_state
+.LVL67:
+	.loc 1 407 0
+	bl	get_ticks
+.LVL68:
+	sub	x0, x0, x23
+	mov	x4, 24000
+	.loc 1 408 0
+	mov	w3, w21
+	mov	w2, w20
+	mov	w1, w19
+	.loc 1 407 0
+	udiv	x4, x0, x4
+	mov	x0, 328
+	mul	x0, x24, x0
+	mov	x24, 40
+	madd	x24, x22, x24, x0
+	mov	x22, 40
+.LVL69:
+	movk	x22, 0x820, lsl 16
+	.loc 1 408 0
+	adrp	x0, .LC11
+	add	x0, x0, :lo12:.LC11
+	.loc 1 407 0
+	str	x4, [x22, x24]
+	.loc 1 408 0
+	bl	printf
+.LVL70:
+.L62:
+.LBB56:
+.LBB57:
+.LBB58:
+.LBB59:
+	.loc 1 146 0
+	mov	x0, 136314880
+	mov	w1, 1
+	lsl	w1, w1, w20
+	ldr	w2, [x0]
+.LBE59:
+.LBE58:
+	.loc 1 212 0
+	tst	w1, w2
+	beq	.L48
+.LBB60:
+.LBB61:
+	.loc 1 199 0
+	uxtw	x3, w19
+	mov	x1, 328
+	umull	x19, w19, w1
+.LVL71:
+	madd	x0, x3, x1, x0
+	mov	w1, 0
+	ldrb	w2, [x0, 328]
+	mov	x0, 20
+	movk	x0, 0x820, lsl 16
+	add	x0, x19, x0
+.L59:
+.LVL72:
+	cmp	w1, w2
+	blt	.L61
+.LVL73:
+.L48:
+.LBE61:
+.LBE60:
+.LBE57:
+.LBE56:
+	.loc 1 417 0
+	ldp	x19, x20, [sp, 16]
+.LVL74:
+	ldp	x21, x22, [sp, 32]
+.LVL75:
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL76:
+.L61:
+	.cfi_restore_state
+.LBB69:
+.LBB64:
+.LBB63:
+.LBB62:
+	.loc 1 200 0
+	ldr	w4, [x0], 40
+	cmp	w20, w4
+	beq	.L60
+	.loc 1 199 0
+	add	w1, w1, 1
+.LVL77:
+	b	.L59
+.L60:
+.LVL78:
+.LBE62:
+.LBE63:
+	.loc 1 219 0
+	sxtw	x2, w1
+	mov	x5, 328
+	mov	x4, 40
+	.loc 1 220 0
+	add	x19, x19, 32
+	.loc 1 219 0
+	mul	x3, x3, x5
+	mov	x0, 136314880
+	madd	x2, x2, x4, x3
+	.loc 1 220 0
+	smaddl	x19, w1, w4, x19
+	.loc 1 219 0
+	add	x2, x0, x2
+.LBE64:
+.LBE69:
+	.loc 1 417 0
+	ldp	x23, x24, [sp, 48]
+.LBB70:
+.LBB65:
+	.loc 1 220 0
+	add	x0, x19, x0
+.LBE65:
+.LBE70:
+	.loc 1 417 0
+	ldp	x25, x26, [sp, 64]
+.LBB71:
+.LBB66:
+	.loc 1 221 0
+	add	x1, x0, 4
+.LBE66:
+.LBE71:
+	.loc 1 417 0
+	ldp	x19, x20, [sp, 16]
+.LVL79:
+.LBB72:
+.LBB67:
+	.loc 1 219 0
+	str	w21, [x2, 32]
+.LBE67:
+.LBE72:
+	.loc 1 417 0
+	ldp	x21, x22, [sp, 32]
+.LVL80:
+	ldp	x29, x30, [sp], 80
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+.LBB73:
+.LBB68:
+	.loc 1 221 0
+	b	flush_dcache_range
+.LVL81:
+.LBE68:
+.LBE73:
+	.cfi_endproc
+.LFE242:
+	.size	core_task_run.part.2, .-core_task_run.part.2
+	.section	.text.mpb_task_wait_done,"ax",@progbits
+	.align	2
+	.global	mpb_task_wait_done
+	.type	mpb_task_wait_done, %function
+mpb_task_wait_done:
+.LFB230:
+	.loc 1 366 0
+	.cfi_startproc
+.LVL82:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	mov	w19, w0
+.LVL83:
+.L84:
+.LBB78:
+.LBB79:
+	.loc 1 355 0
+	mov	w0, w19
+	bl	mpb_task_is_done
+.LVL84:
+	cbnz	w0, .L83
+.LVL85:
+.LBB80:
+.LBB81:
+	.file 2 "include/linux/delay.h"
+	.loc 2 16 0
+	mov	x0, 1000
+	bl	udelay
+.LVL86:
+	mov	x0, 1000
+	bl	udelay
+.LVL87:
+	b	.L84
+.L83:
+.LBE81:
+.LBE80:
+	.loc 1 362 0
+	mov	w0, w19
+.LBE79:
+.LBE78:
+	.loc 1 368 0
+	ldr	x19, [sp, 16]
+.LVL88:
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+.LBB83:
+.LBB82:
+	.loc 1 362 0
+	b	mpb_task_is_done
+.LVL89:
+.LBE82:
+.LBE83:
+	.cfi_endproc
+.LFE230:
+	.size	mpb_task_wait_done, .-mpb_task_wait_done
+	.section	.text.mpb_task_run,"ax",@progbits
+	.align	2
+	.global	mpb_task_run
+	.type	mpb_task_run, %function
+mpb_task_run:
+.LFB232:
+	.loc 1 420 0
+	.cfi_startproc
+.LVL90:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+.LBB90:
+.LBB91:
+	.loc 1 146 0
+	mov	x3, 136314880
+.LBE91:
+.LBE90:
+	.loc 1 420 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+.LBB93:
+.LBB92:
+	.loc 1 146 0
+	mov	w24, 1
+	ldr	w2, [x3]
+	lsl	w24, w24, w1
+.LVL91:
+.LBE92:
+.LBE93:
+	.loc 1 420 0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	.loc 1 424 0
+	tst	w24, w2
+	.loc 1 420 0
+	str	x25, [sp, 64]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.cfi_offset 25, -16
+	.loc 1 424 0
+	beq	.L86
+	.loc 1 424 0 is_stmt 0 discriminator 1
+	cbz	w1, .L86
+	uxtw	x25, w0
+.LVL92:
+	.loc 1 421 0 is_stmt 1
+	mov	w19, 328
+	mov	x0, 8
+.LVL93:
+	mov	x22, x25
+	mov	w21, w1
+	.loc 1 427 0
+	mov	x20, x3
+	.loc 1 421 0
+	umaddl	x19, w25, w19, x0
+	.loc 1 427 0
+	mov	x0, 328
+	.loc 1 421 0
+	mov	w23, 0
+	.loc 1 427 0
+	madd	x25, x25, x0, x3
+.LVL94:
+	.loc 1 421 0
+	add	x19, x19, x3
+.LVL95:
+.L89:
+	.loc 1 427 0 discriminator 1
+	ldrb	w0, [x25, 328]
+	cmp	w23, w0
+	blt	.L91
+.LVL96:
+.L86:
+	.loc 1 431 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL97:
+.L91:
+	.cfi_restore_state
+	.loc 1 428 0
+	ldr	w0, [x19, 12]
+	cmp	w21, w0
+	bne	.L90
+	.loc 1 428 0 is_stmt 0 discriminator 1
+	ldr	x0, [x19]
+	cbz	x0, .L90
+.LVL98:
+.LBB94:
+.LBB95:
+.LBB96:
+.LBB97:
+	.loc 1 146 0 is_stmt 1
+	ldr	w0, [x20]
+.LBE97:
+.LBE96:
+	.loc 1 377 0
+	tst	w24, w0
+	beq	.L90
+	ldr	w3, [x19, 16]
+	mov	w2, w21
+	mov	w1, w23
+	mov	w0, w22
+	bl	core_task_run.part.2
+.LVL99:
+.L90:
+.LBE95:
+.LBE94:
+	.loc 1 427 0 discriminator 2
+	add	w23, w23, 1
+.LVL100:
+	add	x19, x19, 40
+	b	.L89
+	.cfi_endproc
+.LFE232:
+	.size	mpb_task_run, .-mpb_task_run
+	.section	.text.core_main,"ax",@progbits
+	.align	2
+	.global	core_main
+	.type	core_main, %function
+core_main:
+.LFB233:
+	.loc 1 434 0
+	.cfi_startproc
+.LVL101:
+	stp	x29, x30, [sp, -64]!
+	.cfi_def_cfa_offset 64
+	.cfi_offset 29, -64
+	.cfi_offset 30, -56
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -32
+	.cfi_offset 22, -24
+	uxtw	x22, w0
+	stp	x19, x20, [sp, 16]
+	.loc 1 435 0
+	mov	x0, 8
+.LVL102:
+	.cfi_offset 19, -48
+	.cfi_offset 20, -40
+	mov	w19, 328
+	mov	x20, 136314880
+	.loc 1 434 0
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -16
+	.cfi_offset 24, -8
+	.loc 1 434 0
+	mov	x23, x22
+.LVL103:
+	.loc 1 435 0
+	umaddl	x19, w22, w19, x0
+	.loc 1 438 0
+	mov	x0, 328
+	mov	w21, 0
+.LBB102:
+.LBB103:
+.LBB104:
+.LBB105:
+	.loc 1 146 0
+	mov	w24, 1
+.LBE105:
+.LBE104:
+.LBE103:
+.LBE102:
+	.loc 1 438 0
+	madd	x22, x22, x0, x20
+.LVL104:
+	.loc 1 435 0
+	add	x19, x19, x20
+.LVL105:
+.L103:
+	.loc 1 438 0 discriminator 1
+	ldrb	w0, [x22, 328]
+	cmp	w21, w0
+	blt	.L105
+	.loc 1 442 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL106:
+	ldp	x23, x24, [sp, 48]
+.LVL107:
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL108:
+.L105:
+	.cfi_restore_state
+	.loc 1 439 0
+	ldr	x0, [x19]
+	cbz	x0, .L104
+	.loc 1 440 0
+	ldr	w2, [x19, 12]
+.LVL109:
+.LBB109:
+.LBB108:
+.LBB107:
+.LBB106:
+	.loc 1 146 0
+	ldr	w0, [x20]
+	lsl	w1, w24, w2
+.LBE106:
+.LBE107:
+	.loc 1 377 0
+	tst	w1, w0
+	beq	.L104
+	ldr	w3, [x19, 16]
+	mov	w1, w21
+	mov	w0, w23
+	bl	core_task_run.part.2
+.LVL110:
+.L104:
+.LBE108:
+.LBE109:
+	.loc 1 438 0 discriminator 2
+	add	w21, w21, 1
+.LVL111:
+	add	x19, x19, 40
+	b	.L103
+	.cfi_endproc
+.LFE233:
+	.size	core_main, .-core_main
+	.section	.text.smp_entry,"ax",@progbits
+	.align	2
+	.global	smp_entry
+	.type	smp_entry, %function
+smp_entry:
+.LFB234:
+	.loc 1 448 0
+	.cfi_startproc
+.LVL112:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	.loc 1 448 0
+	mov	w19, w0
+	.loc 1 450 0
+	adrp	x0, .LANCHOR2
+.LVL113:
+	ldr	x0, [x0, #:lo12:.LANCHOR2]
+.LVL114:
+.LBB110:
+.LBB111:
+	.loc 1 131 0
+#APP
+// 131 "common/mp_boot.c" 1
+	mov x18, x0
+
+// 0 "" 2
+.LVL115:
+#NO_APP
+.LBE111:
+.LBE110:
+	.loc 1 451 0
+	bl	dcache_enable
+.LVL116:
+	.loc 1 455 0
+	cmp	w19, 1
+	bne	.L114
+.L118:
+	.loc 1 460 0
+	mov	w0, w19
+	bl	core_main
+.LVL117:
+	b	.L115
+.L114:
+	.loc 1 459 0
+	cmp	w19, 2
+	beq	.L118
+.L115:
+	.loc 1 468 0
+	bl	flush_dcache_all
+.LVL118:
+	.loc 1 469 0
+	bl	disable_interrupts
+.LVL119:
+.LBB112:
+.LBB113:
+	.file 3 "./arch/arm/include/asm/system.h"
+	.loc 3 193 0
+#APP
+// 193 "./arch/arm/include/asm/system.h" 1
+	msr daifset, #0x04
+// 0 "" 2
+#NO_APP
+.LBE113:
+.LBE112:
+	.loc 1 471 0
+	bl	icache_disable
+.LVL120:
+	.loc 1 472 0
+	bl	invalidate_icache_all
+.LVL121:
+	.loc 1 473 0
+	bl	dcache_disable
+.LVL122:
+.LBB114:
+.LBB115:
+	.loc 1 138 0
+#APP
+// 138 "common/mp_boot.c" 1
+	mrs x0, S3_1_c15_c2_1
+// 0 "" 2
+	.loc 1 139 0
+// 139 "common/mp_boot.c" 1
+	bic x0, x0, #0x40
+// 0 "" 2
+	.loc 1 140 0
+// 140 "common/mp_boot.c" 1
+	msr S3_1_c15_c2_1, x0
+// 0 "" 2
+#NO_APP
+.LBE115:
+.LBE114:
+	.loc 1 475 0
+	bl	invalidate_dcache_all
+.LVL123:
+	.loc 1 478 0
+#APP
+// 478 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 479 0
+// 479 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+#NO_APP
+.L116:
+	.loc 1 481 0 discriminator 1
+#APP
+// 481 "common/mp_boot.c" 1
+	wfe
+// 0 "" 2
+#NO_APP
+	b	.L116
+	.cfi_endproc
+.LFE234:
+	.size	smp_entry, .-smp_entry
+	.section	.text.mpb_init_1,"ax",@progbits
+	.align	2
+	.global	mpb_init_1
+	.type	mpb_init_1, %function
+mpb_init_1:
+.LFB236:
+	.loc 1 527 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 528 0
+	mov	x2, 40
+	mov	x1, x0
+	mov	x0, 1320
+	.loc 1 527 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 528 0
+	movk	x0, 0x820, lsl 16
+	.loc 1 527 0
+	.loc 1 528 0
+	bl	memcpy
+.LVL124:
+	.loc 1 530 0
+	mov	w1, 2
+	mov	w0, 0
+	bl	mpb_task_run
+.LVL125:
+	.loc 1 531 0
+	mov	w2, 286331153
+	mov	w1, 3
+	mov	w0, 0
+	bl	mpb_task_set_state
+.LVL126:
+	.loc 1 532 0
+	bl	flush_dcache_all
+.LVL127:
+	.loc 1 533 0
+#APP
+// 533 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 534 0
+// 534 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+	.loc 1 535 0
+#NO_APP
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE236:
+	.size	mpb_init_1, .-mpb_init_1
+	.section	.text.mpb_init_x,"ax",@progbits
+	.align	2
+	.global	mpb_init_x
+	.type	mpb_init_x, %function
+mpb_init_x:
+.LFB237:
+	.loc 1 538 0
+	.cfi_startproc
+.LVL128:
+	stp	x29, x30, [sp, -64]!
+	.cfi_def_cfa_offset 64
+	.cfi_offset 29, -64
+	.cfi_offset 30, -56
+	.loc 1 539 0
+	cmp	w0, 2
+	.loc 1 538 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 539 0
+	beq	.L123
+	cmp	w0, 3
+	beq	.L124
+	cbnz	w0, .L121
+.LBB124:
+.LBB125:
+	.loc 1 494 0
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
+	mov	x2, 48
+	add	x0, x29, 16
+.LVL129:
+	bl	memcpy
+.LVL130:
+	.loc 1 509 0
+	adrp	x0, .LC14
+	add	x0, x0, :lo12:.LC14
+	bl	printf
+.LVL131:
+	.loc 1 511 0
+	mov	x2, 1376
+	mov	w1, 0
+	mov	x0, 136314880
+	bl	memset
+.LVL132:
+	.loc 1 512 0
+	adrp	x0, .LANCHOR2
+	add	x6, x29, 64
+.LBB126:
+.LBB127:
+	.loc 1 177 0
+	mov	x4, 136314880
+	mov	x7, 328
+.LBE127:
+.LBE126:
+	.loc 1 512 0
+	str	x18, [x0, #:lo12:.LANCHOR2]
+.LVL133:
+	add	x0, x29, 16
+.LBB130:
+.LBB128:
+	.loc 1 179 0
+	mov	x8, 40
+	.loc 1 185 0
+	mov	w10, 1
+.LVL134:
+.L126:
+.LBE128:
+.LBE130:
+	.loc 1 514 0
+	cmp	x6, x0
+	bne	.L128
+	.loc 1 517 0
+	bl	flush_dcache_all
+.LVL135:
+.LBB131:
+	.loc 1 518 0
+#APP
+// 518 "common/mp_boot.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	x1, 8
+	adrp	x0, save_boot_params_ret
+	movk	x1, 0xfe48, lsl 16
+	add	x0, x0, :lo12:save_boot_params_ret
+	str	w0, [x1]
+.LVL136:
+.LBE131:
+.LBB132:
+	.loc 1 519 0
+#APP
+// 519 "common/mp_boot.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	x0, 4
+	mov	w1, 48815
+	movk	x0, 0xfe48, lsl 16
+	movk	w1, 0xdead, lsl 16
+	str	w1, [x0]
+.LBE132:
+	.loc 1 520 0
+#APP
+// 520 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 522 0
+// 522 "common/mp_boot.c" 1
+	sev
+// 0 "" 2
+	.loc 1 523 0
+// 523 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+.LVL137:
+#NO_APP
+.L121:
+.LBE125:
+.LBE124:
+	.loc 1 556 0
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+.L128:
+	.cfi_restore_state
+	ldp	w1, w3, [x0]
+.LVL138:
+	ldp	w12, w11, [x0, 16]
+.LBB135:
+.LBB134:
+.LBB133:
+.LBB129:
+	.loc 1 172 0
+	cmp	w1, 3
+	ldr	x13, [x0, 8]
+.LVL139:
+	beq	.L127
+	.loc 1 176 0
+	sub	w2, w3, #1
+	cmp	w2, 6
+	bhi	.L127
+.LVL140:
+	.loc 1 177 0
+	uxtw	x1, w1
+	mul	x2, x1, x7
+	add	x5, x4, x2
+	.loc 1 179 0
+	ldrb	w1, [x5, 328]
+.LVL141:
+	madd	x1, x1, x8, x2
+	add	x1, x4, x1
+	.loc 1 181 0
+	stp	w3, w12, [x1, 20]
+.LVL142:
+	.loc 1 185 0
+	lsl	w3, w10, w3
+.LVL143:
+	.loc 1 183 0
+	stp	w11, wzr, [x1, 28]
+	.loc 1 179 0
+	str	x13, [x1, 8]
+	.loc 1 184 0
+	str	xzr, [x1, 40]
+	.loc 1 185 0
+	ldr	w1, [x4]
+.LVL144:
+	orr	w3, w1, w3
+	str	w3, [x4]
+	.loc 1 186 0
+	ldrb	w1, [x5, 328]
+	add	w1, w1, 1
+	strb	w1, [x5, 328]
+.L127:
+	add	x0, x0, 24
+	b	.L126
+.LVL145:
+.L123:
+.LBE129:
+.LBE133:
+.LBE134:
+.LBE135:
+	.loc 1 544 0
+	mov	w2, -559087616
+	mov	w1, 3
+	mov	w0, 0
+.LVL146:
+	bl	mpb_task_set_state
+.LVL147:
+	.loc 1 545 0
+	bl	flush_dcache_all
+.LVL148:
+	.loc 1 546 0
+#APP
+// 546 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 547 0
+// 547 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+.LVL149:
+	.loc 1 556 0
+#NO_APP
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+.LBB136:
+.LBB137:
+	.loc 2 16 0
+	mov	x0, 1000
+	b	udelay
+.LVL150:
+.L124:
+	.cfi_restore_state
+.LBE137:
+.LBE136:
+	.loc 1 556 0
+	ldp	x29, x30, [sp], 64
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	.loc 1 553 0
+	mov	w2, -559087616
+	mov	w1, 7
+	mov	w0, 0
+.LVL151:
+	b	mpb_task_set_state
+.LVL152:
+	.cfi_endproc
+.LFE237:
+	.size	mpb_init_x, .-mpb_init_x
+	.section	.text.mpb_post,"ax",@progbits
+	.align	2
+	.global	mpb_post
+	.type	mpb_post, %function
+mpb_post:
+.LFB239:
+	.loc 1 576 0
+	.cfi_startproc
+.LVL153:
+	.loc 1 580 0
+	cmp	w0, 5
+	bhi	.L147
+	.loc 1 576 0
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	.loc 1 580 0
+	adrp	x1, .L136
+	add	x1, x1, :lo12:.L136
+	.loc 1 576 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 580 0
+	ldrb	w0, [x1,w0,uxtw]
+	adr	x1, .Lrtx136
+	add	x0, x1, w0, sxtb #2
+	br	x0
+.Lrtx136:
+.LVL154:
+	.section	.rodata.mpb_post,"a",@progbits
+	.align	0
+	.align	2
+.L136:
+	.byte	(.L135 - .Lrtx136) / 4
+	.byte	(.L137 - .Lrtx136) / 4
+	.byte	(.L138 - .Lrtx136) / 4
+	.byte	(.L139 - .Lrtx136) / 4
+	.byte	(.L140 - .Lrtx136) / 4
+	.byte	(.L141 - .Lrtx136) / 4
+	.section	.text.mpb_post
+.L135:
+	.loc 1 582 0
+	mov	w0, 5
+.L155:
+	.loc 1 602 0
+	bl	mpb_task_wait_done
+.LVL155:
+	sxtw	x0, w0
+	b	.L133
+.L137:
+.LVL156:
+	.loc 1 586 0
+	mov	w0, 5
+	bl	mpb_task_wait_done
+.LVL157:
+	.loc 1 587 0
+	bl	mpb_quit_load_image
+.LVL158:
+	cbz	w0, .L142
+.LVL159:
+.L156:
+	.loc 1 621 0
+	mov	x0, 0
+	.loc 1 617 0
+	b	.L133
+.LVL160:
+.L142:
+	.loc 1 587 0 discriminator 1
+	mov	x0, 136314880
+	ldr	x0, [x0, 1360]
+.LVL161:
+.L133:
+	.loc 1 622 0
+	ldp	x29, x30, [sp], 48
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+.L138:
+	.cfi_restore_state
+	.loc 1 590 0
+	bl	mpb_quit_load_image
+.LVL162:
+	cbnz	w0, .L156
+	.loc 1 590 0 is_stmt 0 discriminator 1
+	mov	x0, 136314880
+	ldr	x0, [x0, 1368]
+	b	.L133
+.L139:
+	.loc 1 594 0 is_stmt 1
+	bl	mpb_quit_load_image
+.LVL163:
+	cbz	w0, .L156
+	.loc 1 596 0
+	mov	w0, 6
+	bl	mpb_task_wait_done
+.LVL164:
+	.loc 1 597 0
+	mov	x0, 1
+	b	.L133
+.L140:
+	.loc 1 602 0
+	mov	w0, 6
+	b	.L155
+.L141:
+	.loc 1 605 0
+	bl	mpb_quit_load_image
+.LVL165:
+	cbnz	w0, .L156
+.LVL166:
+	.loc 1 609 0
+	mov	w0, 5
+	bl	mpb_task_wait_done
+.LVL167:
+	cmp	w0, 0
+	ble	.L144
+.L146:
+	.loc 1 611 0
+	mov	x0, 136314880
+	adrp	x2, .LC15
+	add	x2, x2, :lo12:.LC15
+	mov	x1, 32
+	ldr	x3, [x0, 1360]
+	add	x0, x29, 16
+	bl	snprintf
+.LVL168:
+	.loc 1 612 0
+	mov	w1, 0
+	add	x0, x29, 16
+	bl	run_command
+.LVL169:
+.L145:
+	.loc 1 616 0
+	bl	mpb_task_dump
+.LVL170:
+	b	.L156
+.L144:
+	.loc 1 610 0 discriminator 1
+	mov	w0, 4
+	bl	mpb_task_wait_done
+.LVL171:
+	.loc 1 609 0 discriminator 1
+	cmp	w0, 0
+	bgt	.L146
+	b	.L145
+.LVL172:
+.L147:
+	.cfi_def_cfa 31, 0
+	.cfi_restore 29
+	.cfi_restore 30
+	.loc 1 621 0
+	mov	x0, 0
+.LVL173:
+	ret
+	.cfi_endproc
+.LFE239:
+	.size	mpb_post, .-mpb_post
+	.section	.rodata
+	.align	3
+	.set	.LANCHOR3,. + 0
+.LC0:
+	.word	0
+	.word	2
+	.xword	spl_load_baseparamter
+	.word	0
+	.word	0
+	.word	2
+	.word	1
+	.xword	spl_init_display
+	.word	0
+	.word	0
+	.section	.bss.mpb_gd,"aw",@nobits
+	.align	3
+	.set	.LANCHOR2,. + 0
+	.type	mpb_gd, %object
+	.size	mpb_gd, 8
+mpb_gd:
+	.zero	8
+	.section	.bss.once.6657,"aw",@nobits
+	.align	2
+	.set	.LANCHOR0,. + 0
+	.type	once.6657, %object
+	.size	once.6657, 4
+once.6657:
+	.zero	4
+	.section	.rodata.core_task_run.part.2.str1.1,"aMS",@progbits,1
+.LC11:
+	.string	"-- T%d.%d [%d, %ld]\n"
+.LC12:
+	.string	"++ T%d.%d -\n"
+.LC13:
+	.string	"++ T%d.%d\n"
+	.section	.rodata.mpb_init_x.str1.1,"aMS",@progbits,1
+.LC14:
+	.string	"U-Boot SPL MP\n"
+	.section	.rodata.mpb_post.str1.1,"aMS",@progbits,1
+.LC15:
+	.string	"bootm 0x%lx"
+	.section	.rodata.mpb_quit_load_image.str1.1,"aMS",@progbits,1
+.LC1:
+	.string	"++ serial boot\n"
+	.section	.rodata.mpb_task_dump.str1.1,"aMS",@progbits,1
+.LC2:
+	.string	"data: %08lx, %08lx\n"
+.LC3:
+	.string	"T%d.%d:[%s]\n"
+.LC4:
+	.string	"  tid:              %d\n"
+.LC5:
+	.string	"  fn:               0x%08lx\n"
+.LC6:
+	.string	"  state:            0x%08x\n"
+.LC7:
+	.string	"  ret:              %d\n"
+.LC8:
+	.string	"  ms:               %ld\n"
+.LC9:
+	.string	"  ptid_mask:        0x%08x\n"
+.LC10:
+	.string	"  rip_fail:         %d\n\n"
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC16:
+	.string	"none"
+.LC17:
+	.string	"init-display"
+.LC18:
+	.string	"load-baseparameter"
+.LC19:
+	.string	"load-uboot"
+.LC20:
+	.string	"load-fit"
+.LC21:
+	.string	"load-android"
+.LC22:
+	.string	"hash-android"
+.LC23:
+	.string	"run-uboot"
+	.section	.rodata.tid_name,"a",@progbits
+	.align	3
+	.set	.LANCHOR1,. + 0
+	.type	tid_name, %object
+	.size	tid_name, 64
+tid_name:
+	.xword	.LC16
+	.xword	.LC17
+	.xword	.LC18
+	.xword	.LC19
+	.xword	.LC20
+	.xword	.LC21
+	.xword	.LC22
+	.xword	.LC23
+	.text
+.Letext0:
+	.file 4 "include/common.h"
+	.file 5 "./arch/arm/include/asm/types.h"
+	.file 6 "include/linux/types.h"
+	.file 7 "include/errno.h"
+	.file 8 "include/linux/string.h"
+	.file 9 "include/efi.h"
+	.file 10 "include/ide.h"
+	.file 11 "include/linux/list.h"
+	.file 12 "include/part.h"
+	.file 13 "include/flash.h"
+	.file 14 "include/lmb.h"
+	.file 15 "include/asm-generic/u-boot.h"
+	.file 16 "./arch/arm/include/asm/u-boot-arm.h"
+	.file 17 "include/linux/libfdt_env.h"
+	.file 18 "include/linux/../../scripts/dtc/libfdt/fdt.h"
+	.file 19 "include/linux/libfdt.h"
+	.file 20 "include/image.h"
+	.file 21 "./arch/arm/include/asm/global_data.h"
+	.file 22 "include/asm-generic/global_data.h"
+	.file 23 "include/net.h"
+	.file 24 "include/dm/uclass-id.h"
+	.file 25 "./arch/arm/include/asm/spl.h"
+	.file 26 "include/spl.h"
+	.file 27 "include/mp_boot.h"
+	.file 28 "include/boot_rkimg.h"
+	.file 29 "include/log.h"
+	.file 30 "include/vsprintf.h"
+	.file 31 "include/stdio.h"
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.4byte	0x2575
+	.2byte	0x4
+	.4byte	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.4byte	.LASF447
+	.byte	0xc
+	.4byte	.LASF448
+	.4byte	.LASF449
+	.4byte	.Ldebug_ranges0+0x230
+	.8byte	0
+	.4byte	.Ldebug_line0
+	.uleb128 0x2
+	.4byte	.LASF4
+	.byte	0x4
+	.byte	0xd
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF0
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF1
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x7
+	.4byte	.LASF2
+	.uleb128 0x4
+	.4byte	.LASF20
+	.byte	0x7
+	.byte	0xc
+	.4byte	0x54
+	.uleb128 0x5
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x6
+	.4byte	.LASF3
+	.uleb128 0x2
+	.4byte	.LASF5
+	.byte	0x5
+	.byte	0xc
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x5
+	.4byte	.LASF6
+	.uleb128 0x2
+	.4byte	.LASF7
+	.byte	0x5
+	.byte	0x12
+	.4byte	0x7f
+	.uleb128 0x3
+	.byte	0x4
+	.byte	0x7
+	.4byte	.LASF8
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF9
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF10
+	.uleb128 0x6
+	.string	"u8"
+	.byte	0x5
+	.byte	0x1f
+	.4byte	0x34
+	.uleb128 0x7
+	.4byte	0x94
+	.uleb128 0x6
+	.string	"u32"
+	.byte	0x5
+	.byte	0x25
+	.4byte	0x7f
+	.uleb128 0x6
+	.string	"u64"
+	.byte	0x5
+	.byte	0x28
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF11
+	.byte	0x5
+	.byte	0x31
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF12
+	.byte	0x5
+	.byte	0x32
+	.4byte	0x8d
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF13
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe3
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF14
+	.uleb128 0x7
+	.4byte	0xdc
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF15
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xdc
+	.uleb128 0x2
+	.4byte	.LASF16
+	.byte	0x6
+	.byte	0x59
+	.4byte	0x42
+	.uleb128 0x2
+	.4byte	.LASF17
+	.byte	0x6
+	.byte	0x5b
+	.4byte	0x3b
+	.uleb128 0x9
+	.4byte	0x100
+	.uleb128 0x2
+	.4byte	.LASF18
+	.byte	0x6
+	.byte	0x69
+	.4byte	0x62
+	.uleb128 0x2
+	.4byte	.LASF19
+	.byte	0x6
+	.byte	0x97
+	.4byte	0x74
+	.uleb128 0xa
+	.byte	0x8
+	.uleb128 0x4
+	.4byte	.LASF21
+	.byte	0x8
+	.byte	0xb
+	.4byte	0xef
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x2
+	.4byte	.LASF22
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0x145
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF23
+	.byte	0x9
+	.2byte	0x140
+	.4byte	0x13a
+	.uleb128 0xd
+	.4byte	.LASF24
+	.byte	0x9
+	.2byte	0x143
+	.4byte	0x13a
+	.uleb128 0xd
+	.4byte	.LASF25
+	.byte	0x9
+	.2byte	0x143
+	.4byte	0x13a
+	.uleb128 0xe
+	.4byte	.LASF38
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x169
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x17a
+	.uleb128 0xf
+	.uleb128 0xb
+	.4byte	0x100
+	.4byte	0x186
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF26
+	.byte	0xa
+	.byte	0x10
+	.4byte	0x17b
+	.uleb128 0xb
+	.4byte	0x34
+	.4byte	0x1a1
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x5
+	.byte	0
+	.uleb128 0x11
+	.4byte	.LASF29
+	.byte	0x10
+	.byte	0xb
+	.byte	0x16
+	.4byte	0x1c6
+	.uleb128 0x12
+	.4byte	.LASF27
+	.byte	0xb
+	.byte	0x17
+	.4byte	0x1c6
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF28
+	.byte	0xb
+	.byte	0x17
+	.4byte	0x1c6
+	.byte	0x8
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1a1
+	.uleb128 0x11
+	.4byte	.LASF30
+	.byte	0x10
+	.byte	0xc
+	.byte	0xf
+	.4byte	0x1f1
+	.uleb128 0x12
+	.4byte	.LASF31
+	.byte	0xc
+	.byte	0x10
+	.4byte	0xef
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF32
+	.byte	0xc
+	.byte	0x11
+	.4byte	0x20a
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x1cc
+	.uleb128 0x13
+	.4byte	0x54
+	.4byte	0x20a
+	.uleb128 0x14
+	.4byte	0x54
+	.uleb128 0x14
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1f6
+	.uleb128 0xb
+	.4byte	0x1f1
+	.4byte	0x21b
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x210
+	.uleb128 0x4
+	.4byte	.LASF30
+	.byte	0xc
+	.byte	0xe1
+	.4byte	0x21b
+	.uleb128 0x15
+	.2byte	0x1220
+	.byte	0xd
+	.byte	0x13
+	.4byte	0x27f
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xd
+	.byte	0x14
+	.4byte	0x100
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF34
+	.byte	0xd
+	.byte	0x15
+	.4byte	0xf5
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF35
+	.byte	0xd
+	.byte	0x16
+	.4byte	0x100
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF36
+	.byte	0xd
+	.byte	0x17
+	.4byte	0x27f
+	.byte	0x18
+	.uleb128 0x16
+	.4byte	.LASF37
+	.byte	0xd
+	.byte	0x18
+	.4byte	0x290
+	.2byte	0x1018
+	.uleb128 0x17
+	.string	"mtd"
+	.byte	0xd
+	.byte	0x31
+	.4byte	0x2a6
+	.2byte	0x1218
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x100
+	.4byte	0x290
+	.uleb128 0x18
+	.4byte	0xcf
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x29
+	.4byte	0x2a1
+	.uleb128 0x18
+	.4byte	0xcf
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF39
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x2a1
+	.uleb128 0x2
+	.4byte	.LASF40
+	.byte	0xd
+	.byte	0x37
+	.4byte	0x22b
+	.uleb128 0xb
+	.4byte	0x2ac
+	.4byte	0x2c2
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF41
+	.byte	0xd
+	.byte	0x39
+	.4byte	0x2b7
+	.uleb128 0x3
+	.byte	0x10
+	.byte	0x4
+	.4byte	.LASF42
+	.uleb128 0x11
+	.4byte	.LASF43
+	.byte	0x10
+	.byte	0xe
+	.byte	0x10
+	.4byte	0x2f9
+	.uleb128 0x12
+	.4byte	.LASF44
+	.byte	0xe
+	.byte	0x11
+	.4byte	0xb9
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xe
+	.byte	0x12
+	.4byte	0xc4
+	.byte	0x8
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF45
+	.2byte	0x120
+	.byte	0xe
+	.byte	0x15
+	.4byte	0x32b
+	.uleb128 0x1a
+	.string	"cnt"
+	.byte	0xe
+	.byte	0x16
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xe
+	.byte	0x17
+	.4byte	0xc4
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF46
+	.byte	0xe
+	.byte	0x18
+	.4byte	0x32b
+	.byte	0x10
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x2d4
+	.4byte	0x33b
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x10
+	.byte	0
+	.uleb128 0x1b
+	.string	"lmb"
+	.2byte	0x240
+	.byte	0xe
+	.byte	0x1b
+	.4byte	0x362
+	.uleb128 0x12
+	.4byte	.LASF47
+	.byte	0xe
+	.byte	0x1c
+	.4byte	0x2f9
+	.byte	0
+	.uleb128 0x16
+	.4byte	.LASF48
+	.byte	0xe
+	.byte	0x1d
+	.4byte	0x2f9
+	.2byte	0x120
+	.byte	0
+	.uleb128 0x1c
+	.string	"lmb"
+	.byte	0xe
+	.byte	0x20
+	.4byte	0x33b
+	.uleb128 0x1d
+	.byte	0x10
+	.byte	0xf
+	.byte	0x5b
+	.4byte	0x38e
+	.uleb128 0x12
+	.4byte	.LASF36
+	.byte	0xf
+	.byte	0x5c
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xf
+	.byte	0x5d
+	.4byte	0xae
+	.byte	0x8
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF49
+	.2byte	0x148
+	.byte	0xf
+	.byte	0x1b
+	.4byte	0x480
+	.uleb128 0x12
+	.4byte	.LASF50
+	.byte	0xf
+	.byte	0x1c
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF51
+	.byte	0xf
+	.byte	0x1d
+	.4byte	0xc4
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF52
+	.byte	0xf
+	.byte	0x1e
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF53
+	.byte	0xf
+	.byte	0x1f
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF54
+	.byte	0xf
+	.byte	0x20
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF55
+	.byte	0xf
+	.byte	0x21
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF56
+	.byte	0xf
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0x12
+	.4byte	.LASF57
+	.byte	0xf
+	.byte	0x24
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0x12
+	.4byte	.LASF58
+	.byte	0xf
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0x12
+	.4byte	.LASF59
+	.byte	0xf
+	.byte	0x26
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0x12
+	.4byte	.LASF60
+	.byte	0xf
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0x12
+	.4byte	.LASF61
+	.byte	0xf
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0x12
+	.4byte	.LASF62
+	.byte	0xf
+	.byte	0x33
+	.4byte	0x191
+	.byte	0x60
+	.uleb128 0x12
+	.4byte	.LASF63
+	.byte	0xf
+	.byte	0x34
+	.4byte	0x42
+	.byte	0x66
+	.uleb128 0x12
+	.4byte	.LASF64
+	.byte	0xf
+	.byte	0x35
+	.4byte	0x3b
+	.byte	0x68
+	.uleb128 0x12
+	.4byte	.LASF65
+	.byte	0xf
+	.byte	0x36
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0x12
+	.4byte	.LASF66
+	.byte	0xf
+	.byte	0x57
+	.4byte	0x100
+	.byte	0x78
+	.uleb128 0x12
+	.4byte	.LASF67
+	.byte	0xf
+	.byte	0x58
+	.4byte	0x100
+	.byte	0x80
+	.uleb128 0x12
+	.4byte	.LASF68
+	.byte	0xf
+	.byte	0x5e
+	.4byte	0x480
+	.byte	0x88
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x36d
+	.4byte	0x490
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0xb
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF69
+	.byte	0xf
+	.byte	0x60
+	.4byte	0x38e
+	.uleb128 0x4
+	.4byte	.LASF70
+	.byte	0x10
+	.byte	0x13
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF71
+	.byte	0x10
+	.byte	0x14
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF72
+	.byte	0x10
+	.byte	0x15
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF73
+	.byte	0x10
+	.byte	0x16
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF74
+	.byte	0x10
+	.byte	0x17
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF75
+	.byte	0x10
+	.byte	0x18
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF76
+	.byte	0x10
+	.byte	0x19
+	.4byte	0x100
+	.uleb128 0x2
+	.4byte	.LASF77
+	.byte	0x11
+	.byte	0x11
+	.4byte	0x11b
+	.uleb128 0x11
+	.4byte	.LASF78
+	.byte	0x28
+	.byte	0x12
+	.byte	0x39
+	.4byte	0x578
+	.uleb128 0x12
+	.4byte	.LASF79
+	.byte	0x12
+	.byte	0x3a
+	.4byte	0x4e8
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF80
+	.byte	0x12
+	.byte	0x3b
+	.4byte	0x4e8
+	.byte	0x4
+	.uleb128 0x12
+	.4byte	.LASF81
+	.byte	0x12
+	.byte	0x3c
+	.4byte	0x4e8
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF82
+	.byte	0x12
+	.byte	0x3d
+	.4byte	0x4e8
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF83
+	.byte	0x12
+	.byte	0x3e
+	.4byte	0x4e8
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF84
+	.byte	0x12
+	.byte	0x3f
+	.4byte	0x4e8
+	.byte	0x14
+	.uleb128 0x12
+	.4byte	.LASF85
+	.byte	0x12
+	.byte	0x40
+	.4byte	0x4e8
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF86
+	.byte	0x12
+	.byte	0x43
+	.4byte	0x4e8
+	.byte	0x1c
+	.uleb128 0x12
+	.4byte	.LASF87
+	.byte	0x12
+	.byte	0x46
+	.4byte	0x4e8
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF88
+	.byte	0x12
+	.byte	0x49
+	.4byte	0x4e8
+	.byte	0x24
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF89
+	.byte	0x13
+	.2byte	0x136
+	.4byte	0x584
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x4f3
+	.uleb128 0x1e
+	.4byte	.LASF90
+	.byte	0x40
+	.byte	0x14
+	.2byte	0x137
+	.4byte	0x634
+	.uleb128 0x1f
+	.4byte	.LASF91
+	.byte	0x14
+	.2byte	0x138
+	.4byte	0x11b
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF92
+	.byte	0x14
+	.2byte	0x139
+	.4byte	0x11b
+	.byte	0x4
+	.uleb128 0x1f
+	.4byte	.LASF93
+	.byte	0x14
+	.2byte	0x13a
+	.4byte	0x11b
+	.byte	0x8
+	.uleb128 0x1f
+	.4byte	.LASF94
+	.byte	0x14
+	.2byte	0x13b
+	.4byte	0x11b
+	.byte	0xc
+	.uleb128 0x1f
+	.4byte	.LASF95
+	.byte	0x14
+	.2byte	0x13c
+	.4byte	0x11b
+	.byte	0x10
+	.uleb128 0x1f
+	.4byte	.LASF96
+	.byte	0x14
+	.2byte	0x13d
+	.4byte	0x11b
+	.byte	0x14
+	.uleb128 0x1f
+	.4byte	.LASF97
+	.byte	0x14
+	.2byte	0x13e
+	.4byte	0x11b
+	.byte	0x18
+	.uleb128 0x1f
+	.4byte	.LASF98
+	.byte	0x14
+	.2byte	0x13f
+	.4byte	0x110
+	.byte	0x1c
+	.uleb128 0x1f
+	.4byte	.LASF99
+	.byte	0x14
+	.2byte	0x140
+	.4byte	0x110
+	.byte	0x1d
+	.uleb128 0x1f
+	.4byte	.LASF100
+	.byte	0x14
+	.2byte	0x141
+	.4byte	0x110
+	.byte	0x1e
+	.uleb128 0x1f
+	.4byte	.LASF101
+	.byte	0x14
+	.2byte	0x142
+	.4byte	0x110
+	.byte	0x1f
+	.uleb128 0x1f
+	.4byte	.LASF102
+	.byte	0x14
+	.2byte	0x143
+	.4byte	0x634
+	.byte	0x20
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x110
+	.4byte	0x644
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x20
+	.4byte	.LASF103
+	.byte	0x14
+	.2byte	0x144
+	.4byte	0x58a
+	.uleb128 0x1e
+	.4byte	.LASF104
+	.byte	0x30
+	.byte	0x14
+	.2byte	0x146
+	.4byte	0x6d2
+	.uleb128 0x1f
+	.4byte	.LASF36
+	.byte	0x14
+	.2byte	0x147
+	.4byte	0x100
+	.byte	0
+	.uleb128 0x21
+	.string	"end"
+	.byte	0x14
+	.2byte	0x147
+	.4byte	0x100
+	.byte	0x8
+	.uleb128 0x1f
+	.4byte	.LASF105
+	.byte	0x14
+	.2byte	0x148
+	.4byte	0x100
+	.byte	0x10
+	.uleb128 0x1f
+	.4byte	.LASF106
+	.byte	0x14
+	.2byte	0x148
+	.4byte	0x100
+	.byte	0x18
+	.uleb128 0x1f
+	.4byte	.LASF107
+	.byte	0x14
+	.2byte	0x149
+	.4byte	0x100
+	.byte	0x20
+	.uleb128 0x1f
+	.4byte	.LASF108
+	.byte	0x14
+	.2byte	0x14a
+	.4byte	0x110
+	.byte	0x28
+	.uleb128 0x1f
+	.4byte	.LASF109
+	.byte	0x14
+	.2byte	0x14a
+	.4byte	0x110
+	.byte	0x29
+	.uleb128 0x21
+	.string	"os"
+	.byte	0x14
+	.2byte	0x14a
+	.4byte	0x110
+	.byte	0x2a
+	.uleb128 0x1f
+	.4byte	.LASF110
+	.byte	0x14
+	.2byte	0x14b
+	.4byte	0x110
+	.byte	0x2b
+	.byte	0
+	.uleb128 0x20
+	.4byte	.LASF111
+	.byte	0x14
+	.2byte	0x14c
+	.4byte	0x650
+	.uleb128 0x22
+	.4byte	.LASF112
+	.2byte	0x380
+	.byte	0x14
+	.2byte	0x152
+	.4byte	0x87b
+	.uleb128 0x1f
+	.4byte	.LASF113
+	.byte	0x14
+	.2byte	0x158
+	.4byte	0x87b
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF114
+	.byte	0x14
+	.2byte	0x159
+	.4byte	0x644
+	.byte	0x8
+	.uleb128 0x1f
+	.4byte	.LASF115
+	.byte	0x14
+	.2byte	0x15a
+	.4byte	0x100
+	.byte	0x48
+	.uleb128 0x1f
+	.4byte	.LASF116
+	.byte	0x14
+	.2byte	0x15d
+	.4byte	0xd6
+	.byte	0x50
+	.uleb128 0x1f
+	.4byte	.LASF117
+	.byte	0x14
+	.2byte	0x15f
+	.4byte	0x126
+	.byte	0x58
+	.uleb128 0x1f
+	.4byte	.LASF118
+	.byte	0x14
+	.2byte	0x160
+	.4byte	0xd6
+	.byte	0x60
+	.uleb128 0x1f
+	.4byte	.LASF119
+	.byte	0x14
+	.2byte	0x161
+	.4byte	0x54
+	.byte	0x68
+	.uleb128 0x1f
+	.4byte	.LASF120
+	.byte	0x14
+	.2byte	0x163
+	.4byte	0x126
+	.byte	0x70
+	.uleb128 0x1f
+	.4byte	.LASF121
+	.byte	0x14
+	.2byte	0x164
+	.4byte	0xd6
+	.byte	0x78
+	.uleb128 0x1f
+	.4byte	.LASF122
+	.byte	0x14
+	.2byte	0x165
+	.4byte	0x54
+	.byte	0x80
+	.uleb128 0x1f
+	.4byte	.LASF123
+	.byte	0x14
+	.2byte	0x167
+	.4byte	0x126
+	.byte	0x88
+	.uleb128 0x1f
+	.4byte	.LASF124
+	.byte	0x14
+	.2byte	0x168
+	.4byte	0xd6
+	.byte	0x90
+	.uleb128 0x1f
+	.4byte	.LASF125
+	.byte	0x14
+	.2byte	0x169
+	.4byte	0x54
+	.byte	0x98
+	.uleb128 0x1f
+	.4byte	.LASF126
+	.byte	0x14
+	.2byte	0x16b
+	.4byte	0x126
+	.byte	0xa0
+	.uleb128 0x1f
+	.4byte	.LASF127
+	.byte	0x14
+	.2byte	0x16c
+	.4byte	0xd6
+	.byte	0xa8
+	.uleb128 0x1f
+	.4byte	.LASF128
+	.byte	0x14
+	.2byte	0x16d
+	.4byte	0x54
+	.byte	0xb0
+	.uleb128 0x21
+	.string	"os"
+	.byte	0x14
+	.2byte	0x171
+	.4byte	0x6d2
+	.byte	0xb8
+	.uleb128 0x21
+	.string	"ep"
+	.byte	0x14
+	.2byte	0x172
+	.4byte	0x100
+	.byte	0xe8
+	.uleb128 0x1f
+	.4byte	.LASF129
+	.byte	0x14
+	.2byte	0x174
+	.4byte	0x100
+	.byte	0xf0
+	.uleb128 0x1f
+	.4byte	.LASF130
+	.byte	0x14
+	.2byte	0x174
+	.4byte	0x100
+	.byte	0xf8
+	.uleb128 0x23
+	.4byte	.LASF131
+	.byte	0x14
+	.2byte	0x176
+	.4byte	0xef
+	.2byte	0x100
+	.uleb128 0x23
+	.4byte	.LASF132
+	.byte	0x14
+	.2byte	0x177
+	.4byte	0x100
+	.2byte	0x108
+	.uleb128 0x23
+	.4byte	.LASF133
+	.byte	0x14
+	.2byte	0x179
+	.4byte	0x100
+	.2byte	0x110
+	.uleb128 0x23
+	.4byte	.LASF134
+	.byte	0x14
+	.2byte	0x17a
+	.4byte	0x100
+	.2byte	0x118
+	.uleb128 0x23
+	.4byte	.LASF135
+	.byte	0x14
+	.2byte	0x17b
+	.4byte	0x100
+	.2byte	0x120
+	.uleb128 0x23
+	.4byte	.LASF136
+	.byte	0x14
+	.2byte	0x17c
+	.4byte	0x100
+	.2byte	0x128
+	.uleb128 0x24
+	.string	"kbd"
+	.byte	0x14
+	.2byte	0x17d
+	.4byte	0x881
+	.2byte	0x130
+	.uleb128 0x23
+	.4byte	.LASF137
+	.byte	0x14
+	.2byte	0x180
+	.4byte	0x54
+	.2byte	0x138
+	.uleb128 0x23
+	.4byte	.LASF138
+	.byte	0x14
+	.2byte	0x18d
+	.4byte	0x54
+	.2byte	0x13c
+	.uleb128 0x24
+	.string	"lmb"
+	.byte	0x14
+	.2byte	0x190
+	.4byte	0x33b
+	.2byte	0x140
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x644
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x490
+	.uleb128 0x20
+	.4byte	.LASF139
+	.byte	0x14
+	.2byte	0x196
+	.4byte	0x6de
+	.uleb128 0xd
+	.4byte	.LASF140
+	.byte	0x14
+	.2byte	0x198
+	.4byte	0x887
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0x8b0
+	.uleb128 0x18
+	.4byte	0xcf
+	.2byte	0x3ff
+	.byte	0
+	.uleb128 0x25
+	.4byte	.LASF331
+	.byte	0x4
+	.4byte	0x54
+	.byte	0x18
+	.byte	0xe
+	.4byte	0xb19
+	.uleb128 0x26
+	.4byte	.LASF141
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF142
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF143
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF144
+	.byte	0x3
+	.uleb128 0x26
+	.4byte	.LASF145
+	.byte	0x4
+	.uleb128 0x26
+	.4byte	.LASF146
+	.byte	0x5
+	.uleb128 0x26
+	.4byte	.LASF147
+	.byte	0x6
+	.uleb128 0x26
+	.4byte	.LASF148
+	.byte	0x7
+	.uleb128 0x26
+	.4byte	.LASF149
+	.byte	0x8
+	.uleb128 0x26
+	.4byte	.LASF150
+	.byte	0x9
+	.uleb128 0x26
+	.4byte	.LASF151
+	.byte	0xa
+	.uleb128 0x26
+	.4byte	.LASF152
+	.byte	0xb
+	.uleb128 0x26
+	.4byte	.LASF153
+	.byte	0xc
+	.uleb128 0x26
+	.4byte	.LASF154
+	.byte	0xd
+	.uleb128 0x26
+	.4byte	.LASF155
+	.byte	0xe
+	.uleb128 0x26
+	.4byte	.LASF156
+	.byte	0xf
+	.uleb128 0x26
+	.4byte	.LASF157
+	.byte	0x10
+	.uleb128 0x26
+	.4byte	.LASF158
+	.byte	0x11
+	.uleb128 0x26
+	.4byte	.LASF159
+	.byte	0x12
+	.uleb128 0x26
+	.4byte	.LASF160
+	.byte	0x13
+	.uleb128 0x26
+	.4byte	.LASF161
+	.byte	0x14
+	.uleb128 0x26
+	.4byte	.LASF162
+	.byte	0x15
+	.uleb128 0x26
+	.4byte	.LASF163
+	.byte	0x16
+	.uleb128 0x26
+	.4byte	.LASF164
+	.byte	0x17
+	.uleb128 0x26
+	.4byte	.LASF165
+	.byte	0x18
+	.uleb128 0x26
+	.4byte	.LASF166
+	.byte	0x19
+	.uleb128 0x26
+	.4byte	.LASF167
+	.byte	0x1a
+	.uleb128 0x26
+	.4byte	.LASF168
+	.byte	0x1b
+	.uleb128 0x26
+	.4byte	.LASF169
+	.byte	0x1c
+	.uleb128 0x26
+	.4byte	.LASF170
+	.byte	0x1d
+	.uleb128 0x26
+	.4byte	.LASF171
+	.byte	0x1e
+	.uleb128 0x26
+	.4byte	.LASF172
+	.byte	0x1f
+	.uleb128 0x26
+	.4byte	.LASF173
+	.byte	0x20
+	.uleb128 0x26
+	.4byte	.LASF174
+	.byte	0x21
+	.uleb128 0x26
+	.4byte	.LASF175
+	.byte	0x22
+	.uleb128 0x26
+	.4byte	.LASF176
+	.byte	0x23
+	.uleb128 0x26
+	.4byte	.LASF177
+	.byte	0x24
+	.uleb128 0x26
+	.4byte	.LASF178
+	.byte	0x25
+	.uleb128 0x26
+	.4byte	.LASF179
+	.byte	0x26
+	.uleb128 0x26
+	.4byte	.LASF180
+	.byte	0x27
+	.uleb128 0x26
+	.4byte	.LASF181
+	.byte	0x28
+	.uleb128 0x26
+	.4byte	.LASF182
+	.byte	0x29
+	.uleb128 0x26
+	.4byte	.LASF183
+	.byte	0x2a
+	.uleb128 0x26
+	.4byte	.LASF184
+	.byte	0x2b
+	.uleb128 0x26
+	.4byte	.LASF185
+	.byte	0x2c
+	.uleb128 0x26
+	.4byte	.LASF186
+	.byte	0x2d
+	.uleb128 0x26
+	.4byte	.LASF187
+	.byte	0x2e
+	.uleb128 0x26
+	.4byte	.LASF188
+	.byte	0x2f
+	.uleb128 0x26
+	.4byte	.LASF189
+	.byte	0x30
+	.uleb128 0x26
+	.4byte	.LASF190
+	.byte	0x31
+	.uleb128 0x26
+	.4byte	.LASF191
+	.byte	0x32
+	.uleb128 0x26
+	.4byte	.LASF192
+	.byte	0x33
+	.uleb128 0x26
+	.4byte	.LASF193
+	.byte	0x34
+	.uleb128 0x26
+	.4byte	.LASF194
+	.byte	0x35
+	.uleb128 0x26
+	.4byte	.LASF195
+	.byte	0x36
+	.uleb128 0x26
+	.4byte	.LASF196
+	.byte	0x37
+	.uleb128 0x26
+	.4byte	.LASF197
+	.byte	0x38
+	.uleb128 0x26
+	.4byte	.LASF198
+	.byte	0x39
+	.uleb128 0x26
+	.4byte	.LASF199
+	.byte	0x3a
+	.uleb128 0x26
+	.4byte	.LASF200
+	.byte	0x3b
+	.uleb128 0x26
+	.4byte	.LASF201
+	.byte	0x3c
+	.uleb128 0x26
+	.4byte	.LASF202
+	.byte	0x3d
+	.uleb128 0x26
+	.4byte	.LASF203
+	.byte	0x3e
+	.uleb128 0x26
+	.4byte	.LASF204
+	.byte	0x3f
+	.uleb128 0x26
+	.4byte	.LASF205
+	.byte	0x40
+	.uleb128 0x26
+	.4byte	.LASF206
+	.byte	0x41
+	.uleb128 0x26
+	.4byte	.LASF207
+	.byte	0x42
+	.uleb128 0x26
+	.4byte	.LASF208
+	.byte	0x43
+	.uleb128 0x26
+	.4byte	.LASF209
+	.byte	0x44
+	.uleb128 0x26
+	.4byte	.LASF210
+	.byte	0x45
+	.uleb128 0x26
+	.4byte	.LASF211
+	.byte	0x46
+	.uleb128 0x26
+	.4byte	.LASF212
+	.byte	0x47
+	.uleb128 0x26
+	.4byte	.LASF213
+	.byte	0x48
+	.uleb128 0x26
+	.4byte	.LASF214
+	.byte	0x49
+	.uleb128 0x26
+	.4byte	.LASF215
+	.byte	0x4a
+	.uleb128 0x26
+	.4byte	.LASF216
+	.byte	0x4b
+	.uleb128 0x26
+	.4byte	.LASF217
+	.byte	0x4c
+	.uleb128 0x26
+	.4byte	.LASF218
+	.byte	0x4d
+	.uleb128 0x26
+	.4byte	.LASF219
+	.byte	0x4e
+	.uleb128 0x26
+	.4byte	.LASF220
+	.byte	0x4f
+	.uleb128 0x26
+	.4byte	.LASF221
+	.byte	0x50
+	.uleb128 0x26
+	.4byte	.LASF222
+	.byte	0x51
+	.uleb128 0x26
+	.4byte	.LASF223
+	.byte	0x52
+	.uleb128 0x26
+	.4byte	.LASF224
+	.byte	0x53
+	.uleb128 0x26
+	.4byte	.LASF225
+	.byte	0x54
+	.uleb128 0x26
+	.4byte	.LASF226
+	.byte	0x55
+	.uleb128 0x26
+	.4byte	.LASF227
+	.byte	0x56
+	.uleb128 0x26
+	.4byte	.LASF228
+	.byte	0x57
+	.uleb128 0x26
+	.4byte	.LASF229
+	.byte	0x58
+	.uleb128 0x26
+	.4byte	.LASF230
+	.byte	0x59
+	.uleb128 0x26
+	.4byte	.LASF231
+	.byte	0x5a
+	.uleb128 0x26
+	.4byte	.LASF232
+	.byte	0x5b
+	.uleb128 0x26
+	.4byte	.LASF233
+	.byte	0x5c
+	.uleb128 0x26
+	.4byte	.LASF234
+	.byte	0x5d
+	.uleb128 0x26
+	.4byte	.LASF235
+	.byte	0x5e
+	.uleb128 0x26
+	.4byte	.LASF236
+	.byte	0x5f
+	.uleb128 0x26
+	.4byte	.LASF237
+	.byte	0x60
+	.uleb128 0x26
+	.4byte	.LASF238
+	.byte	0x61
+	.uleb128 0x26
+	.4byte	.LASF239
+	.byte	0x62
+	.uleb128 0x27
+	.4byte	.LASF240
+	.sleb128 -1
+	.byte	0
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1d
+	.byte	0xf6
+	.4byte	0xb2c
+	.uleb128 0x26
+	.4byte	.LASF241
+	.byte	0x5
+	.byte	0
+	.uleb128 0x11
+	.4byte	.LASF242
+	.byte	0x40
+	.byte	0x15
+	.byte	0xc
+	.4byte	0xba5
+	.uleb128 0x12
+	.4byte	.LASF243
+	.byte	0x15
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x1a
+	.string	"tbu"
+	.byte	0x15
+	.byte	0x23
+	.4byte	0x7f
+	.byte	0x8
+	.uleb128 0x1a
+	.string	"tbl"
+	.byte	0x15
+	.byte	0x24
+	.4byte	0x7f
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF244
+	.byte	0x15
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF245
+	.byte	0x15
+	.byte	0x26
+	.4byte	0x8d
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF246
+	.byte	0x15
+	.byte	0x29
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF247
+	.byte	0x15
+	.byte	0x2a
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF248
+	.byte	0x15
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0x12
+	.4byte	.LASF249
+	.byte	0x15
+	.byte	0x2d
+	.4byte	0x3b
+	.byte	0x38
+	.byte	0
+	.uleb128 0x11
+	.4byte	.LASF250
+	.byte	0x18
+	.byte	0x16
+	.byte	0x22
+	.4byte	0xbed
+	.uleb128 0x12
+	.4byte	.LASF251
+	.byte	0x16
+	.byte	0x23
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF252
+	.byte	0x16
+	.byte	0x24
+	.4byte	0xa3
+	.byte	0x4
+	.uleb128 0x1a
+	.string	"id"
+	.byte	0x16
+	.byte	0x25
+	.4byte	0xa3
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF253
+	.byte	0x16
+	.byte	0x26
+	.4byte	0xa3
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF254
+	.byte	0x16
+	.byte	0x27
+	.4byte	0x100
+	.byte	0x10
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF255
+	.2byte	0x1c8
+	.byte	0x16
+	.byte	0x2a
+	.4byte	0xe23
+	.uleb128 0x1a
+	.string	"bd"
+	.byte	0x16
+	.byte	0x2b
+	.4byte	0x881
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF256
+	.byte	0x16
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF253
+	.byte	0x16
+	.byte	0x2d
+	.4byte	0x7f
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF257
+	.byte	0x16
+	.byte	0x2e
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF258
+	.byte	0x16
+	.byte	0x2f
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF259
+	.byte	0x16
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF260
+	.byte	0x16
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0x12
+	.4byte	.LASF261
+	.byte	0x16
+	.byte	0x3e
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0x12
+	.4byte	.LASF262
+	.byte	0x16
+	.byte	0x42
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0x12
+	.4byte	.LASF263
+	.byte	0x16
+	.byte	0x43
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0x12
+	.4byte	.LASF264
+	.byte	0x16
+	.byte	0x45
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0x12
+	.4byte	.LASF265
+	.byte	0x16
+	.byte	0x46
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0x12
+	.4byte	.LASF266
+	.byte	0x16
+	.byte	0x47
+	.4byte	0x3b
+	.byte	0x60
+	.uleb128 0x12
+	.4byte	.LASF267
+	.byte	0x16
+	.byte	0x48
+	.4byte	0xc4
+	.byte	0x68
+	.uleb128 0x12
+	.4byte	.LASF268
+	.byte	0x16
+	.byte	0x49
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0x12
+	.4byte	.LASF269
+	.byte	0x16
+	.byte	0x4a
+	.4byte	0x3b
+	.byte	0x78
+	.uleb128 0x12
+	.4byte	.LASF270
+	.byte	0x16
+	.byte	0x4b
+	.4byte	0x3b
+	.byte	0x80
+	.uleb128 0x12
+	.4byte	.LASF271
+	.byte	0x16
+	.byte	0x4c
+	.4byte	0x3b
+	.byte	0x88
+	.uleb128 0x12
+	.4byte	.LASF272
+	.byte	0x16
+	.byte	0x4d
+	.4byte	0xe23
+	.byte	0x90
+	.uleb128 0x12
+	.4byte	.LASF273
+	.byte	0x16
+	.byte	0x50
+	.4byte	0x16e
+	.byte	0x98
+	.uleb128 0x12
+	.4byte	.LASF274
+	.byte	0x16
+	.byte	0x51
+	.4byte	0x16e
+	.byte	0xa0
+	.uleb128 0x12
+	.4byte	.LASF275
+	.byte	0x16
+	.byte	0x52
+	.4byte	0x1a1
+	.byte	0xa8
+	.uleb128 0x12
+	.4byte	.LASF276
+	.byte	0x16
+	.byte	0x57
+	.4byte	0x174
+	.byte	0xb8
+	.uleb128 0x12
+	.4byte	.LASF277
+	.byte	0x16
+	.byte	0x58
+	.4byte	0x126
+	.byte	0xc0
+	.uleb128 0x12
+	.4byte	.LASF278
+	.byte	0x16
+	.byte	0x59
+	.4byte	0x3b
+	.byte	0xc8
+	.uleb128 0x12
+	.4byte	.LASF279
+	.byte	0x16
+	.byte	0x5b
+	.4byte	0xe2e
+	.byte	0xd0
+	.uleb128 0x12
+	.4byte	.LASF280
+	.byte	0x16
+	.byte	0x5c
+	.4byte	0xe2e
+	.byte	0xd8
+	.uleb128 0x12
+	.4byte	.LASF281
+	.byte	0x16
+	.byte	0x5e
+	.4byte	0x174
+	.byte	0xe0
+	.uleb128 0x12
+	.4byte	.LASF282
+	.byte	0x16
+	.byte	0x5f
+	.4byte	0x174
+	.byte	0xe8
+	.uleb128 0x1a
+	.string	"jt"
+	.byte	0x16
+	.byte	0x60
+	.4byte	0xe39
+	.byte	0xf0
+	.uleb128 0x12
+	.4byte	.LASF283
+	.byte	0x16
+	.byte	0x61
+	.4byte	0xe3f
+	.byte	0xf8
+	.uleb128 0x16
+	.4byte	.LASF284
+	.byte	0x16
+	.byte	0x6b
+	.4byte	0x7f
+	.2byte	0x118
+	.uleb128 0x16
+	.4byte	.LASF285
+	.byte	0x16
+	.byte	0x6c
+	.4byte	0x7f
+	.2byte	0x11c
+	.uleb128 0x16
+	.4byte	.LASF286
+	.byte	0x16
+	.byte	0x6e
+	.4byte	0x3b
+	.2byte	0x120
+	.uleb128 0x16
+	.4byte	.LASF287
+	.byte	0x16
+	.byte	0x6f
+	.4byte	0x3b
+	.2byte	0x128
+	.uleb128 0x16
+	.4byte	.LASF288
+	.byte	0x16
+	.byte	0x70
+	.4byte	0x3b
+	.2byte	0x130
+	.uleb128 0x16
+	.4byte	.LASF289
+	.byte	0x16
+	.byte	0x79
+	.4byte	0x16e
+	.2byte	0x138
+	.uleb128 0x16
+	.4byte	.LASF110
+	.byte	0x16
+	.byte	0x7a
+	.4byte	0xb2c
+	.2byte	0x140
+	.uleb128 0x16
+	.4byte	.LASF290
+	.byte	0x16
+	.byte	0x80
+	.4byte	0x100
+	.2byte	0x180
+	.uleb128 0x16
+	.4byte	.LASF291
+	.byte	0x16
+	.byte	0x81
+	.4byte	0x100
+	.2byte	0x188
+	.uleb128 0x16
+	.4byte	.LASF292
+	.byte	0x16
+	.byte	0x87
+	.4byte	0xb9
+	.2byte	0x190
+	.uleb128 0x16
+	.4byte	.LASF293
+	.byte	0x16
+	.byte	0x8a
+	.4byte	0x54
+	.2byte	0x198
+	.uleb128 0x16
+	.4byte	.LASF294
+	.byte	0x16
+	.byte	0x8c
+	.4byte	0xba5
+	.2byte	0x1a0
+	.uleb128 0x16
+	.4byte	.LASF295
+	.byte	0x16
+	.byte	0x8d
+	.4byte	0x100
+	.2byte	0x1b8
+	.uleb128 0x16
+	.4byte	.LASF296
+	.byte	0x16
+	.byte	0x8e
+	.4byte	0x54
+	.2byte	0x1c0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xbed
+	.uleb128 0xe
+	.4byte	.LASF297
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe29
+	.uleb128 0xe
+	.4byte	.LASF298
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe34
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0xe4f
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF299
+	.byte	0x16
+	.byte	0x9b
+	.4byte	0xbed
+	.uleb128 0x9
+	.4byte	0xe4f
+	.uleb128 0x4
+	.4byte	.LASF300
+	.byte	0x4
+	.byte	0xad
+	.4byte	0x100
+	.uleb128 0xb
+	.4byte	0x94
+	.4byte	0xe75
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF301
+	.byte	0x4
+	.byte	0xaf
+	.4byte	0xe6a
+	.uleb128 0x4
+	.4byte	.LASF302
+	.byte	0x4
+	.byte	0xb0
+	.4byte	0xe6a
+	.uleb128 0x4
+	.4byte	.LASF303
+	.byte	0x4
+	.byte	0xfe
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF304
+	.byte	0x4
+	.byte	0xff
+	.4byte	0x100
+	.uleb128 0xd
+	.4byte	.LASF305
+	.byte	0x4
+	.2byte	0x100
+	.4byte	0x100
+	.uleb128 0x11
+	.4byte	.LASF306
+	.byte	0x4
+	.byte	0x17
+	.byte	0x2e
+	.4byte	0xec6
+	.uleb128 0x12
+	.4byte	.LASF307
+	.byte	0x17
+	.byte	0x2f
+	.4byte	0x11b
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x29
+	.uleb128 0xb
+	.4byte	0x94
+	.4byte	0xedc
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x5
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF308
+	.byte	0x17
+	.2byte	0x1fd
+	.4byte	0xead
+	.uleb128 0xd
+	.4byte	.LASF309
+	.byte	0x17
+	.2byte	0x1fe
+	.4byte	0xead
+	.uleb128 0xd
+	.4byte	.LASF310
+	.byte	0x17
+	.2byte	0x200
+	.4byte	0xead
+	.uleb128 0xd
+	.4byte	.LASF311
+	.byte	0x17
+	.2byte	0x205
+	.4byte	0xe3f
+	.uleb128 0xd
+	.4byte	.LASF312
+	.byte	0x17
+	.2byte	0x206
+	.4byte	0xe3f
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0xf28
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x3f
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF313
+	.byte	0x17
+	.2byte	0x207
+	.4byte	0xf18
+	.uleb128 0xd
+	.4byte	.LASF314
+	.byte	0x17
+	.2byte	0x209
+	.4byte	0xecc
+	.uleb128 0xd
+	.4byte	.LASF315
+	.byte	0x17
+	.2byte	0x20a
+	.4byte	0xecc
+	.uleb128 0xd
+	.4byte	.LASF316
+	.byte	0x17
+	.2byte	0x20b
+	.4byte	0xead
+	.uleb128 0xd
+	.4byte	.LASF317
+	.byte	0x17
+	.2byte	0x20c
+	.4byte	0xead
+	.uleb128 0xd
+	.4byte	.LASF318
+	.byte	0x17
+	.2byte	0x20d
+	.4byte	0xec6
+	.uleb128 0xb
+	.4byte	0xec6
+	.4byte	0xf80
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF319
+	.byte	0x17
+	.2byte	0x20e
+	.4byte	0xf70
+	.uleb128 0xd
+	.4byte	.LASF320
+	.byte	0x17
+	.2byte	0x20f
+	.4byte	0xec6
+	.uleb128 0xd
+	.4byte	.LASF321
+	.byte	0x17
+	.2byte	0x210
+	.4byte	0x54
+	.uleb128 0xb
+	.4byte	0x9e
+	.4byte	0xfb4
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x5
+	.byte	0
+	.uleb128 0x7
+	.4byte	0xfa4
+	.uleb128 0xd
+	.4byte	.LASF322
+	.byte	0x17
+	.2byte	0x211
+	.4byte	0xfb4
+	.uleb128 0xd
+	.4byte	.LASF323
+	.byte	0x17
+	.2byte	0x212
+	.4byte	0xfb4
+	.uleb128 0xd
+	.4byte	.LASF324
+	.byte	0x17
+	.2byte	0x216
+	.4byte	0xf5
+	.uleb128 0xd
+	.4byte	.LASF325
+	.byte	0x17
+	.2byte	0x217
+	.4byte	0xf5
+	.uleb128 0xd
+	.4byte	.LASF326
+	.byte	0x17
+	.2byte	0x219
+	.4byte	0x54
+	.uleb128 0xd
+	.4byte	.LASF327
+	.byte	0x17
+	.2byte	0x220
+	.4byte	0x89f
+	.uleb128 0xd
+	.4byte	.LASF328
+	.byte	0x17
+	.2byte	0x222
+	.4byte	0xa3
+	.uleb128 0xd
+	.4byte	.LASF329
+	.byte	0x17
+	.2byte	0x224
+	.4byte	0xa3
+	.uleb128 0xd
+	.4byte	.LASF330
+	.byte	0x17
+	.2byte	0x230
+	.4byte	0xead
+	.uleb128 0x29
+	.4byte	.LASF332
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x17
+	.2byte	0x286
+	.4byte	0x104f
+	.uleb128 0x26
+	.4byte	.LASF333
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF334
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF335
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF336
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF337
+	.byte	0x17
+	.2byte	0x28c
+	.4byte	0x1025
+	.uleb128 0x4
+	.4byte	.LASF338
+	.byte	0x19
+	.byte	0x2b
+	.4byte	0x13a
+	.uleb128 0x4
+	.4byte	.LASF339
+	.byte	0x19
+	.byte	0x2b
+	.4byte	0x13a
+	.uleb128 0x11
+	.4byte	.LASF340
+	.byte	0x28
+	.byte	0x1a
+	.byte	0x39
+	.4byte	0x10ba
+	.uleb128 0x1a
+	.string	"dev"
+	.byte	0x1a
+	.byte	0x3a
+	.4byte	0x126
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF341
+	.byte	0x1a
+	.byte	0x3b
+	.4byte	0x126
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF342
+	.byte	0x1a
+	.byte	0x3c
+	.4byte	0x54
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF343
+	.byte	0x1a
+	.byte	0x3d
+	.4byte	0xd6
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF344
+	.byte	0x1a
+	.byte	0x3e
+	.4byte	0x10de
+	.byte	0x20
+	.byte	0
+	.uleb128 0x13
+	.4byte	0x100
+	.4byte	0x10d8
+	.uleb128 0x14
+	.4byte	0x10d8
+	.uleb128 0x14
+	.4byte	0x100
+	.uleb128 0x14
+	.4byte	0x100
+	.uleb128 0x14
+	.4byte	0x126
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1071
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x10ba
+	.uleb128 0x11
+	.4byte	.LASF345
+	.byte	0x38
+	.byte	0x1b
+	.byte	0xc
+	.4byte	0x1115
+	.uleb128 0x12
+	.4byte	.LASF346
+	.byte	0x1b
+	.byte	0xd
+	.4byte	0x1071
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF347
+	.byte	0x1b
+	.byte	0x10
+	.4byte	0x126
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF348
+	.byte	0x1b
+	.byte	0x11
+	.4byte	0x100
+	.byte	0x30
+	.byte	0
+	.uleb128 0x25
+	.4byte	.LASF349
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1c
+	.byte	0xb
+	.4byte	0x116e
+	.uleb128 0x26
+	.4byte	.LASF350
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF351
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF352
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF353
+	.byte	0x3
+	.uleb128 0x26
+	.4byte	.LASF354
+	.byte	0x4
+	.uleb128 0x26
+	.4byte	.LASF355
+	.byte	0x5
+	.uleb128 0x26
+	.4byte	.LASF356
+	.byte	0x6
+	.uleb128 0x26
+	.4byte	.LASF357
+	.byte	0x7
+	.uleb128 0x26
+	.4byte	.LASF358
+	.byte	0x8
+	.uleb128 0x26
+	.4byte	.LASF359
+	.byte	0x9
+	.uleb128 0x26
+	.4byte	.LASF360
+	.byte	0xa
+	.uleb128 0x26
+	.4byte	.LASF361
+	.byte	0xb
+	.byte	0
+	.uleb128 0x2a
+	.string	"gd"
+	.byte	0x1
+	.byte	0xf
+	.4byte	0x1178
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe5a
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1
+	.byte	0x40
+	.4byte	0x11a3
+	.uleb128 0x26
+	.4byte	.LASF362
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF363
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF364
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF365
+	.byte	0x3
+	.byte	0
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1
+	.byte	0x47
+	.4byte	0x11da
+	.uleb128 0x26
+	.4byte	.LASF366
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF367
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF368
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF369
+	.byte	0x3
+	.uleb128 0x26
+	.4byte	.LASF370
+	.byte	0x4
+	.uleb128 0x26
+	.4byte	.LASF371
+	.byte	0x5
+	.uleb128 0x26
+	.4byte	.LASF372
+	.byte	0x6
+	.byte	0
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1
+	.byte	0x51
+	.4byte	0x121d
+	.uleb128 0x26
+	.4byte	.LASF373
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF374
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF375
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF376
+	.byte	0x3
+	.uleb128 0x26
+	.4byte	.LASF377
+	.byte	0x4
+	.uleb128 0x26
+	.4byte	.LASF378
+	.byte	0x5
+	.uleb128 0x26
+	.4byte	.LASF379
+	.byte	0x6
+	.uleb128 0x26
+	.4byte	.LASF380
+	.byte	0x7
+	.uleb128 0x26
+	.4byte	.LASF381
+	.byte	0x8
+	.byte	0
+	.uleb128 0xb
+	.4byte	0xd6
+	.4byte	0x122d
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x7
+	.byte	0
+	.uleb128 0x2b
+	.4byte	.LASF382
+	.byte	0x1
+	.byte	0x5d
+	.4byte	0x121d
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	tid_name
+	.uleb128 0x2
+	.4byte	.LASF383
+	.byte	0x1
+	.byte	0x68
+	.4byte	0x124d
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1253
+	.uleb128 0x13
+	.4byte	0x54
+	.4byte	0x1262
+	.uleb128 0x14
+	.4byte	0x1262
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x10e4
+	.uleb128 0x11
+	.4byte	.LASF384
+	.byte	0x28
+	.byte	0x1
+	.byte	0x69
+	.4byte	0x12c7
+	.uleb128 0x1a
+	.string	"fn"
+	.byte	0x1
+	.byte	0x6a
+	.4byte	0x1242
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF138
+	.byte	0x1
+	.byte	0x6b
+	.4byte	0xa3
+	.byte	0x8
+	.uleb128 0x1a
+	.string	"tid"
+	.byte	0x1
+	.byte	0x6c
+	.4byte	0xa3
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF385
+	.byte	0x1
+	.byte	0x6d
+	.4byte	0xa3
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF386
+	.byte	0x1
+	.byte	0x6e
+	.4byte	0xa3
+	.byte	0x14
+	.uleb128 0x1a
+	.string	"ret"
+	.byte	0x1
+	.byte	0x6f
+	.4byte	0x54
+	.byte	0x18
+	.uleb128 0x1a
+	.string	"ms"
+	.byte	0x1
+	.byte	0x70
+	.4byte	0x100
+	.byte	0x20
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF387
+	.2byte	0x148
+	.byte	0x1
+	.byte	0x73
+	.4byte	0x12ee
+	.uleb128 0x12
+	.4byte	.LASF388
+	.byte	0x1
+	.byte	0x74
+	.4byte	0x12ee
+	.byte	0
+	.uleb128 0x17
+	.string	"num"
+	.byte	0x1
+	.byte	0x75
+	.4byte	0x94
+	.2byte	0x140
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x1268
+	.4byte	0x12fe
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x7
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF389
+	.2byte	0x560
+	.byte	0x1
+	.byte	0x78
+	.4byte	0x1331
+	.uleb128 0x12
+	.4byte	.LASF390
+	.byte	0x1
+	.byte	0x79
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x1a
+	.string	"cpu"
+	.byte	0x1
+	.byte	0x7a
+	.4byte	0x1331
+	.byte	0x8
+	.uleb128 0x16
+	.4byte	.LASF391
+	.byte	0x1
+	.byte	0x7b
+	.4byte	0x10e4
+	.2byte	0x528
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x12c7
+	.4byte	0x1341
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x3
+	.byte	0
+	.uleb128 0x2c
+	.string	"mpb"
+	.byte	0x1
+	.byte	0x7e
+	.4byte	0x134c
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x12fe
+	.uleb128 0x2b
+	.4byte	.LASF392
+	.byte	0x1
+	.byte	0x7f
+	.4byte	0x100
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	mpb_gd
+	.uleb128 0x11
+	.4byte	.LASF393
+	.byte	0x18
+	.byte	0x1
+	.byte	0x95
+	.4byte	0x13af
+	.uleb128 0x1a
+	.string	"cid"
+	.byte	0x1
+	.byte	0x96
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x1a
+	.string	"tid"
+	.byte	0x1
+	.byte	0x97
+	.4byte	0xa3
+	.byte	0x4
+	.uleb128 0x1a
+	.string	"fn"
+	.byte	0x1
+	.byte	0x98
+	.4byte	0x1242
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF385
+	.byte	0x1
+	.byte	0x99
+	.4byte	0xa3
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF386
+	.byte	0x1
+	.byte	0x9a
+	.4byte	0xa3
+	.byte	0x14
+	.byte	0
+	.uleb128 0x2d
+	.4byte	.LASF406
+	.byte	0x1
+	.2byte	0x23f
+	.4byte	0x100
+	.8byte	.LFB239
+	.8byte	.LFE239-.LFB239
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x14ef
+	.uleb128 0x2e
+	.string	"evt"
+	.byte	0x1
+	.2byte	0x23f
+	.4byte	0x54
+	.4byte	.LLST61
+	.uleb128 0x2f
+	.4byte	.LASF394
+	.byte	0x1
+	.2byte	0x241
+	.4byte	0x54
+	.4byte	.LLST62
+	.uleb128 0x30
+	.string	"cmd"
+	.byte	0x1
+	.2byte	0x242
+	.4byte	0xe3f
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -32
+	.uleb128 0x31
+	.8byte	.LVL155
+	.4byte	0x1b59
+	.uleb128 0x32
+	.8byte	.LVL157
+	.4byte	0x1b59
+	.4byte	0x1424
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x35
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL158
+	.4byte	0x14ef
+	.uleb128 0x31
+	.8byte	.LVL162
+	.4byte	0x14ef
+	.uleb128 0x31
+	.8byte	.LVL163
+	.4byte	0x14ef
+	.uleb128 0x32
+	.8byte	.LVL164
+	.4byte	0x1b59
+	.4byte	0x1462
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x36
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL165
+	.4byte	0x14ef
+	.uleb128 0x32
+	.8byte	.LVL167
+	.4byte	0x1b59
+	.4byte	0x1486
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x35
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL168
+	.4byte	0x24b5
+	.4byte	0x14b1
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8f
+	.sleb128 16
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x20
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC15
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL169
+	.4byte	0x24c0
+	.4byte	0x14ce
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8f
+	.sleb128 16
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x30
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL170
+	.4byte	0x1cdf
+	.uleb128 0x34
+	.8byte	.LVL171
+	.4byte	0x1b59
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x34
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.4byte	.LASF402
+	.byte	0x1
+	.2byte	0x22f
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x150d
+	.uleb128 0x36
+	.4byte	.LASF395
+	.byte	0x1
+	.2byte	0x231
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF396
+	.byte	0x1
+	.2byte	0x219
+	.8byte	.LFB237
+	.8byte	.LFE237-.LFB237
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16f6
+	.uleb128 0x2e
+	.string	"evt"
+	.byte	0x1
+	.2byte	0x219
+	.4byte	0x54
+	.4byte	.LLST53
+	.uleb128 0x38
+	.4byte	0x178a
+	.8byte	.LBB124
+	.4byte	.Ldebug_ranges0+0x1c0
+	.byte	0x1
+	.2byte	0x21d
+	.4byte	0x1665
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0x1c0
+	.uleb128 0x3a
+	.4byte	0x1797
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x3b
+	.4byte	0x17a3
+	.4byte	.LLST54
+	.uleb128 0x38
+	.4byte	0x2027
+	.8byte	.LBB126
+	.4byte	.Ldebug_ranges0+0x1f0
+	.byte	0x1
+	.2byte	0x203
+	.4byte	0x15ac
+	.uleb128 0x3c
+	.4byte	0x2037
+	.4byte	.LLST55
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0x1f0
+	.uleb128 0x3b
+	.4byte	0x2042
+	.4byte	.LLST56
+	.uleb128 0x3b
+	.4byte	0x204d
+	.4byte	.LLST57
+	.uleb128 0x3b
+	.4byte	0x2058
+	.4byte	.LLST58
+	.byte	0
+	.byte	0
+	.uleb128 0x3d
+	.8byte	.LBB131
+	.8byte	.LBE131-.LBB131
+	.4byte	0x15c7
+	.uleb128 0x3e
+	.4byte	0x17b2
+	.byte	0
+	.uleb128 0x3d
+	.8byte	.LBB132
+	.8byte	.LBE132-.LBB132
+	.4byte	0x15e6
+	.uleb128 0x3b
+	.4byte	0x17c0
+	.4byte	.LLST59
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL130
+	.4byte	0x24cb
+	.4byte	0x1611
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8f
+	.sleb128 16
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR3
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x30
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL131
+	.4byte	0x24d4
+	.4byte	0x1630
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC14
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL132
+	.4byte	0x24df
+	.4byte	0x1656
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x4
+	.byte	0x8
+	.byte	0x82
+	.byte	0x44
+	.byte	0x24
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x560
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL135
+	.4byte	0x24ea
+	.byte	0
+	.byte	0
+	.uleb128 0x3f
+	.4byte	0x2149
+	.8byte	.LBB136
+	.8byte	.LBE136-.LBB136
+	.byte	0x1
+	.2byte	0x226
+	.4byte	0x16a0
+	.uleb128 0x3c
+	.4byte	0x2155
+	.4byte	.LLST60
+	.uleb128 0x40
+	.8byte	.LVL150
+	.4byte	0x24f6
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x3e8
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL147
+	.4byte	0x1edd
+	.4byte	0x16c6
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x33
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x6
+	.byte	0x11
+	.sleb128 -559087616
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL148
+	.4byte	0x24ea
+	.uleb128 0x40
+	.8byte	.LVL152
+	.4byte	0x1edd
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x37
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x6
+	.byte	0x11
+	.sleb128 -559087616
+	.byte	0
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF397
+	.byte	0x1
+	.2byte	0x20e
+	.8byte	.LFB236
+	.8byte	.LFE236-.LFB236
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x178a
+	.uleb128 0x41
+	.4byte	.LASF346
+	.byte	0x1
+	.2byte	0x20e
+	.4byte	0x1071
+	.uleb128 0x2
+	.byte	0x70
+	.sleb128 0
+	.uleb128 0x32
+	.8byte	.LVL124
+	.4byte	0x24cb
+	.4byte	0x173b
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x28
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL125
+	.4byte	0x19bc
+	.4byte	0x1757
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL126
+	.4byte	0x1edd
+	.4byte	0x177c
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x33
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x5
+	.byte	0xc
+	.4byte	0x11111111
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL127
+	.4byte	0x24ea
+	.byte	0
+	.uleb128 0x42
+	.4byte	.LASF419
+	.byte	0x1
+	.2byte	0x1e9
+	.byte	0x1
+	.4byte	0x17ce
+	.uleb128 0x36
+	.4byte	.LASF398
+	.byte	0x1
+	.2byte	0x1ee
+	.4byte	0x17ce
+	.uleb128 0x43
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1fb
+	.4byte	0x54
+	.uleb128 0x44
+	.4byte	0x17bf
+	.uleb128 0x43
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x206
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x45
+	.uleb128 0x43
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x207
+	.4byte	0xa3
+	.byte	0
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x1367
+	.4byte	0x17de
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x1
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF399
+	.byte	0x1
+	.2byte	0x1bf
+	.8byte	.LFB234
+	.8byte	.LFE234-.LFB234
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x18d6
+	.uleb128 0x2e
+	.string	"cpu"
+	.byte	0x1
+	.2byte	0x1bf
+	.4byte	0xa3
+	.4byte	.LLST51
+	.uleb128 0x3f
+	.4byte	0x2086
+	.8byte	.LBB110
+	.8byte	.LBE110-.LBB110
+	.byte	0x1
+	.2byte	0x1c2
+	.4byte	0x1832
+	.uleb128 0x3c
+	.4byte	0x2092
+	.4byte	.LLST52
+	.byte	0
+	.uleb128 0x46
+	.4byte	0x2141
+	.8byte	.LBB112
+	.8byte	.LBE112-.LBB112
+	.byte	0x1
+	.2byte	0x1d6
+	.uleb128 0x46
+	.4byte	0x207e
+	.8byte	.LBB114
+	.8byte	.LBE114-.LBB114
+	.byte	0x1
+	.2byte	0x1da
+	.uleb128 0x31
+	.8byte	.LVL116
+	.4byte	0x2501
+	.uleb128 0x32
+	.8byte	.LVL117
+	.4byte	0x18d6
+	.4byte	0x1887
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL118
+	.4byte	0x24ea
+	.uleb128 0x31
+	.8byte	.LVL119
+	.4byte	0x250d
+	.uleb128 0x31
+	.8byte	.LVL120
+	.4byte	0x2519
+	.uleb128 0x31
+	.8byte	.LVL121
+	.4byte	0x2525
+	.uleb128 0x31
+	.8byte	.LVL122
+	.4byte	0x2531
+	.uleb128 0x31
+	.8byte	.LVL123
+	.4byte	0x253d
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF400
+	.byte	0x1
+	.2byte	0x1b1
+	.8byte	.LFB233
+	.8byte	.LFE233-.LFB233
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x19b6
+	.uleb128 0x2e
+	.string	"cpu"
+	.byte	0x1
+	.2byte	0x1b1
+	.4byte	0xa3
+	.4byte	.LLST42
+	.uleb128 0x2f
+	.4byte	.LASF388
+	.byte	0x1
+	.2byte	0x1b3
+	.4byte	0x19b6
+	.4byte	.LLST43
+	.uleb128 0x47
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1b4
+	.4byte	0x54
+	.4byte	.LLST44
+	.uleb128 0x48
+	.4byte	0x1ae8
+	.8byte	.LBB102
+	.4byte	.Ldebug_ranges0+0x160
+	.byte	0x1
+	.2byte	0x1b8
+	.uleb128 0x3c
+	.4byte	0x1b1c
+	.4byte	.LLST45
+	.uleb128 0x3c
+	.4byte	0x1b10
+	.4byte	.LLST46
+	.uleb128 0x3c
+	.4byte	0x1b05
+	.4byte	.LLST47
+	.uleb128 0x3c
+	.4byte	0x1af9
+	.4byte	.LLST48
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0x160
+	.uleb128 0x3e
+	.4byte	0x1b28
+	.uleb128 0x3e
+	.4byte	0x1b34
+	.uleb128 0x3b
+	.4byte	0x1b40
+	.4byte	.LLST49
+	.uleb128 0x3b
+	.4byte	0x1b4c
+	.4byte	.LLST50
+	.uleb128 0x38
+	.4byte	0x2062
+	.8byte	.LBB104
+	.4byte	.Ldebug_ranges0+0x190
+	.byte	0x1
+	.2byte	0x179
+	.4byte	0x1999
+	.uleb128 0x49
+	.4byte	0x2072
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL110
+	.4byte	0x21f4
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x87
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1268
+	.uleb128 0x37
+	.4byte	.LASF401
+	.byte	0x1
+	.2byte	0x1a3
+	.8byte	.LFB232
+	.8byte	.LFE232-.LFB232
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1ae8
+	.uleb128 0x2e
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x1a3
+	.4byte	0xa3
+	.4byte	.LLST31
+	.uleb128 0x2e
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x1a3
+	.4byte	0xa3
+	.4byte	.LLST32
+	.uleb128 0x2f
+	.4byte	.LASF388
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0x19b6
+	.4byte	.LLST33
+	.uleb128 0x47
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1a6
+	.4byte	0x54
+	.4byte	.LLST34
+	.uleb128 0x38
+	.4byte	0x2062
+	.8byte	.LBB90
+	.4byte	.Ldebug_ranges0+0x130
+	.byte	0x1
+	.2byte	0x1a8
+	.4byte	0x1a3a
+	.uleb128 0x3c
+	.4byte	0x2072
+	.4byte	.LLST35
+	.byte	0
+	.uleb128 0x4a
+	.4byte	0x1ae8
+	.8byte	.LBB94
+	.8byte	.LBE94-.LBB94
+	.byte	0x1
+	.2byte	0x1ad
+	.uleb128 0x3c
+	.4byte	0x1b1c
+	.4byte	.LLST36
+	.uleb128 0x3c
+	.4byte	0x1b10
+	.4byte	.LLST37
+	.uleb128 0x3c
+	.4byte	0x1b05
+	.4byte	.LLST38
+	.uleb128 0x3c
+	.4byte	0x1af9
+	.4byte	.LLST39
+	.uleb128 0x4b
+	.8byte	.LBB95
+	.8byte	.LBE95-.LBB95
+	.uleb128 0x3e
+	.4byte	0x1b28
+	.uleb128 0x3e
+	.4byte	0x1b34
+	.uleb128 0x3b
+	.4byte	0x1b40
+	.4byte	.LLST40
+	.uleb128 0x3b
+	.4byte	0x1b4c
+	.4byte	.LLST41
+	.uleb128 0x3f
+	.4byte	0x2062
+	.8byte	.LBB96
+	.8byte	.LBE96-.LBB96
+	.byte	0x1
+	.2byte	0x179
+	.4byte	0x1ac5
+	.uleb128 0x49
+	.4byte	0x2072
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL99
+	.4byte	0x21f4
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x87
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.4byte	.LASF403
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1b59
+	.uleb128 0x4c
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xa3
+	.uleb128 0x4c
+	.string	"id"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0x94
+	.uleb128 0x4c
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xa3
+	.uleb128 0x4d
+	.4byte	.LASF385
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xa3
+	.uleb128 0x36
+	.4byte	.LASF404
+	.byte	0x1
+	.2byte	0x174
+	.4byte	0x8d
+	.uleb128 0x36
+	.4byte	.LASF405
+	.byte	0x1
+	.2byte	0x175
+	.4byte	0x54
+	.uleb128 0x43
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x176
+	.4byte	0x54
+	.uleb128 0x43
+	.string	"run"
+	.byte	0x1
+	.2byte	0x177
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x2d
+	.4byte	.LASF407
+	.byte	0x1
+	.2byte	0x16d
+	.4byte	0x54
+	.8byte	.LFB230
+	.8byte	.LFE230-.LFB230
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1c3c
+	.uleb128 0x2e
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x16d
+	.4byte	0xa3
+	.4byte	.LLST28
+	.uleb128 0x48
+	.4byte	0x1c3c
+	.8byte	.LBB78
+	.4byte	.Ldebug_ranges0+0x100
+	.byte	0x1
+	.2byte	0x16f
+	.uleb128 0x4e
+	.4byte	0x1c59
+	.byte	0
+	.uleb128 0x3c
+	.4byte	0x1c4d
+	.4byte	.LLST29
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0x100
+	.uleb128 0x3e
+	.4byte	0x1c65
+	.uleb128 0x3f
+	.4byte	0x2149
+	.8byte	.LBB80
+	.8byte	.LBE80-.LBB80
+	.byte	0x1
+	.2byte	0x164
+	.4byte	0x1c0c
+	.uleb128 0x3c
+	.4byte	0x2155
+	.4byte	.LLST30
+	.uleb128 0x32
+	.8byte	.LVL86
+	.4byte	0x24f6
+	.4byte	0x1bf6
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x3e8
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL87
+	.4byte	0x24f6
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x3e8
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL84
+	.4byte	0x1e3e
+	.4byte	0x1c24
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x40
+	.8byte	.LVL89
+	.4byte	0x1e3e
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.4byte	.LASF408
+	.byte	0x1
+	.2byte	0x15f
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1c70
+	.uleb128 0x4c
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x15f
+	.4byte	0xa3
+	.uleb128 0x4d
+	.4byte	.LASF409
+	.byte	0x1
+	.2byte	0x15f
+	.4byte	0xa3
+	.uleb128 0x43
+	.string	"i"
+	.byte	0x1
+	.2byte	0x161
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x35
+	.4byte	.LASF410
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1cdf
+	.uleb128 0x4c
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xa3
+	.uleb128 0x4c
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xa3
+	.uleb128 0x4d
+	.4byte	.LASF385
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xa3
+	.uleb128 0x36
+	.4byte	.LASF405
+	.byte	0x1
+	.2byte	0x13a
+	.4byte	0x54
+	.uleb128 0x43
+	.string	"us"
+	.byte	0x1
+	.2byte	0x13b
+	.4byte	0x54
+	.uleb128 0x43
+	.string	"i"
+	.byte	0x1
+	.2byte	0x13c
+	.4byte	0x54
+	.uleb128 0x36
+	.4byte	.LASF411
+	.byte	0x1
+	.2byte	0x13c
+	.4byte	0x54
+	.uleb128 0x36
+	.4byte	.LASF412
+	.byte	0x1
+	.2byte	0x13d
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF413
+	.byte	0x1
+	.2byte	0x121
+	.8byte	.LFB227
+	.8byte	.LFE227-.LFB227
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1e3e
+	.uleb128 0x2f
+	.4byte	.LASF388
+	.byte	0x1
+	.2byte	0x123
+	.4byte	0x19b6
+	.4byte	.LLST8
+	.uleb128 0x47
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0x54
+	.4byte	.LLST9
+	.uleb128 0x47
+	.string	"i"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0x54
+	.4byte	.LLST10
+	.uleb128 0x32
+	.8byte	.LVL26
+	.4byte	0x24d4
+	.4byte	0x1d4a
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC2
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL29
+	.4byte	0x24d4
+	.4byte	0x1d68
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL30
+	.4byte	0x24d4
+	.4byte	0x1d87
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC4
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL31
+	.4byte	0x24d4
+	.4byte	0x1da6
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC5
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL32
+	.4byte	0x24d4
+	.4byte	0x1dc5
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC6
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL33
+	.4byte	0x24d4
+	.4byte	0x1de4
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC7
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL34
+	.4byte	0x24d4
+	.4byte	0x1e03
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC8
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL35
+	.4byte	0x24d4
+	.4byte	0x1e22
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC9
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL36
+	.4byte	0x24d4
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC10
+	.byte	0
+	.byte	0
+	.uleb128 0x2d
+	.4byte	.LASF414
+	.byte	0x1
+	.2byte	0x104
+	.4byte	0x54
+	.8byte	.LFB226
+	.8byte	.LFE226-.LFB226
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1ed7
+	.uleb128 0x2e
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x104
+	.4byte	0xa3
+	.4byte	.LLST5
+	.uleb128 0x43
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x106
+	.4byte	0x54
+	.uleb128 0x47
+	.string	"i"
+	.byte	0x1
+	.2byte	0x106
+	.4byte	0x54
+	.4byte	.LLST6
+	.uleb128 0x47
+	.string	"ptr"
+	.byte	0x1
+	.2byte	0x107
+	.4byte	0x1ed7
+	.4byte	.LLST7
+	.uleb128 0x3f
+	.4byte	0x2062
+	.8byte	.LBB40
+	.8byte	.LBE40-.LBB40
+	.byte	0x1
+	.2byte	0x109
+	.4byte	0x1ebc
+	.uleb128 0x49
+	.4byte	0x2072
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL23
+	.4byte	0x2549
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xa3
+	.uleb128 0x4f
+	.4byte	.LASF450
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0x54
+	.8byte	.LFB225
+	.8byte	.LFE225-.LFB225
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1faa
+	.uleb128 0x50
+	.string	"cid"
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0xa3
+	.4byte	.LLST0
+	.uleb128 0x50
+	.string	"tid"
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0xa3
+	.4byte	.LLST1
+	.uleb128 0x50
+	.string	"st"
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0xa3
+	.4byte	.LLST2
+	.uleb128 0x51
+	.4byte	.LASF31
+	.byte	0x1
+	.byte	0xe4
+	.4byte	0xef
+	.uleb128 0x2c
+	.string	"ptr"
+	.byte	0x1
+	.byte	0xe5
+	.4byte	0x1ed7
+	.uleb128 0x2c
+	.string	"id"
+	.byte	0x1
+	.byte	0xe6
+	.4byte	0x54
+	.uleb128 0x52
+	.4byte	0x2062
+	.8byte	.LBB30
+	.8byte	.LBE30-.LBB30
+	.byte	0x1
+	.byte	0xe8
+	.4byte	0x1f6b
+	.uleb128 0x49
+	.4byte	0x2072
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x1ff7
+	.8byte	.LBB32
+	.4byte	.Ldebug_ranges0+0
+	.byte	0x1
+	.byte	0xeb
+	.4byte	0x1f9c
+	.uleb128 0x49
+	.4byte	0x2012
+	.uleb128 0x49
+	.4byte	0x2007
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0
+	.uleb128 0x3b
+	.4byte	0x201d
+	.4byte	.LLST3
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL8
+	.4byte	0x2555
+	.byte	0
+	.uleb128 0x54
+	.4byte	.LASF415
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1ff1
+	.uleb128 0x55
+	.string	"cid"
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0xa3
+	.uleb128 0x55
+	.string	"tid"
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0xa3
+	.uleb128 0x55
+	.string	"ret"
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"ptr"
+	.byte	0x1
+	.byte	0xd1
+	.4byte	0x1ff1
+	.uleb128 0x2c
+	.string	"id"
+	.byte	0x1
+	.byte	0xd2
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x54
+	.uleb128 0x54
+	.4byte	.LASF416
+	.byte	0x1
+	.byte	0xc3
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x2027
+	.uleb128 0x55
+	.string	"cid"
+	.byte	0x1
+	.byte	0xc3
+	.4byte	0xa3
+	.uleb128 0x55
+	.string	"tid"
+	.byte	0x1
+	.byte	0xc3
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"i"
+	.byte	0x1
+	.byte	0xc5
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x54
+	.4byte	.LASF417
+	.byte	0x1
+	.byte	0x9d
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x2062
+	.uleb128 0x56
+	.4byte	.LASF398
+	.byte	0x1
+	.byte	0x9d
+	.4byte	0x1367
+	.uleb128 0x2c
+	.string	"cid"
+	.byte	0x1
+	.byte	0x9f
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"tid"
+	.byte	0x1
+	.byte	0xa0
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"i"
+	.byte	0x1
+	.byte	0xa1
+	.4byte	0x94
+	.byte	0
+	.uleb128 0x54
+	.4byte	.LASF418
+	.byte	0x1
+	.byte	0x90
+	.4byte	0x54
+	.byte	0x3
+	.4byte	0x207e
+	.uleb128 0x55
+	.string	"tid"
+	.byte	0x1
+	.byte	0x90
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x57
+	.4byte	.LASF427
+	.byte	0x1
+	.byte	0x86
+	.byte	0x3
+	.uleb128 0x58
+	.4byte	.LASF420
+	.byte	0x1
+	.byte	0x81
+	.byte	0x3
+	.4byte	0x209e
+	.uleb128 0x55
+	.string	"ptr"
+	.byte	0x1
+	.byte	0x81
+	.4byte	0x10b
+	.byte	0
+	.uleb128 0x59
+	.4byte	.LASF451
+	.byte	0x1
+	.byte	0x34
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x20ba
+	.uleb128 0x56
+	.4byte	.LASF421
+	.byte	0x1
+	.byte	0x34
+	.4byte	0x1262
+	.byte	0
+	.uleb128 0x5a
+	.4byte	.LASF422
+	.byte	0x1
+	.byte	0x33
+	.4byte	0x54
+	.4byte	0x20d5
+	.uleb128 0x56
+	.4byte	.LASF421
+	.byte	0x1
+	.byte	0x33
+	.4byte	0x1262
+	.byte	0
+	.uleb128 0x5a
+	.4byte	.LASF423
+	.byte	0x1
+	.byte	0x32
+	.4byte	0x54
+	.4byte	0x20f0
+	.uleb128 0x56
+	.4byte	.LASF421
+	.byte	0x1
+	.byte	0x32
+	.4byte	0x1262
+	.byte	0
+	.uleb128 0x5a
+	.4byte	.LASF424
+	.byte	0x1
+	.byte	0x31
+	.4byte	0x54
+	.4byte	0x210b
+	.uleb128 0x56
+	.4byte	.LASF421
+	.byte	0x1
+	.byte	0x31
+	.4byte	0x1262
+	.byte	0
+	.uleb128 0x5a
+	.4byte	.LASF425
+	.byte	0x1
+	.byte	0x30
+	.4byte	0x54
+	.4byte	0x2126
+	.uleb128 0x56
+	.4byte	.LASF421
+	.byte	0x1
+	.byte	0x30
+	.4byte	0x1262
+	.byte	0
+	.uleb128 0x5a
+	.4byte	.LASF426
+	.byte	0x1
+	.byte	0x2f
+	.4byte	0x54
+	.4byte	0x2141
+	.uleb128 0x56
+	.4byte	.LASF421
+	.byte	0x1
+	.byte	0x2f
+	.4byte	0x1262
+	.byte	0
+	.uleb128 0x57
+	.4byte	.LASF428
+	.byte	0x3
+	.byte	0xbf
+	.byte	0x3
+	.uleb128 0x58
+	.4byte	.LASF429
+	.byte	0x2
+	.byte	0xd
+	.byte	0x3
+	.4byte	0x2161
+	.uleb128 0x56
+	.4byte	.LASF430
+	.byte	0x2
+	.byte	0xd
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x5b
+	.4byte	0x14ef
+	.8byte	.LFB238
+	.8byte	.LFE238-.LFB238
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x21cf
+	.uleb128 0x3a
+	.4byte	0x1500
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	once.6657
+	.uleb128 0x3d
+	.8byte	.LBB39
+	.8byte	.LBE39-.LBB39
+	.4byte	0x21c1
+	.uleb128 0x3e
+	.4byte	0x217c
+	.uleb128 0x34
+	.8byte	.LVL10
+	.4byte	0x24d4
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC1
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL9
+	.4byte	0x2561
+	.byte	0
+	.uleb128 0x5b
+	.4byte	0x209e
+	.8byte	.LFB218
+	.8byte	.LFE218-.LFB218
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x21f4
+	.uleb128 0x3c
+	.4byte	0x20ae
+	.4byte	.LLST4
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x1ae8
+	.8byte	.LFB242
+	.8byte	.LFE242-.LFB242
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x24b5
+	.uleb128 0x3c
+	.4byte	0x1af9
+	.4byte	.LLST11
+	.uleb128 0x3c
+	.4byte	0x1b05
+	.4byte	.LLST12
+	.uleb128 0x3c
+	.4byte	0x1b10
+	.4byte	.LLST13
+	.uleb128 0x3c
+	.4byte	0x1b1c
+	.4byte	.LLST14
+	.uleb128 0x3b
+	.4byte	0x1b28
+	.4byte	.LLST15
+	.uleb128 0x3e
+	.4byte	0x1b34
+	.uleb128 0x3b
+	.4byte	0x1b40
+	.4byte	.LLST16
+	.uleb128 0x3b
+	.4byte	0x1b4c
+	.4byte	.LLST17
+	.uleb128 0x38
+	.4byte	0x1c70
+	.8byte	.LBB52
+	.4byte	.Ldebug_ranges0+0x30
+	.byte	0x1
+	.2byte	0x17f
+	.4byte	0x2308
+	.uleb128 0x3c
+	.4byte	0x1c81
+	.4byte	.LLST18
+	.uleb128 0x3c
+	.4byte	0x1c8d
+	.4byte	.LLST19
+	.uleb128 0x3c
+	.4byte	0x1c99
+	.4byte	.LLST20
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0x30
+	.uleb128 0x3b
+	.4byte	0x1ca5
+	.4byte	.LLST21
+	.uleb128 0x5d
+	.4byte	0x1cb1
+	.byte	0x64
+	.uleb128 0x3e
+	.4byte	0x1cbc
+	.uleb128 0x3b
+	.4byte	0x1cc6
+	.4byte	.LLST22
+	.uleb128 0x3b
+	.4byte	0x1cd2
+	.4byte	.LLST23
+	.uleb128 0x32
+	.8byte	.LVL43
+	.4byte	0x1e3e
+	.4byte	0x22c9
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL44
+	.4byte	0x1e3e
+	.4byte	0x22e1
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL53
+	.4byte	0x24f6
+	.4byte	0x22f9
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x64
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL56
+	.4byte	0x1cdf
+	.byte	0
+	.byte	0
+	.uleb128 0x38
+	.4byte	0x1faa
+	.8byte	.LBB56
+	.4byte	.Ldebug_ranges0+0x60
+	.byte	0x1
+	.2byte	0x19e
+	.4byte	0x23ab
+	.uleb128 0x3c
+	.4byte	0x1fd0
+	.4byte	.LLST24
+	.uleb128 0x3c
+	.4byte	0x1fc5
+	.4byte	.LLST25
+	.uleb128 0x3c
+	.4byte	0x1fba
+	.4byte	.LLST26
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0x60
+	.uleb128 0x3e
+	.4byte	0x1fdb
+	.uleb128 0x3e
+	.4byte	0x1fe6
+	.uleb128 0x52
+	.4byte	0x2062
+	.8byte	.LBB58
+	.8byte	.LBE58-.LBB58
+	.byte	0x1
+	.byte	0xd4
+	.4byte	0x236b
+	.uleb128 0x49
+	.4byte	0x2072
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x1ff7
+	.8byte	.LBB60
+	.4byte	.Ldebug_ranges0+0xd0
+	.byte	0x1
+	.byte	0xd7
+	.4byte	0x239c
+	.uleb128 0x49
+	.4byte	0x2012
+	.uleb128 0x49
+	.4byte	0x2007
+	.uleb128 0x39
+	.4byte	.Ldebug_ranges0+0xd0
+	.uleb128 0x3b
+	.4byte	0x201d
+	.4byte	.LLST27
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.8byte	.LVL81
+	.4byte	0x2555
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL50
+	.4byte	0x24d4
+	.4byte	0x23d6
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC12
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL51
+	.4byte	0x1edd
+	.4byte	0x23fd
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x5
+	.byte	0xc
+	.4byte	0x55555555
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL59
+	.4byte	0x24d4
+	.4byte	0x2428
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC13
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL60
+	.4byte	0x256c
+	.uleb128 0x32
+	.8byte	.LVL63
+	.4byte	0x1edd
+	.4byte	0x245c
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x5
+	.byte	0xc
+	.4byte	0x11111111
+	.byte	0
+	.uleb128 0x32
+	.8byte	.LVL67
+	.4byte	0x1edd
+	.4byte	0x247a
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x31
+	.8byte	.LVL68
+	.4byte	0x256c
+	.uleb128 0x34
+	.8byte	.LVL70
+	.4byte	0x24d4
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC11
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x33
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.4byte	.LASF431
+	.4byte	.LASF431
+	.byte	0x1e
+	.byte	0x8e
+	.uleb128 0x5f
+	.4byte	.LASF432
+	.4byte	.LASF432
+	.byte	0x4
+	.byte	0x6b
+	.uleb128 0x60
+	.4byte	.LASF452
+	.4byte	.LASF452
+	.uleb128 0x5f
+	.4byte	.LASF433
+	.4byte	.LASF433
+	.byte	0x1f
+	.byte	0x13
+	.uleb128 0x5f
+	.4byte	.LASF434
+	.4byte	.LASF434
+	.byte	0x8
+	.byte	0x66
+	.uleb128 0x61
+	.4byte	.LASF435
+	.4byte	.LASF435
+	.byte	0x4
+	.2byte	0x260
+	.uleb128 0x5f
+	.4byte	.LASF436
+	.4byte	.LASF436
+	.byte	0x2
+	.byte	0xb
+	.uleb128 0x61
+	.4byte	.LASF437
+	.4byte	.LASF437
+	.byte	0x4
+	.2byte	0x1f3
+	.uleb128 0x61
+	.4byte	.LASF438
+	.4byte	.LASF438
+	.byte	0x4
+	.2byte	0x248
+	.uleb128 0x61
+	.4byte	.LASF439
+	.4byte	.LASF439
+	.byte	0x4
+	.2byte	0x1f1
+	.uleb128 0x61
+	.4byte	.LASF440
+	.4byte	.LASF440
+	.byte	0x4
+	.2byte	0x264
+	.uleb128 0x61
+	.4byte	.LASF441
+	.4byte	.LASF441
+	.byte	0x4
+	.2byte	0x1f4
+	.uleb128 0x61
+	.4byte	.LASF442
+	.4byte	.LASF442
+	.byte	0x4
+	.2byte	0x263
+	.uleb128 0x61
+	.4byte	.LASF443
+	.4byte	.LASF443
+	.byte	0x4
+	.2byte	0x262
+	.uleb128 0x61
+	.4byte	.LASF444
+	.4byte	.LASF444
+	.byte	0x4
+	.2byte	0x261
+	.uleb128 0x5f
+	.4byte	.LASF445
+	.4byte	.LASF445
+	.byte	0x1c
+	.byte	0x50
+	.uleb128 0x61
+	.4byte	.LASF446
+	.4byte	.LASF446
+	.byte	0x4
+	.2byte	0x276
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x26
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0x35
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0x1
+	.byte	0x1
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xc
+	.uleb128 0x21
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0xe
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0xf
+	.uleb128 0x26
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x10
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x12
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x13
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x14
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x15
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x16
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x17
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x18
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1a
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x1b
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x1d
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1e
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1f
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x20
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x21
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x22
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x23
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x24
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x25
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x26
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x27
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x28
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x29
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x2b
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x2c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2d
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2e
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2f
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x30
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x33
+	.uleb128 0x410a
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x18
+	.uleb128 0x2111
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x34
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x36
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x37
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x38
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3c
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3d
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3e
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x40
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x41
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x42
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x43
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x44
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.uleb128 0xb
+	.byte	0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.uleb128 0x1d
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x47
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x48
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4d
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4e
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x4f
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x52
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x55
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x56
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x57
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5b
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2116
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5d
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x60
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST61:
+	.8byte	.LVL153
+	.8byte	.LVL154
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL154
+	.8byte	.LVL172
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL172
+	.8byte	.LVL173
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL173
+	.8byte	.LFE239
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST62:
+	.8byte	.LVL156
+	.8byte	.LVL159
+	.2byte	0x2
+	.byte	0x35
+	.byte	0x9f
+	.8byte	.LVL160
+	.8byte	.LVL161
+	.2byte	0x2
+	.byte	0x35
+	.byte	0x9f
+	.8byte	.LVL166
+	.8byte	.LVL172
+	.2byte	0x2
+	.byte	0x35
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST53:
+	.8byte	.LVL128
+	.8byte	.LVL129
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL129
+	.8byte	.LVL145
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL145
+	.8byte	.LVL146
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL146
+	.8byte	.LVL150
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL150
+	.8byte	.LVL151
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL151
+	.8byte	.LFE237
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST54:
+	.8byte	.LVL133
+	.8byte	.LVL134
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST55:
+	.8byte	.LVL138
+	.8byte	.LVL139
+	.2byte	0x7
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x53
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x93
+	.uleb128 0x10
+	.8byte	.LVL139
+	.8byte	.LVL143
+	.2byte	0xe
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x53
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5d
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5c
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5b
+	.byte	0x93
+	.uleb128 0x4
+	.8byte	.LVL143
+	.8byte	.LVL144
+	.2byte	0xf
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x71
+	.sleb128 20
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5d
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5c
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5b
+	.byte	0x93
+	.uleb128 0x4
+	.8byte	.LVL144
+	.8byte	.LVL145
+	.2byte	0xb
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5d
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5c
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5b
+	.byte	0x93
+	.uleb128 0x4
+	.8byte	0
+	.8byte	0
+.LLST56:
+	.8byte	.LVL139
+	.8byte	.LVL141
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL141
+	.8byte	.LVL142
+	.2byte	0x2
+	.byte	0x70
+	.sleb128 0
+	.8byte	0
+	.8byte	0
+.LLST57:
+	.8byte	.LVL139
+	.8byte	.LVL143
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL143
+	.8byte	.LVL144
+	.2byte	0x2
+	.byte	0x71
+	.sleb128 20
+	.8byte	0
+	.8byte	0
+.LLST58:
+	.8byte	.LVL140
+	.8byte	.LVL141
+	.2byte	0x11
+	.byte	0x71
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200148
+	.8byte	.LVL141
+	.8byte	.LVL142
+	.2byte	0x13
+	.byte	0x70
+	.sleb128 0
+	.byte	0x94
+	.byte	0x4
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200148
+	.8byte	0
+	.8byte	0
+.LLST59:
+	.8byte	.LVL136
+	.8byte	.LVL137
+	.2byte	0x6
+	.byte	0x9e
+	.uleb128 0x4
+	.4byte	0xdeadbeaf
+	.8byte	0
+	.8byte	0
+.LLST60:
+	.8byte	.LVL149
+	.8byte	.LVL150
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST51:
+	.8byte	.LVL112
+	.8byte	.LVL113
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL113
+	.8byte	.LFE234
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST52:
+	.8byte	.LVL114
+	.8byte	.LVL115
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL101
+	.8byte	.LVL102
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL102
+	.8byte	.LVL104
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL104
+	.8byte	.LVL107
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL107
+	.8byte	.LFE233
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL103
+	.8byte	.LVL104
+	.2byte	0x12
+	.byte	0x86
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL104
+	.8byte	.LVL107
+	.2byte	0x12
+	.byte	0x87
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL107
+	.8byte	.LVL108
+	.2byte	0x13
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL108
+	.8byte	.LFE233
+	.2byte	0x12
+	.byte	0x87
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST44:
+	.8byte	.LVL103
+	.8byte	.LVL105
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL105
+	.8byte	.LVL106
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL108
+	.8byte	.LFE233
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST45:
+	.8byte	.LVL109
+	.8byte	.LVL110-1
+	.2byte	0x2
+	.byte	0x83
+	.sleb128 16
+	.8byte	0
+	.8byte	0
+.LLST46:
+	.8byte	.LVL109
+	.8byte	.LVL110-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST47:
+	.8byte	.LVL109
+	.8byte	.LVL110
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST48:
+	.8byte	.LVL109
+	.8byte	.LVL110
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST49:
+	.8byte	.LVL109
+	.8byte	.LVL110
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST50:
+	.8byte	.LVL109
+	.8byte	.LVL110
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST31:
+	.8byte	.LVL90
+	.8byte	.LVL93
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL93
+	.8byte	.LVL94
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL94
+	.8byte	.LVL96
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL96
+	.8byte	.LFE232
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST32:
+	.8byte	.LVL90
+	.8byte	.LVL95
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL95
+	.8byte	.LVL96
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL96
+	.8byte	.LVL97
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL97
+	.8byte	.LFE232
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST33:
+	.8byte	.LVL90
+	.8byte	.LVL92
+	.2byte	0x12
+	.byte	0x70
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL92
+	.8byte	.LVL94
+	.2byte	0xc
+	.byte	0x89
+	.sleb128 0
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL94
+	.8byte	.LVL96
+	.2byte	0xc
+	.byte	0x86
+	.sleb128 0
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL96
+	.8byte	.LVL97
+	.2byte	0x13
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL97
+	.8byte	.LFE232
+	.2byte	0xc
+	.byte	0x86
+	.sleb128 0
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST34:
+	.8byte	.LVL95
+	.8byte	.LVL96
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL97
+	.8byte	.LFE232
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST35:
+	.8byte	.LVL90
+	.8byte	.LVL91
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST36:
+	.8byte	.LVL98
+	.8byte	.LVL99-1
+	.2byte	0x2
+	.byte	0x83
+	.sleb128 16
+	.8byte	0
+	.8byte	0
+.LLST37:
+	.8byte	.LVL98
+	.8byte	.LVL99
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL98
+	.8byte	.LVL99
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST39:
+	.8byte	.LVL98
+	.8byte	.LVL99
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST40:
+	.8byte	.LVL98
+	.8byte	.LVL99
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST41:
+	.8byte	.LVL98
+	.8byte	.LVL99
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST28:
+	.8byte	.LVL82
+	.8byte	.LVL83
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL83
+	.8byte	.LVL88
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL88
+	.8byte	.LVL89-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL89-1
+	.8byte	.LFE230
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST29:
+	.8byte	.LVL83
+	.8byte	.LVL88
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL88
+	.8byte	.LVL89-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL89-1
+	.8byte	.LFE230
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST30:
+	.8byte	.LVL85
+	.8byte	.LVL86
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	.LVL86
+	.8byte	.LVL87
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST8:
+	.8byte	.LVL27
+	.8byte	.LVL28
+	.2byte	0x1e
+	.byte	0x86
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0x8
+	.byte	0x28
+	.byte	0x1e
+	.byte	0x85
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL28
+	.8byte	.LVL36
+	.2byte	0x1e
+	.byte	0x86
+	.sleb128 -1
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0x8
+	.byte	0x28
+	.byte	0x1e
+	.byte	0x85
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST9:
+	.8byte	.LVL26
+	.8byte	.LVL38
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST10:
+	.8byte	.LVL27
+	.8byte	.LVL28
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL28
+	.8byte	.LVL36
+	.2byte	0x3
+	.byte	0x86
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL36
+	.8byte	.LVL38
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST5:
+	.8byte	.LVL13
+	.8byte	.LVL14
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL14
+	.8byte	.LVL19
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL19
+	.8byte	.LVL21
+	.2byte	0x5
+	.byte	0x8b
+	.sleb128 65536
+	.byte	0x9f
+	.8byte	.LVL21
+	.8byte	.LVL22
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL22
+	.8byte	.LVL24
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL24
+	.8byte	.LVL25
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL25
+	.8byte	.LFE226
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL15
+	.8byte	.LVL20
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL22
+	.8byte	.LVL24
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST7:
+	.8byte	.LVL22
+	.8byte	.LVL24
+	.2byte	0x3
+	.byte	0x84
+	.sleb128 -4
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST0:
+	.8byte	.LVL0
+	.8byte	.LVL1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1
+	.8byte	.LVL3
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL3
+	.8byte	.LFE225
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST1:
+	.8byte	.LVL0
+	.8byte	.LVL7
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL7
+	.8byte	.LFE225
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST2:
+	.8byte	.LVL0
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL8-1
+	.8byte	.LFE225
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST3:
+	.8byte	.LVL2
+	.8byte	.LVL3
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL4
+	.8byte	.LVL6
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST4:
+	.8byte	.LVL11
+	.8byte	.LVL12
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL12
+	.8byte	.LFE218
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST11:
+	.8byte	.LVL39
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL41
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL71
+	.8byte	.LVL73
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL73
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST12:
+	.8byte	.LVL39
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL41
+	.8byte	.LVL69
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL69
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST13:
+	.8byte	.LVL39
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL41
+	.8byte	.LVL74
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL74
+	.8byte	.LVL76
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL76
+	.8byte	.LVL79
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL79
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST14:
+	.8byte	.LVL39
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL41
+	.8byte	.LVL49
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL49
+	.8byte	.LVL52
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL52
+	.8byte	.LVL57
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL57
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST15:
+	.8byte	.LVL61
+	.8byte	.LVL62
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL62
+	.8byte	.LVL70
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST16:
+	.8byte	.LVL65
+	.8byte	.LVL66
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL66
+	.8byte	.LVL75
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL76
+	.8byte	.LVL80
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL80
+	.8byte	.LVL81-1
+	.2byte	0x2
+	.byte	0x72
+	.sleb128 32
+	.8byte	0
+	.8byte	0
+.LLST17:
+	.8byte	.LVL48
+	.8byte	.LVL52
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL58
+	.8byte	.LVL70
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST18:
+	.8byte	.LVL40
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL41
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL71
+	.8byte	.LVL73
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL73
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL40
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL41
+	.8byte	.LVL74
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL74
+	.8byte	.LVL76
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL76
+	.8byte	.LVL79
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL79
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST20:
+	.8byte	.LVL40
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL41
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL52
+	.8byte	.LVL57
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST21:
+	.8byte	.LVL40
+	.8byte	.LVL41
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL41
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL52
+	.8byte	.LVL57
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST22:
+	.8byte	.LVL41
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL52
+	.8byte	.LVL57
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST23:
+	.8byte	.LVL42
+	.8byte	.LVL45
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e20
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL52
+	.8byte	.LVL53
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e20
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL53
+	.8byte	.LVL54
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e21
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL54
+	.8byte	.LVL55
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e20
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL55
+	.8byte	.LVL57
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST24:
+	.8byte	.LVL70
+	.8byte	.LVL75
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL76
+	.8byte	.LVL80
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL80
+	.8byte	.LVL81-1
+	.2byte	0x2
+	.byte	0x72
+	.sleb128 32
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL70
+	.8byte	.LVL74
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL74
+	.8byte	.LVL76
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL76
+	.8byte	.LVL79
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL79
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST26:
+	.8byte	.LVL70
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL71
+	.8byte	.LVL73
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL73
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL72
+	.8byte	.LVL73
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL76
+	.8byte	.LVL78
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+	.section	.debug_aranges,"",@progbits
+	.4byte	0xec
+	.2byte	0x2
+	.4byte	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.2byte	0
+	.2byte	0
+	.8byte	.LFB225
+	.8byte	.LFE225-.LFB225
+	.8byte	.LFB238
+	.8byte	.LFE238-.LFB238
+	.8byte	.LFB218
+	.8byte	.LFE218-.LFB218
+	.8byte	.LFB226
+	.8byte	.LFE226-.LFB226
+	.8byte	.LFB227
+	.8byte	.LFE227-.LFB227
+	.8byte	.LFB242
+	.8byte	.LFE242-.LFB242
+	.8byte	.LFB230
+	.8byte	.LFE230-.LFB230
+	.8byte	.LFB232
+	.8byte	.LFE232-.LFB232
+	.8byte	.LFB233
+	.8byte	.LFE233-.LFB233
+	.8byte	.LFB234
+	.8byte	.LFE234-.LFB234
+	.8byte	.LFB236
+	.8byte	.LFE236-.LFB236
+	.8byte	.LFB237
+	.8byte	.LFE237-.LFB237
+	.8byte	.LFB239
+	.8byte	.LFE239-.LFB239
+	.8byte	0
+	.8byte	0
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.8byte	.LBB32
+	.8byte	.LBE32
+	.8byte	.LBB35
+	.8byte	.LBE35
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB52
+	.8byte	.LBE52
+	.8byte	.LBB55
+	.8byte	.LBE55
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB56
+	.8byte	.LBE56
+	.8byte	.LBB69
+	.8byte	.LBE69
+	.8byte	.LBB70
+	.8byte	.LBE70
+	.8byte	.LBB71
+	.8byte	.LBE71
+	.8byte	.LBB72
+	.8byte	.LBE72
+	.8byte	.LBB73
+	.8byte	.LBE73
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB60
+	.8byte	.LBE60
+	.8byte	.LBB63
+	.8byte	.LBE63
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB78
+	.8byte	.LBE78
+	.8byte	.LBB83
+	.8byte	.LBE83
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB90
+	.8byte	.LBE90
+	.8byte	.LBB93
+	.8byte	.LBE93
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB102
+	.8byte	.LBE102
+	.8byte	.LBB109
+	.8byte	.LBE109
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB104
+	.8byte	.LBE104
+	.8byte	.LBB107
+	.8byte	.LBE107
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB124
+	.8byte	.LBE124
+	.8byte	.LBB135
+	.8byte	.LBE135
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB126
+	.8byte	.LBE126
+	.8byte	.LBB130
+	.8byte	.LBE130
+	.8byte	.LBB133
+	.8byte	.LBE133
+	.8byte	0
+	.8byte	0
+	.8byte	.LFB225
+	.8byte	.LFE225
+	.8byte	.LFB238
+	.8byte	.LFE238
+	.8byte	.LFB218
+	.8byte	.LFE218
+	.8byte	.LFB226
+	.8byte	.LFE226
+	.8byte	.LFB227
+	.8byte	.LFE227
+	.8byte	.LFB242
+	.8byte	.LFE242
+	.8byte	.LFB230
+	.8byte	.LFE230
+	.8byte	.LFB232
+	.8byte	.LFE232
+	.8byte	.LFB233
+	.8byte	.LFE233
+	.8byte	.LFB234
+	.8byte	.LFE234
+	.8byte	.LFB236
+	.8byte	.LFE236
+	.8byte	.LFB237
+	.8byte	.LFE237
+	.8byte	.LFB239
+	.8byte	.LFE239
+	.8byte	0
+	.8byte	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF83:
+	.string	"off_mem_rsvmap"
+.LASF166:
+	.string	"UCLASS_I2C_EEPROM"
+.LASF298:
+	.string	"jt_funcs"
+.LASF171:
+	.string	"UCLASS_IRQ"
+.LASF133:
+	.string	"initrd_start"
+.LASF165:
+	.string	"UCLASS_I2C"
+.LASF13:
+	.string	"sizetype"
+.LASF312:
+	.string	"net_hostname"
+.LASF36:
+	.string	"start"
+.LASF206:
+	.string	"UCLASS_SPI"
+.LASF169:
+	.string	"UCLASS_I2S"
+.LASF334:
+	.string	"NETLOOP_RESTART"
+.LASF167:
+	.string	"UCLASS_I2C_GENERIC"
+.LASF179:
+	.string	"UCLASS_MOD_EXP"
+.LASF230:
+	.string	"UCLASS_IO_DOMAIN"
+.LASF251:
+	.string	"using_pre_serial"
+.LASF200:
+	.string	"UCLASS_RKNAND"
+.LASF142:
+	.string	"UCLASS_DEMO"
+.LASF386:
+	.string	"rip_fail"
+.LASF91:
+	.string	"ih_magic"
+.LASF29:
+	.string	"list_head"
+.LASF292:
+	.string	"pm_ctx_phys"
+.LASF146:
+	.string	"UCLASS_TEST_PROBE"
+.LASF226:
+	.string	"UCLASS_KEY"
+.LASF64:
+	.string	"bi_intfreq"
+.LASF11:
+	.string	"phys_addr_t"
+.LASF221:
+	.string	"UCLASS_VIDEO_BRIDGE"
+.LASF291:
+	.string	"video_bottom"
+.LASF5:
+	.string	"__u8"
+.LASF390:
+	.string	"task_list"
+.LASF333:
+	.string	"NETLOOP_CONTINUE"
+.LASF209:
+	.string	"UCLASS_SPI_GENERIC"
+.LASF286:
+	.string	"malloc_base"
+.LASF382:
+	.string	"tid_name"
+.LASF40:
+	.string	"flash_info_t"
+.LASF184:
+	.string	"UCLASS_PANEL"
+.LASF108:
+	.string	"comp"
+.LASF103:
+	.string	"image_header_t"
+.LASF138:
+	.string	"state"
+.LASF428:
+	.string	"disable_serror"
+.LASF159:
+	.string	"UCLASS_CROS_EC"
+.LASF360:
+	.string	"BOOT_MODE_QUIESCENT"
+.LASF58:
+	.string	"bi_dsp_freq"
+.LASF105:
+	.string	"image_start"
+.LASF350:
+	.string	"BOOT_MODE_NORMAL"
+.LASF440:
+	.string	"invalidate_icache_all"
+.LASF438:
+	.string	"disable_interrupts"
+.LASF144:
+	.string	"UCLASS_TEST_FDT"
+.LASF49:
+	.string	"bd_info"
+.LASF331:
+	.string	"uclass_id"
+.LASF95:
+	.string	"ih_load"
+.LASF215:
+	.string	"UCLASS_UFS"
+.LASF302:
+	.string	"__dtb_dt_spl_begin"
+.LASF376:
+	.string	"TASK_LOAD_UBOOT"
+.LASF7:
+	.string	"__u32"
+.LASF149:
+	.string	"UCLASS_PCI_EMUL"
+.LASF449:
+	.string	"/home4/cjh/uboot-nextdev-v3"
+.LASF289:
+	.string	"cur_serial_dev"
+.LASF351:
+	.string	"BOOT_MODE_RECOVERY"
+.LASF318:
+	.string	"net_tx_packet"
+.LASF225:
+	.string	"UCLASS_FG"
+.LASF317:
+	.string	"net_server_ip"
+.LASF325:
+	.string	"net_native_vlan"
+.LASF265:
+	.string	"ram_top_ext_size"
+.LASF223:
+	.string	"UCLASS_VIDEO_CRTC"
+.LASF158:
+	.string	"UCLASS_CODEC"
+.LASF447:
+	.ascii	"GNU C11 6.3.1 20170404 -ms"
+	.string	"trict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -fno-pic -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18"
+.LASF283:
+	.string	"env_buf"
+.LASF20:
+	.string	"errno"
+.LASF15:
+	.string	"long int"
+.LASF53:
+	.string	"bi_flashsize"
+.LASF339:
+	.string	"__bss_end"
+.LASF189:
+	.string	"UCLASS_PHY"
+.LASF76:
+	.string	"IRQ_STACK_START_IN"
+.LASF87:
+	.string	"size_dt_strings"
+.LASF220:
+	.string	"UCLASS_VIDEO"
+.LASF369:
+	.string	"EVT_CRYPTO"
+.LASF266:
+	.string	"relocaddr"
+.LASF406:
+	.string	"mpb_post"
+.LASF448:
+	.string	"common/mp_boot.c"
+.LASF328:
+	.string	"net_boot_file_size"
+.LASF387:
+	.string	"cpu_core"
+.LASF432:
+	.string	"run_command"
+.LASF97:
+	.string	"ih_dcrc"
+.LASF63:
+	.string	"bi_ethspeed"
+.LASF141:
+	.string	"UCLASS_ROOT"
+.LASF26:
+	.string	"ide_bus_offset"
+.LASF374:
+	.string	"TASK_INIT_DISPLAY"
+.LASF315:
+	.string	"net_server_ethaddr"
+.LASF66:
+	.string	"bi_arch_number"
+.LASF3:
+	.string	"signed char"
+.LASF172:
+	.string	"UCLASS_KEYBOARD"
+.LASF18:
+	.string	"uint8_t"
+.LASF38:
+	.string	"udevice"
+.LASF436:
+	.string	"udelay"
+.LASF99:
+	.string	"ih_arch"
+.LASF80:
+	.string	"totalsize"
+.LASF92:
+	.string	"ih_hcrc"
+.LASF268:
+	.string	"mon_len"
+.LASF107:
+	.string	"load"
+.LASF214:
+	.string	"UCLASS_TPM"
+.LASF43:
+	.string	"lmb_property"
+.LASF85:
+	.string	"last_comp_version"
+.LASF0:
+	.string	"unsigned char"
+.LASF140:
+	.string	"images"
+.LASF341:
+	.string	"priv"
+.LASF229:
+	.string	"UCLASS_DVFS"
+.LASF59:
+	.string	"bi_ddr_freq"
+.LASF419:
+	.string	"mpb_initial"
+.LASF173:
+	.string	"UCLASS_LED"
+.LASF94:
+	.string	"ih_size"
+.LASF445:
+	.string	"rockchip_get_boot_mode"
+.LASF437:
+	.string	"dcache_enable"
+.LASF203:
+	.string	"UCLASS_SCMI_AGENT"
+.LASF233:
+	.string	"UCLASS_MDIO"
+.LASF22:
+	.string	"_Bool"
+.LASF337:
+	.string	"net_state"
+.LASF168:
+	.string	"UCLASS_I2C_MUX"
+.LASF14:
+	.string	"char"
+.LASF24:
+	.string	"_binary_u_boot_bin_start"
+.LASF219:
+	.string	"UCLASS_USB_GADGET_GENERIC"
+.LASF335:
+	.string	"NETLOOP_SUCCESS"
+.LASF433:
+	.string	"printf"
+.LASF385:
+	.string	"ptid_mask"
+.LASF332:
+	.string	"net_loop_state"
+.LASF247:
+	.string	"tlb_size"
+.LASF274:
+	.string	"dm_root_f"
+.LASF157:
+	.string	"UCLASS_AMP"
+.LASF195:
+	.string	"UCLASS_PWRSEQ"
+.LASF123:
+	.string	"fit_hdr_fdt"
+.LASF326:
+	.string	"net_restart_wrap"
+.LASF314:
+	.string	"net_ethaddr"
+.LASF256:
+	.string	"flags"
+.LASF100:
+	.string	"ih_type"
+.LASF368:
+	.string	"EVT_BOOT_SIZE"
+.LASF81:
+	.string	"off_dt_struct"
+.LASF429:
+	.string	"mdelay"
+.LASF54:
+	.string	"bi_flashoffset"
+.LASF327:
+	.string	"net_boot_file_name"
+.LASF143:
+	.string	"UCLASS_TEST"
+.LASF413:
+	.string	"mpb_task_dump"
+.LASF93:
+	.string	"ih_time"
+.LASF258:
+	.string	"bus_clk"
+.LASF196:
+	.string	"UCLASS_RAM"
+.LASF162:
+	.string	"UCLASS_ETH"
+.LASF377:
+	.string	"TASK_LOAD_FIT"
+.LASF104:
+	.string	"image_info"
+.LASF110:
+	.string	"arch"
+.LASF260:
+	.string	"mem_clk"
+.LASF257:
+	.string	"cpu_clk"
+.LASF32:
+	.string	"select_hwpart"
+.LASF319:
+	.string	"net_rx_packets"
+.LASF75:
+	.string	"_datarelro_start_ofs"
+.LASF17:
+	.string	"ulong"
+.LASF384:
+	.string	"task_fn"
+.LASF96:
+	.string	"ih_ep"
+.LASF45:
+	.string	"lmb_region"
+.LASF388:
+	.string	"task"
+.LASF408:
+	.string	"mpb_task_wait_timeout_done"
+.LASF416:
+	.string	"tid_to_task_index"
+.LASF118:
+	.string	"fit_uname_os"
+.LASF60:
+	.string	"bi_bootflags"
+.LASF316:
+	.string	"net_ip"
+.LASF278:
+	.string	"fdt_size"
+.LASF310:
+	.string	"net_dns_server"
+.LASF338:
+	.string	"__bss_start"
+.LASF330:
+	.string	"net_ping_ip"
+.LASF47:
+	.string	"memory"
+.LASF78:
+	.string	"fdt_header"
+.LASF175:
+	.string	"UCLASS_MAILBOX"
+.LASF343:
+	.string	"filename"
+.LASF130:
+	.string	"rd_end"
+.LASF269:
+	.string	"irq_sp"
+.LASF135:
+	.string	"cmdline_start"
+.LASF255:
+	.string	"global_data"
+.LASF371:
+	.string	"EVT_SIMPLE_BOOTM"
+.LASF379:
+	.string	"TASK_HASH_ANDROID"
+.LASF204:
+	.string	"UCLASS_SCSI"
+.LASF217:
+	.string	"UCLASS_USB_DEV_GENERIC"
+.LASF176:
+	.string	"UCLASS_MASS_STORAGE"
+.LASF1:
+	.string	"long unsigned int"
+.LASF151:
+	.string	"UCLASS_SIMPLE_BUS"
+.LASF299:
+	.string	"gd_t"
+.LASF311:
+	.string	"net_nis_domain"
+.LASF125:
+	.string	"fit_noffset_fdt"
+.LASF370:
+	.string	"EVT_LINUX"
+.LASF342:
+	.string	"bl_len"
+.LASF446:
+	.string	"get_ticks"
+.LASF336:
+	.string	"NETLOOP_FAIL"
+.LASF224:
+	.string	"UCLASS_WDT"
+.LASF245:
+	.string	"timer_reset_value"
+.LASF270:
+	.string	"start_addr_sp"
+.LASF55:
+	.string	"bi_sramstart"
+.LASF25:
+	.string	"_binary_u_boot_bin_end"
+.LASF271:
+	.string	"reloc_off"
+.LASF86:
+	.string	"boot_cpuid_phys"
+.LASF244:
+	.string	"lastinc"
+.LASF248:
+	.string	"tlb_fillptr"
+.LASF121:
+	.string	"fit_uname_rd"
+.LASF210:
+	.string	"UCLASS_SYSCON"
+.LASF116:
+	.string	"fit_uname_cfg"
+.LASF205:
+	.string	"UCLASS_SERIAL"
+.LASF324:
+	.string	"net_our_vlan"
+.LASF294:
+	.string	"serial"
+.LASF154:
+	.string	"UCLASS_BLK"
+.LASF111:
+	.string	"image_info_t"
+.LASF150:
+	.string	"UCLASS_USB_EMUL"
+.LASF439:
+	.string	"icache_disable"
+.LASF246:
+	.string	"tlb_addr"
+.LASF354:
+	.string	"BOOT_MODE_CHARGING"
+.LASF188:
+	.string	"UCLASS_PCI_GENERIC"
+.LASF383:
+	.string	"task_t"
+.LASF423:
+	.string	"spl_load_android"
+.LASF404:
+	.string	"ticks"
+.LASF106:
+	.string	"image_len"
+.LASF375:
+	.string	"TASK_LOAD_BASEPARAMETER"
+.LASF394:
+	.string	"wait_evt"
+.LASF61:
+	.string	"bi_ip_addr"
+.LASF409:
+	.string	"timeout_ms"
+.LASF190:
+	.string	"UCLASS_PINCONFIG"
+.LASF399:
+	.string	"smp_entry"
+.LASF212:
+	.string	"UCLASS_THERMAL"
+.LASF114:
+	.string	"legacy_hdr_os_copy"
+.LASF367:
+	.string	"EVT_BOOT_ADDR"
+.LASF9:
+	.string	"long long int"
+.LASF277:
+	.string	"new_fdt"
+.LASF21:
+	.string	"___strtok"
+.LASF329:
+	.string	"net_boot_file_expected_size_in_blocks"
+.LASF252:
+	.string	"enable"
+.LASF411:
+	.string	"ptid"
+.LASF183:
+	.string	"UCLASS_NVME"
+.LASF249:
+	.string	"tlb_emerg"
+.LASF112:
+	.string	"bootm_headers"
+.LASF37:
+	.string	"protect"
+.LASF216:
+	.string	"UCLASS_USB"
+.LASF227:
+	.string	"UCLASS_RC"
+.LASF414:
+	.string	"mpb_task_is_done"
+.LASF284:
+	.string	"timebase_h"
+.LASF285:
+	.string	"timebase_l"
+.LASF160:
+	.string	"UCLASS_DISPLAY"
+.LASF323:
+	.string	"net_null_ethaddr"
+.LASF263:
+	.string	"env_valid"
+.LASF228:
+	.string	"UCLASS_CHARGE_DISPLAY"
+.LASF303:
+	.string	"load_addr"
+.LASF117:
+	.string	"fit_hdr_os"
+.LASF73:
+	.string	"_datarelrolocal_start_ofs"
+.LASF412:
+	.string	"timeout"
+.LASF361:
+	.string	"BOOT_MODE_UNDEFINE"
+.LASF254:
+	.string	"addr"
+.LASF344:
+	.string	"read"
+.LASF355:
+	.string	"BOOT_MODE_UMS"
+.LASF8:
+	.string	"unsigned int"
+.LASF16:
+	.string	"ushort"
+.LASF418:
+	.string	"task_is_registered"
+.LASF281:
+	.string	"ufdt_blob"
+.LASF426:
+	.string	"spl_init_display"
+.LASF287:
+	.string	"malloc_limit"
+.LASF417:
+	.string	"mpb_task_register"
+.LASF192:
+	.string	"UCLASS_PMIC"
+.LASF113:
+	.string	"legacy_hdr_os"
+.LASF82:
+	.string	"off_dt_strings"
+.LASF397:
+	.string	"mpb_init_1"
+.LASF300:
+	.string	"monitor_flash_len"
+.LASF177:
+	.string	"UCLASS_MISC"
+.LASF51:
+	.string	"bi_memsize"
+.LASF410:
+	.string	"mpb_task_wait_parent"
+.LASF23:
+	.string	"image_base"
+.LASF395:
+	.string	"once"
+.LASF211:
+	.string	"UCLASS_SYSRESET"
+.LASF164:
+	.string	"UCLASS_FIRMWARE"
+.LASF443:
+	.string	"invalidate_dcache_range"
+.LASF174:
+	.string	"UCLASS_LPC"
+.LASF170:
+	.string	"UCLASS_IDE"
+.LASF290:
+	.string	"video_top"
+.LASF431:
+	.string	"snprintf"
+.LASF280:
+	.string	"of_root_f"
+.LASF139:
+	.string	"bootm_headers_t"
+.LASF57:
+	.string	"bi_arm_freq"
+.LASF198:
+	.string	"UCLASS_REMOTEPROC"
+.LASF109:
+	.string	"type"
+.LASF120:
+	.string	"fit_hdr_rd"
+.LASF405:
+	.string	"fail"
+.LASF262:
+	.string	"env_addr"
+.LASF56:
+	.string	"bi_sramsize"
+.LASF348:
+	.string	"boot_size"
+.LASF407:
+	.string	"mpb_task_wait_done"
+.LASF422:
+	.string	"spl_hash_android"
+.LASF275:
+	.string	"uclass_root"
+.LASF163:
+	.string	"UCLASS_GPIO"
+.LASF193:
+	.string	"UCLASS_PWM"
+.LASF420:
+	.string	"set_gd"
+.LASF42:
+	.string	"long double"
+.LASF264:
+	.string	"ram_top"
+.LASF296:
+	.string	"console_evt"
+.LASF396:
+	.string	"mpb_init_x"
+.LASF450:
+	.string	"mpb_task_set_state"
+.LASF129:
+	.string	"rd_start"
+.LASF194:
+	.string	"UCLASS_POWER_DOMAIN"
+.LASF197:
+	.string	"UCLASS_REGULATOR"
+.LASF305:
+	.string	"save_size"
+.LASF430:
+	.string	"msec"
+.LASF155:
+	.string	"UCLASS_CLK"
+.LASF403:
+	.string	"core_task_run"
+.LASF346:
+	.string	"info"
+.LASF72:
+	.string	"_datarel_start_ofs"
+.LASF250:
+	.string	"pre_serial"
+.LASF102:
+	.string	"ih_name"
+.LASF98:
+	.string	"ih_os"
+.LASF345:
+	.string	"task_data"
+.LASF136:
+	.string	"cmdline_end"
+.LASF320:
+	.string	"net_rx_packet"
+.LASF241:
+	.string	"LOGF_MAX_CATEGORIES"
+.LASF276:
+	.string	"fdt_blob"
+.LASF33:
+	.string	"size"
+.LASF357:
+	.string	"BOOT_MODE_PANIC"
+.LASF10:
+	.string	"long long unsigned int"
+.LASF90:
+	.string	"image_header"
+.LASF363:
+	.string	"CPU_1"
+.LASF19:
+	.string	"__be32"
+.LASF402:
+	.string	"mpb_quit_load_image"
+.LASF52:
+	.string	"bi_flashstart"
+.LASF119:
+	.string	"fit_noffset_os"
+.LASF415:
+	.string	"mpb_task_set_result"
+.LASF178:
+	.string	"UCLASS_MMC"
+.LASF240:
+	.string	"UCLASS_INVALID"
+.LASF389:
+	.string	"mpb_core"
+.LASF218:
+	.string	"UCLASS_USB_HUB"
+.LASF279:
+	.string	"of_root"
+.LASF234:
+	.string	"UCLASS_EBC"
+.LASF340:
+	.string	"spl_load_info"
+.LASF293:
+	.string	"new_line"
+.LASF434:
+	.string	"memset"
+.LASF41:
+	.string	"flash_info"
+.LASF84:
+	.string	"version"
+.LASF46:
+	.string	"region"
+.LASF88:
+	.string	"size_dt_struct"
+.LASF273:
+	.string	"dm_root"
+.LASF236:
+	.string	"UCLASS_RNG"
+.LASF295:
+	.string	"sys_start_tick"
+.LASF180:
+	.string	"UCLASS_MTD"
+.LASF352:
+	.string	"BOOT_MODE_BOOTLOADER"
+.LASF77:
+	.string	"fdt32_t"
+.LASF272:
+	.string	"new_gd"
+.LASF182:
+	.string	"UCLASS_NORTHBRIDGE"
+.LASF62:
+	.string	"bi_enetaddr"
+.LASF39:
+	.string	"mtd_info"
+.LASF306:
+	.string	"in_addr"
+.LASF353:
+	.string	"BOOT_MODE_LOADER"
+.LASF321:
+	.string	"net_rx_packet_len"
+.LASF398:
+	.string	"init"
+.LASF301:
+	.string	"__dtb_dt_begin"
+.LASF199:
+	.string	"UCLASS_RESET"
+.LASF122:
+	.string	"fit_noffset_rd"
+.LASF153:
+	.string	"UCLASS_AHCI"
+.LASF12:
+	.string	"phys_size_t"
+.LASF156:
+	.string	"UCLASS_CPU"
+.LASF71:
+	.string	"FIQ_STACK_START"
+.LASF137:
+	.string	"verify"
+.LASF31:
+	.string	"name"
+.LASF235:
+	.string	"UCLASS_EINK_DISPLAY"
+.LASF185:
+	.string	"UCLASS_PANEL_BACKLIGHT"
+.LASF213:
+	.string	"UCLASS_TIMER"
+.LASF208:
+	.string	"UCLASS_SPI_FLASH"
+.LASF261:
+	.string	"have_console"
+.LASF65:
+	.string	"bi_busfreq"
+.LASF6:
+	.string	"short int"
+.LASF347:
+	.string	"boot_addr"
+.LASF191:
+	.string	"UCLASS_PINCTRL"
+.LASF201:
+	.string	"UCLASS_RAMDISK"
+.LASF148:
+	.string	"UCLASS_I2C_EMUL"
+.LASF378:
+	.string	"TASK_LOAD_ANDROID"
+.LASF207:
+	.string	"UCLASS_SPMI"
+.LASF391:
+	.string	"tdata"
+.LASF145:
+	.string	"UCLASS_TEST_BUS"
+.LASF435:
+	.string	"flush_dcache_all"
+.LASF304:
+	.string	"save_addr"
+.LASF444:
+	.string	"flush_dcache_range"
+.LASF288:
+	.string	"malloc_ptr"
+.LASF427:
+	.string	"cpuectlr_disable"
+.LASF401:
+	.string	"mpb_task_run"
+.LASF424:
+	.string	"spl_load_fit"
+.LASF134:
+	.string	"initrd_end"
+.LASF372:
+	.string	"EVT_VIDEO_BP"
+.LASF253:
+	.string	"baudrate"
+.LASF74:
+	.string	"_datarellocal_start_ofs"
+.LASF242:
+	.string	"arch_global_data"
+.LASF239:
+	.string	"UCLASS_COUNT"
+.LASF362:
+	.string	"CPU_0"
+.LASF259:
+	.string	"pci_clk"
+.LASF364:
+	.string	"CPU_2"
+.LASF365:
+	.string	"CPU_3"
+.LASF30:
+	.string	"block_drvr"
+.LASF452:
+	.string	"memcpy"
+.LASF35:
+	.string	"flash_id"
+.LASF231:
+	.string	"UCLASS_CRYPTO"
+.LASF297:
+	.string	"device_node"
+.LASF267:
+	.string	"ram_size"
+.LASF128:
+	.string	"fit_noffset_setup"
+.LASF89:
+	.string	"working_fdt"
+.LASF282:
+	.string	"fdt_blob_kern"
+.LASF313:
+	.string	"net_root_path"
+.LASF161:
+	.string	"UCLASS_DMA"
+.LASF69:
+	.string	"bd_t"
+.LASF237:
+	.string	"UCLASS_DMC"
+.LASF307:
+	.string	"s_addr"
+.LASF322:
+	.string	"net_bcast_ethaddr"
+.LASF392:
+	.string	"mpb_gd"
+.LASF67:
+	.string	"bi_boot_params"
+.LASF359:
+	.string	"BOOT_MODE_DFU"
+.LASF308:
+	.string	"net_gateway"
+.LASF50:
+	.string	"bi_memstart"
+.LASF222:
+	.string	"UCLASS_VIDEO_CONSOLE"
+.LASF48:
+	.string	"reserved"
+.LASF373:
+	.string	"TASK_NONE"
+.LASF238:
+	.string	"UCLASS_PD"
+.LASF441:
+	.string	"dcache_disable"
+.LASF68:
+	.string	"bi_dram"
+.LASF2:
+	.string	"short unsigned int"
+.LASF79:
+	.string	"magic"
+.LASF126:
+	.string	"fit_hdr_setup"
+.LASF115:
+	.string	"legacy_hdr_valid"
+.LASF381:
+	.string	"TASK_MAX"
+.LASF44:
+	.string	"base"
+.LASF451:
+	.string	"spl_dummy"
+.LASF202:
+	.string	"UCLASS_RTC"
+.LASF366:
+	.string	"EVT_BOOT_DEV"
+.LASF243:
+	.string	"timer_rate_hz"
+.LASF34:
+	.string	"sector_count"
+.LASF101:
+	.string	"ih_comp"
+.LASF400:
+	.string	"core_main"
+.LASF131:
+	.string	"ft_addr"
+.LASF232:
+	.string	"UCLASS_ETH_PHY"
+.LASF393:
+	.string	"task_init"
+.LASF4:
+	.string	"uchar"
+.LASF132:
+	.string	"ft_len"
+.LASF27:
+	.string	"next"
+.LASF421:
+	.string	"data"
+.LASF181:
+	.string	"UCLASS_NOP"
+.LASF380:
+	.string	"TASK_RUN_UBOOT"
+.LASF349:
+	.string	"_boot_mode"
+.LASF127:
+	.string	"fit_uname_setup"
+.LASF28:
+	.string	"prev"
+.LASF442:
+	.string	"invalidate_dcache_all"
+.LASF186:
+	.string	"UCLASS_PCH"
+.LASF187:
+	.string	"UCLASS_PCI"
+.LASF309:
+	.string	"net_netmask"
+.LASF358:
+	.string	"BOOT_MODE_WATCHDOG"
+.LASF70:
+	.string	"IRQ_STACK_START"
+.LASF152:
+	.string	"UCLASS_ADC"
+.LASF356:
+	.string	"BOOT_MODE_BROM_DOWNLOAD"
+.LASF147:
+	.string	"UCLASS_SPI_EMUL"
+.LASF425:
+	.string	"spl_load_baseparamter"
+.LASF124:
+	.string	"fit_uname_fdt"
+	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/u-boot/common/spl/Kconfig b/u-boot/common/spl/Kconfig
index c62938c..dfa3fcd 100644
--- a/u-boot/common/spl/Kconfig
+++ b/u-boot/common/spl/Kconfig
@@ -144,6 +144,17 @@
 	  The SPL code will be relocated to a high memory if you say no here.
 	  Only ARM64 and PowerPC SPL support relocate now.
 
+config SPL_BOOT_IMAGE
+	bool "SPL boot image load support"
+	default n
+	help
+	  This enable SPL boot image load support
+
+config SPL_BOOT_IMAGE_BUF
+	hex "SPL boot image memory buffer"
+	depends on SPL_BOOT_IMAGE
+	default 0x10000000
+
 config SPL_RELOC_TEXT_BASE
 	hex "Address the SPL relocate to"
 	depends on !SPL_SKIP_RELOCATE
@@ -598,6 +609,12 @@
 	  boot. This enables the drivers in drivers/pch as part of an SPL
 	  build.
 
+config SPL_PCIE_EP_SUPPORT
+	bool "Support loading from PCIE EP"
+	help
+	  Enable support for PCIE EP driver in SPL. The RC will download the
+	  image as a RAM partition for firmware.
+
 config SPL_POST_MEM_SUPPORT
 	bool "Support POST drivers"
 	help
@@ -900,6 +917,13 @@
 	help
 	  Enable boot kernel in SPL.
 
+config SPL_KERNEL_BOOT_PREBUILT
+	bool "Enable boot kernel in SPL with prebuilt program"
+	depends on SPL_KERNEL_BOOT
+	default y
+	help
+	  Enable boot kernel in SPL with prebuilt program.
+
 config SPL_KERNEL_BOOT_SECTOR
 	hex "Sector address to load kernel in SPL"
 	depends on SPL_KERNEL_BOOT
diff --git a/u-boot/common/spl/Makefile b/u-boot/common/spl/Makefile
index 3bab93f..cf9d874 100644
--- a/u-boot/common/spl/Makefile
+++ b/u-boot/common/spl/Makefile
@@ -24,7 +24,7 @@
 
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_$(SPL_TPL_)BOOTROM_SUPPORT) += spl_bootrom.o
-ifdef CONFIG_SPL_KERNEL_BOOT
+ifdef CONFIG_SPL_KERNEL_BOOT_PREBUILT
 ifdef CONFIG_ARM64
 obj-$(CONFIG_$(SPL_TPL_)LOAD_FIT) += spl_fit_tb_arm64.o
 else
@@ -57,4 +57,5 @@
 obj-$(CONFIG_$(SPL_TPL_)SPI_LOAD) += spl_spi.o
 obj-$(CONFIG_$(SPL_TPL_)RAM_SUPPORT) += spl_ram.o
 obj-$(CONFIG_$(SPL_TPL_)USB_SDP_SUPPORT) += spl_sdp.o
+obj-$(CONFIG_$(SPL_TPL_)BOOT_IMAGE) += spl_boot_image.o
 endif
diff --git a/u-boot/common/spl/spl.c b/u-boot/common/spl/spl.c
index 6836796..bcb37ec 100644
--- a/u-boot/common/spl/spl.c
+++ b/u-boot/common/spl/spl.c
@@ -17,6 +17,7 @@
 #include <version.h>
 #include <image.h>
 #include <malloc.h>
+#include <mp_boot.h>
 #include <dm/root.h>
 #include <linux/compiler.h>
 #include <fdt_support.h>
@@ -547,6 +548,10 @@
 
 	memset(&spl_image, '\0', sizeof(spl_image));
 
+#ifdef CONFIG_MP_BOOT
+	mpb_init_x(0);
+#endif
+
 #if CONFIG_IS_ENABLED(ATF)
 	/*
 	 * Bl32 ep is optional, initial it as an invalid value.
@@ -574,6 +579,10 @@
 	}
 
 	spl_perform_fixups(&spl_image);
+
+#ifdef CONFIG_MP_BOOT
+	mpb_init_x(2);
+#endif
 
 #ifdef CONFIG_CPU_V7M
 	spl_image.entry_point |= 0x1;
@@ -710,7 +719,7 @@
 /* cleanup before jump to next stage */
 void spl_cleanup_before_jump(struct spl_image_info *spl_image)
 {
-	ulong us;
+	ulong us, tt_us;
 
 	spl_board_prepare_for_jump(spl_image);
 
@@ -738,5 +747,6 @@
 	isb();
 
 	us = (get_ticks() - gd->sys_start_tick) / 24UL;
-	printf("Total: %ld.%ld ms\n\n", us / 1000, us % 1000);
+	tt_us = get_ticks() / (COUNTER_FREQUENCY / 1000000);
+	printf("Total: %ld.%ld/%ld.%ld ms\n\n", us / 1000, us % 1000, tt_us / 1000, tt_us % 1000);
 }
diff --git a/u-boot/common/spl/spl_ab.c b/u-boot/common/spl/spl_ab.c
index 31b63f7..842c36c 100644
--- a/u-boot/common/spl/spl_ab.c
+++ b/u-boot/common/spl/spl_ab.c
@@ -319,3 +319,38 @@
 out:
 	return ret;
 }
+
+/*
+ * If boot A/B system fail, tries-remaining decrease 1
+ * and do reset automatically if still bootable.
+ */
+int spl_ab_decrease_reset(struct blk_desc *dev_desc)
+{
+	AvbABData ab_data;
+	int ret;
+
+	ret = spl_ab_data_read(dev_desc, &ab_data, "misc");
+	if (ret)
+		return ret;
+
+	/* If current device cannot boot, return and try other devices. */
+	if (!spl_slot_is_bootable(&ab_data.slots[0]) &&
+	    !spl_slot_is_bootable(&ab_data.slots[1])) {
+		printf("A/B: no bootable slot\n");
+		return -ENODEV;
+	}
+
+	/* If current device still can boot, decrease and do reset. */
+	ret = spl_ab_decrease_tries(dev_desc);
+	if (ret)
+		return ret;
+
+	printf("A/B: slot boot fail, do reset\n");
+	do_reset(NULL, 0, 0, NULL);
+
+	/*
+	 * Only do_reset() fail will arrive here, return a
+	 * negative number, then enter maskrom in the caller.
+	 */
+	return -EINVAL;
+}
diff --git a/u-boot/common/spl/spl_boot_image.c b/u-boot/common/spl/spl_boot_image.c
new file mode 100644
index 0000000..dd49817
--- /dev/null
+++ b/u-boot/common/spl/spl_boot_image.c
@@ -0,0 +1,305 @@
+/*
+ * (C) Copyright 2023 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <android_image.h>
+#include <crypto.h>
+#include <image.h>
+#include <mp_boot.h>
+#include <part.h>
+#include <spl.h>
+#include <asm/io.h>
+
+#define BLK_CNT(_num_bytes, _block_size) \
+		((_num_bytes + _block_size - 1) / _block_size)
+
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+static int android_check_header(const struct andr_img_hdr *hdr)
+{
+	return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
+}
+
+static void print_hash(const char *label, u8 *hash, int len)
+{
+	int i;
+
+	printf("%s:\n    0x", label ? : "Hash");
+	for (i = 0; i < len; i++)
+		printf("%02x", hash[i]);
+	printf("\n");
+}
+
+#if 0
+static void spl_android_print_contents(const struct andr_img_hdr *hdr)
+{
+	const char * const p = IMAGE_INDENT_STRING;
+	/* os_version = ver << 11 | lvl */
+	u32 os_ver = hdr->os_version >> 11;
+	u32 os_lvl = hdr->os_version & ((1U << 11) - 1);
+	u32 header_version = hdr->header_version;
+
+	printf("%skernel size:      %x\n", p, hdr->kernel_size);
+	printf("%skernel address:   %x\n", p, hdr->kernel_addr);
+	printf("%sramdisk size:     %x\n", p, hdr->ramdisk_size);
+	printf("%sramdisk address: %x\n", p, hdr->ramdisk_addr);
+	printf("%ssecond size:      %x\n", p, hdr->second_size);
+	printf("%ssecond address:   %x\n", p, hdr->second_addr);
+	printf("%stags address:     %x\n", p, hdr->tags_addr);
+	printf("%spage size:        %x\n", p, hdr->page_size);
+	printf("%sheader_version:   %x\n", p, header_version);
+	/* ver = A << 14 | B << 7 | C         (7 bits for each of A, B, C)
+	 * lvl = ((Y - 2000) & 127) << 4 | M  (7 bits for Y, 4 bits for M) */
+	printf("%sos_version:       %x (ver: %u.%u.%u, level: %u.%u)\n",
+	       p, hdr->os_version,
+	       (os_ver >> 7) & 0x7F, (os_ver >> 14) & 0x7F, os_ver & 0x7F,
+	       (os_lvl >> 4) + 2000, os_lvl & 0x0F);
+	printf("%sname:             %s\n", p, hdr->name);
+	printf("%scmdline:          %s\n", p, hdr->cmdline);
+
+	if (header_version == 1 || header_version == 2) {
+		printf("%srecovery dtbo size:    %x\n", p, hdr->recovery_dtbo_size);
+		printf("%srecovery dtbo offset:  %llx\n", p, hdr->recovery_dtbo_offset);
+		printf("%sheader size:           %x\n", p, hdr->header_size);
+	}
+
+	if (header_version == 2 || header_version == 3) {
+		printf("%sdtb size:              %x\n", p, hdr->dtb_size);
+		printf("%sdtb addr:              %llx\n", p, hdr->dtb_addr);
+	}
+
+	if (header_version >= 3) {
+		printf("%scmdline:               %s\n", p, hdr->total_cmdline);
+		printf("%svendor ramdisk size:   %x\n", p, hdr->vendor_ramdisk_size);
+		printf("%svendor page size:      %x\n", p, hdr->vendor_page_size);
+		printf("%svendor header version: %d\n", p, hdr->vendor_header_version);
+		printf("%svendor header size:    %x\n", p, hdr->vendor_header_size);
+	}
+
+	if (header_version >= 4) {
+		printf("%svendor ramdisk table size:        %x\n",
+		       p, hdr->vendor_ramdisk_table_size);
+		printf("%svendor ramdisk table entry num:   %x\n",
+		       p, hdr->vendor_ramdisk_table_entry_num);
+		printf("%svendor ramdisk table entry size:  %x\n",
+		       p, hdr->vendor_ramdisk_table_entry_size);
+		printf("%svendor bootconfig size:           %d\n",
+		       p, hdr->vendor_bootconfig_size);
+	}
+}
+#endif
+
+static ulong android_size(struct andr_img_hdr *hdr)
+{
+	ulong len;
+
+	len = hdr->page_size +
+		ALIGN(hdr->kernel_size, hdr->page_size) +
+		ALIGN(hdr->ramdisk_size, hdr->page_size) +
+		ALIGN(hdr->second_size, hdr->page_size);
+	if (hdr->header_version > 0)
+		len += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+	if (hdr->header_version > 1)
+		len += ALIGN(hdr->dtb_size, hdr->page_size);
+#if 0
+	spl_android_print_contents(hdr);
+#endif
+
+	return len;
+}
+
+int spl_load_android(struct task_data *data)
+{
+	struct spl_load_info *info = &data->info;
+	void *buf = (void *)CONFIG_SPL_BOOT_IMAGE_BUF;
+	disk_partition_t part;
+	ulong blkcnt;
+
+	debug("== Android: load start\n");
+
+	if (part_get_info_by_name(info->dev, "boot", &part) < 0) {
+		printf("No boot partition\n");
+		return -ENOENT;
+	}
+
+	blkcnt = BLK_CNT(sizeof(struct andr_img_hdr), info->bl_len);
+	if (info->read(info, part.start, blkcnt, buf) != blkcnt)
+		return -EIO;
+
+	if (android_check_header(buf))
+		return -EINVAL;
+
+	blkcnt = BLK_CNT(android_size(buf), info->bl_len);
+	if (info->read(info, part.start, blkcnt, buf) != blkcnt)
+		return -EIO;
+
+	data->boot_addr = (void *)CONFIG_SPL_BOOT_IMAGE_BUF;
+	data->boot_size = blkcnt * info->bl_len;
+
+	flush_dcache_range((ulong)data, (ulong)data + sizeof(*data));
+	flush_dcache_range((ulong)buf, (ulong)buf + blkcnt);
+
+	debug("== Android: load 0x%08lx size OK\n", blkcnt * info->bl_len);
+
+	return 0;
+}
+
+#ifdef CONFIG_ARMV8_CE_SHA1
+int spl_hash_android(struct task_data *data)
+{
+	struct andr_img_hdr *hdr = (void *)CONFIG_SPL_BOOT_IMAGE_BUF;
+	sha1_context ctx;
+	uchar hash[32];
+	void *buf;
+
+	printf("== Android: hash start\n");
+
+	if (hdr->header_version >= 3)
+		return -EINVAL;
+
+	sha1_starts(&ctx);
+
+	buf = (void *)hdr + hdr->page_size;
+	sha1_update(&ctx, (const uchar *)buf, hdr->kernel_size);
+	sha1_update(&ctx, (const uchar *)&hdr->kernel_size, sizeof(hdr->kernel_size));
+
+	buf += ALIGN(hdr->kernel_size, hdr->page_size);
+	sha1_update(&ctx, (const uchar *)buf, hdr->ramdisk_size);
+	sha1_update(&ctx, (const uchar *)&hdr->ramdisk_size, sizeof(hdr->ramdisk_size));
+
+	buf += ALIGN(hdr->ramdisk_size, hdr->page_size);
+	sha1_update(&ctx, (const uchar *)buf, hdr->second_size);
+	sha1_update(&ctx, (const uchar *)&hdr->second_size, sizeof(hdr->second_size));
+
+	if (hdr->header_version > 0) {
+		buf += ALIGN(hdr->second_size, hdr->page_size);
+		sha1_update(&ctx, (const uchar *)buf, hdr->recovery_dtbo_size);
+		sha1_update(&ctx, (const uchar *)&hdr->recovery_dtbo_size, sizeof(hdr->recovery_dtbo_size));
+	}
+	if (hdr->header_version > 1) {
+		buf += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+		sha1_update(&ctx, (const uchar *)buf, hdr->dtb_size);
+		sha1_update(&ctx, (const uchar *)&hdr->dtb_size, sizeof(hdr->dtb_size));
+	}
+
+	sha1_finish(&ctx, hash);
+
+	if (memcmp(hash, hdr->id, 20)) {
+		print_hash("Hash from header", (u8 *)hdr->id, 20);
+		print_hash("Hash real", (u8 *)hash, 20);
+		return -EBADFD;
+	}
+
+	printf("== Android: hash OK, 0x%08lx\n", (ulong)data->boot_addr);
+
+	return 0;
+}
+
+#else
+int spl_hash_android(struct task_data *data)
+{
+	struct andr_img_hdr *hdr = (void *)CONFIG_SPL_BOOT_IMAGE_BUF;
+	struct udevice *dev;
+	sha_context ctx;
+	uchar hash[32];
+	void *buf;
+
+	debug("== Android: hash start\n");
+
+	if (hdr->header_version >= 3)
+		return -EINVAL;
+
+	ctx.algo = CRYPTO_SHA1;
+	dev = crypto_get_device(ctx.algo);
+	if (!dev) {
+		printf("No crypto device for sha1\n");
+		return -ENODEV;
+	}
+
+	ctx.length = hdr->kernel_size + sizeof(hdr->kernel_size) +
+	      hdr->ramdisk_size + sizeof(hdr->ramdisk_size) +
+	      hdr->second_size + sizeof(hdr->second_size);
+	if (hdr->header_version > 0)
+		ctx.length += hdr->recovery_dtbo_size + sizeof(hdr->recovery_dtbo_size);
+	if (hdr->header_version > 1)
+		ctx.length += hdr->dtb_size + sizeof(hdr->dtb_size);
+
+	crypto_sha_init(dev, &ctx);
+
+	buf = (void *)hdr + hdr->page_size;
+	crypto_sha_update(dev, buf, hdr->kernel_size);
+	crypto_sha_update(dev, &hdr->kernel_size, sizeof(hdr->kernel_size));
+
+	buf += ALIGN(hdr->kernel_size, hdr->page_size);
+	crypto_sha_update(dev, buf, hdr->ramdisk_size);
+	crypto_sha_update(dev, &hdr->ramdisk_size, sizeof(hdr->ramdisk_size));
+
+	buf += ALIGN(hdr->ramdisk_size, hdr->page_size);
+	crypto_sha_update(dev, buf, hdr->second_size);
+	crypto_sha_update(dev, &hdr->second_size, sizeof(hdr->second_size));
+
+	if (hdr->header_version > 0) {
+		buf += ALIGN(hdr->second_size, hdr->page_size);
+		crypto_sha_update(dev, buf, hdr->recovery_dtbo_size);
+		crypto_sha_update(dev, &hdr->recovery_dtbo_size, sizeof(hdr->recovery_dtbo_size));
+	}
+	if (hdr->header_version > 1) {
+		buf += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+		crypto_sha_update(dev, buf, hdr->dtb_size);
+		crypto_sha_update(dev, &hdr->dtb_size, sizeof(hdr->dtb_size));
+	}
+
+	crypto_sha_final(dev, &ctx, hash);
+
+	if (memcmp(hash, hdr->id, 20)) {
+		print_hash("Hash from header", (u8 *)hdr->id, 20);
+		print_hash("Hash real", (u8 *)hash, 20);
+		return -EBADFD;
+	}
+
+	debug("== Android: hash OK, 0x%08lx\n", (ulong)data->boot_addr);
+
+	return 0;
+}
+
+#endif
+#endif
+
+#ifdef CONFIG_ROCKCHIP_FIT_IMAGE
+int spl_load_fit(struct task_data *data)
+{
+	struct spl_load_info *info = &data->info;
+	void *buf = (void *)CONFIG_SPL_BOOT_IMAGE_BUF;
+	disk_partition_t part;
+	ulong blkcnt;
+	int size;
+
+	debug("== FIT: load start\n");
+
+	if (part_get_info_by_name(info->dev, "boot", &part) < 0) {
+	        printf("No boot partition\n");
+		return -ENOENT;
+	}
+
+	blkcnt = BLK_CNT(sizeof(struct fdt_header), info->bl_len);
+	if (info->read(info, part.start, blkcnt, buf) != blkcnt)
+		return -EIO;
+
+	if (fdt_check_header(buf))
+		return -EINVAL;
+
+	size = fit_get_totalsize(buf, &size);
+	blkcnt = BLK_CNT(size, info->bl_len);
+	if (info->read(info, part.start, blkcnt, buf) != blkcnt)
+		return -EIO;
+
+	flush_dcache_range((ulong)buf, (ulong)buf + blkcnt);
+
+	debug("== FIT: load 0x%08x size OK\n", size);
+
+	return 0;
+}
+#endif
+
diff --git a/u-boot/common/spl/spl_fit.c b/u-boot/common/spl/spl_fit.c
index b19e0c6..29f9436 100644
--- a/u-boot/common/spl/spl_fit.c
+++ b/u-boot/common/spl/spl_fit.c
@@ -12,6 +12,7 @@
 #include <image.h>
 #include <malloc.h>
 #include <mtd_blk.h>
+#include <mp_boot.h>
 #include <spl.h>
 #include <spl_ab.h>
 #include <linux/libfdt.h>
@@ -481,6 +482,8 @@
 #else
 	sector = CONFIG_SPL_KERNEL_BOOT_SECTOR;
 #endif
+	printf("Trying kernel at 0x%x sector from '%s' part\n", sector, part_name);
+
 	if (info->read(info, sector, 1, &fit_header) != 1) {
 		debug("%s: Failed to read header\n", __func__);
 		return -EIO;
@@ -793,6 +796,10 @@
 	int ret = -EINVAL;
 	int i;
 
+#ifdef CONFIG_MP_BOOT
+	mpb_init_1(*info);
+#endif
+
 	printf("Trying fit image at 0x%lx sector\n", sector_offs);
 	for (i = 0; i < CONFIG_SPL_FIT_IMAGE_MULTIPLE; i++) {
 		if (i > 0) {
@@ -820,15 +827,18 @@
 		}
 	}
 #ifdef CONFIG_SPL_AB
+	/* If boot fail in spl, spl must decrease 1 and do_reset. */
+	if (ret)
+		return spl_ab_decrease_reset(info->dev);
 	/*
-	 * If boot fail in spl, spl must decrease 1. If boot
-	 * successfully, it is no need to do that and U-boot will
-	 * always to decrease 1. If in thunderboot process,
-	 * always need to decrease 1.
+	 * If boot successfully, it is no need to do decrease
+	 * and U-boot will always decrease 1.
+	 * If in thunderboot process, always need to decrease 1.
 	 */
-	if (IS_ENABLED(CONFIG_SPL_KERNEL_BOOT) || ret)
+	if (spl_image->next_stage == SPL_NEXT_STAGE_KERNEL)
 		spl_ab_decrease_tries(info->dev);
 #endif
+
 	return ret;
 }
 
diff --git a/u-boot/common/spl_mp_boot_rk3528.S b/u-boot/common/spl_mp_boot_rk3528.S
new file mode 100644
index 0000000..6c1f25a
--- /dev/null
+++ b/u-boot/common/spl_mp_boot_rk3528.S
@@ -0,0 +1,9214 @@
+	.arch armv8-a+nosimd
+	.file	"mp_boot.c"
+	.text
+.Ltext0:
+	.cfi_sections	.debug_frame
+	.section	.text.mpb_task_set_state,"ax",@progbits
+	.align	2
+	.type	mpb_task_set_state, %function
+mpb_task_set_state:
+.LFB227:
+	.file 1 "common/mp_boot.c"
+	.loc 1 227 0
+	.cfi_startproc
+.LVL0:
+.LBB30:
+.LBB31:
+	.loc 1 146 0
+	mov	x4, 136314880
+	mov	w3, 1
+	lsl	w3, w3, w1
+	ldr	w5, [x4]
+.LBE31:
+.LBE30:
+	.loc 1 232 0
+	tst	w3, w5
+	beq	.L11
+.LBB32:
+.LBB33:
+	.loc 1 199 0
+	uxtw	x5, w0
+	mov	x3, 328
+	umull	x0, w0, w3
+.LVL1:
+	madd	x4, x5, x3, x4
+	mov	w3, 0
+	ldrb	w6, [x4, 328]
+	mov	x4, 20
+	movk	x4, 0x820, lsl 16
+	add	x4, x0, x4
+.L3:
+.LVL2:
+	cmp	w3, w6
+	blt	.L5
+.LVL3:
+.L11:
+.LBE33:
+.LBE32:
+	.loc 1 252 0
+	mov	w0, 0
+	ret
+.LVL4:
+.L5:
+.LBB35:
+.LBB34:
+	.loc 1 200 0
+	ldr	w7, [x4], 40
+	cmp	w1, w7
+	beq	.L4
+	.loc 1 199 0
+	add	w3, w3, 1
+.LVL5:
+	b	.L3
+.L4:
+.LVL6:
+.LBE34:
+.LBE35:
+	.loc 1 239 0
+	mov	x8, 328
+	sxtw	x4, w3
+	mov	x7, 40
+	.loc 1 240 0
+	add	x0, x0, 16
+	.loc 1 239 0
+	mul	x5, x5, x8
+	.loc 1 227 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 239 0
+	nop // between mem op and mult-accumulate
+	madd	x4, x4, x7, x5
+	mov	x6, 136314880
+	.loc 1 240 0
+	smaddl	x3, w3, w7, x0
+	.loc 1 227 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 239 0
+	add	x4, x6, x4
+	.loc 1 227 0
+	.loc 1 239 0
+	add	w1, w1, w2
+.LVL7:
+	.loc 1 240 0
+	add	x0, x3, x6
+	.loc 1 239 0
+	str	w1, [x4, 16]
+	.loc 1 241 0
+	add	x1, x0, 4
+	bl	flush_dcache_range
+.LVL8:
+	.loc 1 252 0
+	mov	w0, 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE227:
+	.size	mpb_task_set_state, .-mpb_task_set_state
+	.section	.text.spl_init_display,"ax",@progbits
+	.align	2
+	.weak	spl_init_display
+	.type	spl_init_display, %function
+spl_init_display:
+.LFB252:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE252:
+	.size	spl_init_display, .-spl_init_display
+	.section	.text.spl_load_baseparamter,"ax",@progbits
+	.align	2
+	.weak	spl_load_baseparamter
+	.type	spl_load_baseparamter, %function
+spl_load_baseparamter:
+.LFB250:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE250:
+	.size	spl_load_baseparamter, .-spl_load_baseparamter
+	.section	.text.spl_load_fit,"ax",@progbits
+	.align	2
+	.weak	spl_load_fit
+	.type	spl_load_fit, %function
+spl_load_fit:
+.LFB248:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE248:
+	.size	spl_load_fit, .-spl_load_fit
+	.section	.text.spl_load_android,"ax",@progbits
+	.align	2
+	.weak	spl_load_android
+	.type	spl_load_android, %function
+spl_load_android:
+.LFB246:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE246:
+	.size	spl_load_android, .-spl_load_android
+	.section	.text.spl_hash_android,"ax",@progbits
+	.align	2
+	.weak	spl_hash_android
+	.type	spl_hash_android, %function
+spl_hash_android:
+.LFB244:
+	.cfi_startproc
+	mov	w0, 0
+	ret
+	.cfi_endproc
+.LFE244:
+	.size	spl_hash_android, .-spl_hash_android
+	.section	.text.spl_dummy,"ax",@progbits
+	.align	2
+	.weak	spl_dummy
+	.type	spl_dummy, %function
+spl_dummy:
+.LFB220:
+	.loc 1 52 0
+	.cfi_startproc
+.LVL9:
+	.loc 1 52 0
+	mov	w0, 0
+.LVL10:
+	ret
+	.cfi_endproc
+.LFE220:
+	.size	spl_dummy, .-spl_dummy
+	.section	.text.mpb_task_is_done,"ax",@progbits
+	.align	2
+	.global	mpb_task_is_done
+	.type	mpb_task_is_done, %function
+mpb_task_is_done:
+.LFB228:
+	.loc 1 261 0
+	.cfi_startproc
+.LVL11:
+.LBB36:
+.LBB37:
+	.loc 1 146 0
+	mov	x2, 136314880
+	mov	w1, 1
+	lsl	w1, w1, w0
+	ldr	w2, [x2]
+.LBE37:
+.LBE36:
+	.loc 1 265 0
+	tst	w1, w2
+	beq	.L35
+	.loc 1 261 0
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	mov	w19, w0
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	.loc 1 275 0
+	mov	w24, -559087616
+	.loc 1 261 0
+	str	x27, [sp, 80]
+	.loc 1 275 0
+	add	w24, w0, w24
+	.cfi_offset 27, -16
+	.loc 1 277 0
+	sub	w27, w0, #65536
+	.loc 1 261 0
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	mov	x21, 0
+.LVL12:
+.L27:
+	mov	x22, 16
+	mov	x20, 20
+	.loc 1 269 0
+	mov	x26, 328
+	movk	x22, 0x820, lsl 16
+	movk	x20, 0x820, lsl 16
+	add	x22, x21, x22
+	add	x20, x21, x20
+	.loc 1 261 0
+	mov	w23, 0
+	.loc 1 269 0
+	movk	x26, 0x820, lsl 16
+	.loc 1 279 0
+	mov	w25, 1431655765
+	b	.L23
+.LVL13:
+.L26:
+	.loc 1 270 0
+	ldr	w0, [x20]
+	cmp	w19, w0
+	beq	.L22
+.L25:
+	.loc 1 269 0
+	add	w23, w23, 1
+.LVL14:
+	add	x22, x22, 40
+	add	x20, x20, 40
+.LVL15:
+.L23:
+	.loc 1 269 0 is_stmt 0 discriminator 1
+	ldrb	w0, [x21, x26]
+	cmp	w23, w0
+	blt	.L26
+.LVL16:
+	add	x21, x21, 328
+	.loc 1 268 0 is_stmt 1 discriminator 2
+	cmp	x21, 1312
+	bne	.L27
+	.loc 1 286 0
+	mov	w0, 0
+.L19:
+	.loc 1 287 0
+	ldp	x19, x20, [sp, 16]
+.LVL17:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL18:
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+.LVL19:
+	ldp	x29, x30, [sp], 96
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 27
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL20:
+.L22:
+	.cfi_restore_state
+	.loc 1 272 0
+	mov	x0, x22
+	mov	x1, x20
+	bl	invalidate_dcache_range
+.LVL21:
+	.loc 1 275 0
+	ldr	w0, [x22]
+	cmp	w0, w24
+	beq	.L28
+	.loc 1 277 0
+	cmp	w0, w27
+	beq	.L20
+	.loc 1 279 0
+	add	w1, w19, w25
+	cmp	w0, w1
+	bne	.L25
+	.loc 1 280 0
+	mov	w0, -2
+	b	.L19
+.L20:
+	.loc 1 266 0
+	mov	w0, -1
+	b	.L19
+.L28:
+	.loc 1 276 0
+	mov	w0, 1
+	b	.L19
+.LVL22:
+.L35:
+	.cfi_def_cfa 31, 0
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 27
+	.cfi_restore 29
+	.cfi_restore 30
+	.loc 1 266 0
+	mov	w0, -1
+.LVL23:
+	.loc 1 287 0
+	ret
+	.cfi_endproc
+.LFE228:
+	.size	mpb_task_is_done, .-mpb_task_is_done
+	.section	.text.mpb_task_dump,"ax",@progbits
+	.align	2
+	.global	mpb_task_dump
+	.type	mpb_task_dump, %function
+mpb_task_dump:
+.LFB229:
+	.loc 1 290 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	.loc 1 294 0
+	mov	x0, 136314880
+	.loc 1 290 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 294 0
+	ldr	x1, [x0, 1360]
+	ldr	x2, [x0, 1368]
+	adrp	x0, .LC1
+	.loc 1 290 0
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.loc 1 294 0
+	mov	x20, 20
+	.loc 1 290 0
+	stp	x23, x24, [sp, 48]
+	.loc 1 294 0
+	movk	x20, 0x820, lsl 16
+	.loc 1 290 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.loc 1 299 0
+	adrp	x23, .LANCHOR0
+	adrp	x24, .LC2
+	.loc 1 296 0
+	mov	w21, 0
+	.loc 1 299 0
+	add	x23, x23, :lo12:.LANCHOR0
+	add	x24, x24, :lo12:.LC2
+	.loc 1 294 0
+	add	x0, x0, :lo12:.LC1
+	.loc 1 290 0
+	str	x25, [sp, 64]
+	.cfi_offset 25, -16
+	.loc 1 294 0
+	bl	printf
+.LVL24:
+.L39:
+	.loc 1 290 0
+	mov	x19, x20
+	mov	w22, 0
+	.loc 1 300 0
+	adrp	x25, .LC3
+	b	.L42
+.LVL25:
+.L40:
+	.loc 1 299 0 discriminator 3
+	ldr	w2, [x19]
+	mov	w1, w21
+	mov	x0, x24
+	.loc 1 297 0 discriminator 3
+	add	w22, w22, 1
+.LVL26:
+	add	x19, x19, 40
+	.loc 1 299 0 discriminator 3
+	ldr	x3, [x23, w2, uxtw 3]
+	bl	printf
+.LVL27:
+	.loc 1 300 0 discriminator 3
+	ldr	w1, [x19, -40]
+	add	x0, x25, :lo12:.LC3
+	bl	printf
+.LVL28:
+	.loc 1 301 0 discriminator 3
+	ldr	x1, [x19, -52]
+	adrp	x0, .LC4
+	add	x0, x0, :lo12:.LC4
+	bl	printf
+.LVL29:
+	.loc 1 302 0 discriminator 3
+	ldr	w1, [x19, -44]
+	adrp	x0, .LC5
+	add	x0, x0, :lo12:.LC5
+	bl	printf
+.LVL30:
+	.loc 1 303 0 discriminator 3
+	ldr	w1, [x19, -28]
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
+	bl	printf
+.LVL31:
+	.loc 1 304 0 discriminator 3
+	ldr	x1, [x19, -20]
+	adrp	x0, .LC7
+	add	x0, x0, :lo12:.LC7
+	bl	printf
+.LVL32:
+	.loc 1 305 0 discriminator 3
+	ldr	w1, [x19, -36]
+	adrp	x0, .LC8
+	add	x0, x0, :lo12:.LC8
+	bl	printf
+.LVL33:
+	.loc 1 306 0 discriminator 3
+	ldr	w1, [x19, -32]
+	adrp	x0, .LC9
+	add	x0, x0, :lo12:.LC9
+	bl	printf
+.LVL34:
+.L42:
+	.loc 1 297 0 discriminator 1
+	ldrb	w0, [x20, 308]
+	cmp	w22, w0
+	blt	.L40
+	.loc 1 296 0 discriminator 2
+	add	w21, w21, 1
+.LVL35:
+	add	x20, x20, 328
+	cmp	w21, 4
+	bne	.L39
+	.loc 1 310 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL36:
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE229:
+	.size	mpb_task_dump, .-mpb_task_dump
+	.section	.text.core_task_run.part.1,"ax",@progbits
+	.align	2
+	.type	core_task_run.part.1, %function
+core_task_run.part.1:
+.LFB242:
+	.loc 1 370 0
+	.cfi_startproc
+.LVL37:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	mov	w19, w0
+	stp	x21, x22, [sp, 32]
+	mov	w20, w2
+.LVL38:
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	and	x22, x1, 255
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -16
+	.cfi_offset 26, -8
+.LBB48:
+.LBB49:
+	.loc 1 319 0
+	cbz	w3, .L45
+	mov	w25, w3
+	mov	w23, 0
+	mov	w21, 0
+	.loc 1 324 0
+	mov	w26, 1
+.LVL39:
+.L50:
+	lsl	w0, w26, w21
+	tst	w0, w25
+	beq	.L46
+.L47:
+	.loc 1 319 0
+	mov	w24, 20000
+.L48:
+.LVL40:
+	.loc 1 329 0
+	mov	w0, w21
+	bl	mpb_task_is_done
+.LVL41:
+	cbz	w0, .L49
+	.loc 1 344 0
+	mov	w0, w21
+	bl	mpb_task_is_done
+.LVL42:
+	.loc 1 345 0
+	cmp	w0, 0
+	cinc	w23, w23, lt
+.LVL43:
+.L46:
+	.loc 1 323 0
+	add	w21, w21, 1
+.LVL44:
+	cmp	w21, 8
+	bne	.L50
+.LVL45:
+.LBE49:
+.LBE48:
+	.loc 1 387 0
+	cbz	w23, .L45
+.LVL46:
+	.loc 1 389 0
+	uxtw	x1, w19
+	mov	x2, 328
+	sxtw	x0, w22
+	mul	x1, x1, x2
+	mov	x2, 40
+	madd	x0, x0, x2, x1
+	mov	x1, 136314880
+	add	x0, x1, x0
+	ldr	w0, [x0, 28]
+	cbnz	w0, .L51
+.LVL47:
+.L52:
+	.loc 1 410 0
+	mov	w2, w20
+	mov	w1, w19
+	adrp	x0, .LC11
+	add	x0, x0, :lo12:.LC11
+	bl	printf
+.LVL48:
+	.loc 1 374 0
+	mov	w21, 0
+	.loc 1 411 0
+	mov	w2, 1431655765
+	mov	w1, w20
+	mov	w0, w19
+	bl	mpb_task_set_state
+.LVL49:
+	b	.L58
+.LVL50:
+.L49:
+.LBB51:
+.LBB50:
+	.loc 1 330 0
+	mov	x0, 100
+	bl	udelay
+.LVL51:
+	.loc 1 333 0
+	subs	w24, w24, #1
+.LVL52:
+	bne	.L48
+.LVL53:
+	.loc 1 337 0
+	bl	mpb_task_dump
+.LVL54:
+	b	.L47
+.LVL55:
+.L45:
+.LBE50:
+.LBE51:
+	.loc 1 392 0
+	uxtw	x1, w19
+	mov	x2, 328
+	sxtw	x0, w22
+	mul	x1, x1, x2
+	mov	x2, 40
+	madd	x0, x0, x2, x1
+	mov	x1, 136314880
+	add	x0, x1, x0
+	ldr	w0, [x0, 28]
+	cbnz	w0, .L52
+.L51:
+.LVL56:
+	.loc 1 397 0
+	mov	w2, w20
+	mov	w1, w19
+	adrp	x0, .LC12
+	add	x0, x0, :lo12:.LC12
+	bl	printf
+.LVL57:
+	.loc 1 401 0
+	uxtw	x24, w19
+	.loc 1 398 0
+	bl	get_ticks
+.LVL58:
+	mov	x23, x0
+.LVL59:
+	.loc 1 400 0
+	mov	w2, 286331153
+	mov	w1, w20
+	mov	w0, w19
+.LVL60:
+	bl	mpb_task_set_state
+.LVL61:
+	.loc 1 401 0
+	mov	x1, 328
+	mov	x0, 40
+	mul	x1, x24, x1
+	madd	x1, x22, x0, x1
+	mov	x0, 8
+	movk	x0, 0x820, lsl 16
+	ldr	x1, [x0, x1]
+	mov	x0, 1320
+	movk	x0, 0x820, lsl 16
+	blr	x1
+.LVL62:
+	mov	w21, w0
+.LVL63:
+	.loc 1 402 0
+	cbnz	w0, .L59
+	.loc 1 405 0
+	mov	w2, -559087616
+	b	.L77
+.L59:
+	.loc 1 403 0
+	mov	w2, -65536
+.L77:
+	.loc 1 405 0
+	mov	w1, w20
+	mov	w0, w19
+.LVL64:
+	bl	mpb_task_set_state
+.LVL65:
+	.loc 1 407 0
+	bl	get_ticks
+.LVL66:
+	sub	x0, x0, x23
+	mov	x4, 24000
+	.loc 1 408 0
+	mov	w3, w21
+	mov	w2, w20
+	mov	w1, w19
+	.loc 1 407 0
+	udiv	x4, x0, x4
+	mov	x0, 328
+	mul	x0, x24, x0
+	mov	x24, 40
+	madd	x24, x22, x24, x0
+	mov	x22, 40
+.LVL67:
+	movk	x22, 0x820, lsl 16
+	.loc 1 408 0
+	adrp	x0, .LC10
+	add	x0, x0, :lo12:.LC10
+	.loc 1 407 0
+	str	x4, [x22, x24]
+	.loc 1 408 0
+	bl	printf
+.LVL68:
+.L58:
+.LBB52:
+.LBB53:
+.LBB54:
+.LBB55:
+	.loc 1 146 0
+	mov	x0, 136314880
+	mov	w1, 1
+	lsl	w1, w1, w20
+	ldr	w2, [x0]
+.LBE55:
+.LBE54:
+	.loc 1 212 0
+	tst	w1, w2
+	beq	.L44
+.LBB56:
+.LBB57:
+	.loc 1 199 0
+	uxtw	x3, w19
+	mov	x1, 328
+	umull	x19, w19, w1
+.LVL69:
+	madd	x0, x3, x1, x0
+	mov	w1, 0
+	ldrb	w2, [x0, 328]
+	mov	x0, 20
+	movk	x0, 0x820, lsl 16
+	add	x0, x19, x0
+.L55:
+.LVL70:
+	cmp	w1, w2
+	blt	.L57
+.LVL71:
+.L44:
+.LBE57:
+.LBE56:
+.LBE53:
+.LBE52:
+	.loc 1 417 0
+	ldp	x19, x20, [sp, 16]
+.LVL72:
+	ldp	x21, x22, [sp, 32]
+.LVL73:
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL74:
+.L57:
+	.cfi_restore_state
+.LBB65:
+.LBB60:
+.LBB59:
+.LBB58:
+	.loc 1 200 0
+	ldr	w4, [x0], 40
+	cmp	w20, w4
+	beq	.L56
+	.loc 1 199 0
+	add	w1, w1, 1
+.LVL75:
+	b	.L55
+.L56:
+.LVL76:
+.LBE58:
+.LBE59:
+	.loc 1 219 0
+	sxtw	x2, w1
+	mov	x5, 328
+	mov	x4, 40
+	.loc 1 220 0
+	add	x19, x19, 32
+	.loc 1 219 0
+	mul	x3, x3, x5
+	mov	x0, 136314880
+	madd	x2, x2, x4, x3
+	.loc 1 220 0
+	smaddl	x19, w1, w4, x19
+	.loc 1 219 0
+	add	x2, x0, x2
+.LBE60:
+.LBE65:
+	.loc 1 417 0
+	ldp	x23, x24, [sp, 48]
+.LBB66:
+.LBB61:
+	.loc 1 220 0
+	add	x0, x19, x0
+.LBE61:
+.LBE66:
+	.loc 1 417 0
+	ldp	x25, x26, [sp, 64]
+.LBB67:
+.LBB62:
+	.loc 1 221 0
+	add	x1, x0, 4
+.LBE62:
+.LBE67:
+	.loc 1 417 0
+	ldp	x19, x20, [sp, 16]
+.LVL77:
+.LBB68:
+.LBB63:
+	.loc 1 219 0
+	str	w21, [x2, 32]
+.LBE63:
+.LBE68:
+	.loc 1 417 0
+	ldp	x21, x22, [sp, 32]
+.LVL78:
+	ldp	x29, x30, [sp], 80
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+.LBB69:
+.LBB64:
+	.loc 1 221 0
+	b	flush_dcache_range
+.LVL79:
+.LBE64:
+.LBE69:
+	.cfi_endproc
+.LFE242:
+	.size	core_task_run.part.1, .-core_task_run.part.1
+	.section	.text.mpb_task_wait_done,"ax",@progbits
+	.align	2
+	.global	mpb_task_wait_done
+	.type	mpb_task_wait_done, %function
+mpb_task_wait_done:
+.LFB232:
+	.loc 1 366 0
+	.cfi_startproc
+.LVL80:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	mov	w19, w0
+.LVL81:
+.L80:
+.LBB74:
+.LBB75:
+	.loc 1 355 0
+	mov	w0, w19
+	bl	mpb_task_is_done
+.LVL82:
+	cbnz	w0, .L79
+.LVL83:
+.LBB76:
+.LBB77:
+	.file 2 "include/linux/delay.h"
+	.loc 2 16 0
+	mov	x0, 1000
+	bl	udelay
+.LVL84:
+	mov	x0, 1000
+	bl	udelay
+.LVL85:
+	b	.L80
+.L79:
+.LBE77:
+.LBE76:
+	.loc 1 362 0
+	mov	w0, w19
+.LBE75:
+.LBE74:
+	.loc 1 368 0
+	ldr	x19, [sp, 16]
+.LVL86:
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+.LBB79:
+.LBB78:
+	.loc 1 362 0
+	b	mpb_task_is_done
+.LVL87:
+.LBE78:
+.LBE79:
+	.cfi_endproc
+.LFE232:
+	.size	mpb_task_wait_done, .-mpb_task_wait_done
+	.section	.text.mpb_task_run,"ax",@progbits
+	.align	2
+	.global	mpb_task_run
+	.type	mpb_task_run, %function
+mpb_task_run:
+.LFB234:
+	.loc 1 420 0
+	.cfi_startproc
+.LVL88:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+.LBB86:
+.LBB87:
+	.loc 1 146 0
+	mov	x3, 136314880
+.LBE87:
+.LBE86:
+	.loc 1 420 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+.LBB89:
+.LBB88:
+	.loc 1 146 0
+	mov	w24, 1
+	ldr	w2, [x3]
+	lsl	w24, w24, w1
+.LVL89:
+.LBE88:
+.LBE89:
+	.loc 1 420 0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	.loc 1 424 0
+	tst	w24, w2
+	.loc 1 420 0
+	str	x25, [sp, 64]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.cfi_offset 25, -16
+	.loc 1 424 0
+	beq	.L82
+	.loc 1 424 0 is_stmt 0 discriminator 1
+	cbz	w1, .L82
+	uxtw	x25, w0
+.LVL90:
+	.loc 1 421 0 is_stmt 1
+	mov	w19, 328
+	mov	x0, 8
+.LVL91:
+	mov	x22, x25
+	mov	w21, w1
+	.loc 1 427 0
+	mov	x20, x3
+	.loc 1 421 0
+	umaddl	x19, w25, w19, x0
+	.loc 1 427 0
+	mov	x0, 328
+	.loc 1 421 0
+	mov	w23, 0
+	.loc 1 427 0
+	madd	x25, x25, x0, x3
+.LVL92:
+	.loc 1 421 0
+	add	x19, x19, x3
+.LVL93:
+.L85:
+	.loc 1 427 0 discriminator 1
+	ldrb	w0, [x25, 328]
+	cmp	w23, w0
+	blt	.L87
+.LVL94:
+.L82:
+	.loc 1 431 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL95:
+.L87:
+	.cfi_restore_state
+	.loc 1 428 0
+	ldr	w0, [x19, 12]
+	cmp	w21, w0
+	bne	.L86
+	.loc 1 428 0 is_stmt 0 discriminator 1
+	ldr	x0, [x19]
+	cbz	x0, .L86
+.LVL96:
+.LBB90:
+.LBB91:
+.LBB92:
+.LBB93:
+	.loc 1 146 0 is_stmt 1
+	ldr	w0, [x20]
+.LBE93:
+.LBE92:
+	.loc 1 377 0
+	tst	w24, w0
+	beq	.L86
+	ldr	w3, [x19, 16]
+	mov	w2, w21
+	mov	w1, w23
+	mov	w0, w22
+	bl	core_task_run.part.1
+.LVL97:
+.L86:
+.LBE91:
+.LBE90:
+	.loc 1 427 0 discriminator 2
+	add	w23, w23, 1
+.LVL98:
+	add	x19, x19, 40
+	b	.L85
+	.cfi_endproc
+.LFE234:
+	.size	mpb_task_run, .-mpb_task_run
+	.section	.text.core_main,"ax",@progbits
+	.align	2
+	.global	core_main
+	.type	core_main, %function
+core_main:
+.LFB235:
+	.loc 1 434 0
+	.cfi_startproc
+.LVL99:
+	stp	x29, x30, [sp, -64]!
+	.cfi_def_cfa_offset 64
+	.cfi_offset 29, -64
+	.cfi_offset 30, -56
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -32
+	.cfi_offset 22, -24
+	uxtw	x22, w0
+	stp	x19, x20, [sp, 16]
+	.loc 1 435 0
+	mov	x0, 8
+.LVL100:
+	.cfi_offset 19, -48
+	.cfi_offset 20, -40
+	mov	w19, 328
+	mov	x20, 136314880
+	.loc 1 434 0
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -16
+	.cfi_offset 24, -8
+	.loc 1 434 0
+	mov	x23, x22
+.LVL101:
+	.loc 1 435 0
+	umaddl	x19, w22, w19, x0
+	.loc 1 438 0
+	mov	x0, 328
+	mov	w21, 0
+.LBB98:
+.LBB99:
+.LBB100:
+.LBB101:
+	.loc 1 146 0
+	mov	w24, 1
+.LBE101:
+.LBE100:
+.LBE99:
+.LBE98:
+	.loc 1 438 0
+	madd	x22, x22, x0, x20
+.LVL102:
+	.loc 1 435 0
+	add	x19, x19, x20
+.LVL103:
+.L99:
+	.loc 1 438 0 discriminator 1
+	ldrb	w0, [x22, 328]
+	cmp	w21, w0
+	blt	.L101
+	.loc 1 442 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL104:
+	ldp	x23, x24, [sp, 48]
+.LVL105:
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL106:
+.L101:
+	.cfi_restore_state
+	.loc 1 439 0
+	ldr	x0, [x19]
+	cbz	x0, .L100
+	.loc 1 440 0
+	ldr	w2, [x19, 12]
+.LVL107:
+.LBB105:
+.LBB104:
+.LBB103:
+.LBB102:
+	.loc 1 146 0
+	ldr	w0, [x20]
+	lsl	w1, w24, w2
+.LBE102:
+.LBE103:
+	.loc 1 377 0
+	tst	w1, w0
+	beq	.L100
+	ldr	w3, [x19, 16]
+	mov	w1, w21
+	mov	w0, w23
+	bl	core_task_run.part.1
+.LVL108:
+.L100:
+.LBE104:
+.LBE105:
+	.loc 1 438 0 discriminator 2
+	add	w21, w21, 1
+.LVL109:
+	add	x19, x19, 40
+	b	.L99
+	.cfi_endproc
+.LFE235:
+	.size	core_main, .-core_main
+	.section	.text.smp_entry,"ax",@progbits
+	.align	2
+	.global	smp_entry
+	.type	smp_entry, %function
+smp_entry:
+.LFB236:
+	.loc 1 448 0
+	.cfi_startproc
+.LVL110:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	.loc 1 448 0
+	mov	w19, w0
+	.loc 1 450 0
+	adrp	x0, .LANCHOR1
+.LVL111:
+	ldr	x0, [x0, #:lo12:.LANCHOR1]
+.LVL112:
+.LBB106:
+.LBB107:
+	.loc 1 131 0
+#APP
+// 131 "common/mp_boot.c" 1
+	mov x18, x0
+
+// 0 "" 2
+.LVL113:
+#NO_APP
+.LBE107:
+.LBE106:
+	.loc 1 451 0
+	bl	dcache_enable
+.LVL114:
+	.loc 1 455 0
+	cmp	w19, 1
+	bne	.L110
+.L114:
+	.loc 1 460 0
+	mov	w0, w19
+	bl	core_main
+.LVL115:
+	b	.L111
+.L110:
+	.loc 1 459 0
+	cmp	w19, 2
+	beq	.L114
+.L111:
+	.loc 1 468 0
+	bl	flush_dcache_all
+.LVL116:
+	.loc 1 469 0
+	bl	disable_interrupts
+.LVL117:
+.LBB108:
+.LBB109:
+	.file 3 "./arch/arm/include/asm/system.h"
+	.loc 3 193 0
+#APP
+// 193 "./arch/arm/include/asm/system.h" 1
+	msr daifset, #0x04
+// 0 "" 2
+#NO_APP
+.LBE109:
+.LBE108:
+	.loc 1 471 0
+	bl	icache_disable
+.LVL118:
+	.loc 1 472 0
+	bl	invalidate_icache_all
+.LVL119:
+	.loc 1 473 0
+	bl	dcache_disable
+.LVL120:
+.LBB110:
+.LBB111:
+	.loc 1 138 0
+#APP
+// 138 "common/mp_boot.c" 1
+	mrs x0, S3_1_c15_c2_1
+// 0 "" 2
+	.loc 1 139 0
+// 139 "common/mp_boot.c" 1
+	bic x0, x0, #0x40
+// 0 "" 2
+	.loc 1 140 0
+// 140 "common/mp_boot.c" 1
+	msr S3_1_c15_c2_1, x0
+// 0 "" 2
+#NO_APP
+.LBE111:
+.LBE110:
+	.loc 1 475 0
+	bl	invalidate_dcache_all
+.LVL121:
+	.loc 1 478 0
+#APP
+// 478 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 479 0
+// 479 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+#NO_APP
+.L112:
+	.loc 1 481 0 discriminator 1
+#APP
+// 481 "common/mp_boot.c" 1
+	wfe
+// 0 "" 2
+#NO_APP
+	b	.L112
+	.cfi_endproc
+.LFE236:
+	.size	smp_entry, .-smp_entry
+	.section	.text.mpb_init_1,"ax",@progbits
+	.align	2
+	.global	mpb_init_1
+	.type	mpb_init_1, %function
+mpb_init_1:
+.LFB238:
+	.loc 1 527 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 528 0
+	mov	x2, 40
+	mov	x1, x0
+	mov	x0, 1320
+	.loc 1 527 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 528 0
+	movk	x0, 0x820, lsl 16
+	.loc 1 527 0
+	.loc 1 528 0
+	bl	memcpy
+.LVL122:
+	.loc 1 530 0
+	mov	w1, 2
+	mov	w0, 0
+	bl	mpb_task_run
+.LVL123:
+	.loc 1 531 0
+	mov	w2, 286331153
+	mov	w1, 3
+	mov	w0, 0
+	bl	mpb_task_set_state
+.LVL124:
+	.loc 1 532 0
+	bl	flush_dcache_all
+.LVL125:
+	.loc 1 533 0
+#APP
+// 533 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 534 0
+// 534 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+	.loc 1 535 0
+#NO_APP
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE238:
+	.size	mpb_init_1, .-mpb_init_1
+	.section	.text.mpb_init_x,"ax",@progbits
+	.align	2
+	.global	mpb_init_x
+	.type	mpb_init_x, %function
+mpb_init_x:
+.LFB239:
+	.loc 1 538 0
+	.cfi_startproc
+.LVL126:
+	stp	x29, x30, [sp, -64]!
+	.cfi_def_cfa_offset 64
+	.cfi_offset 29, -64
+	.cfi_offset 30, -56
+	.loc 1 539 0
+	cmp	w0, 2
+	.loc 1 538 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 539 0
+	beq	.L119
+	cmp	w0, 3
+	beq	.L120
+	cbnz	w0, .L117
+.LBB120:
+.LBB121:
+	.loc 1 494 0
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	mov	x2, 48
+	add	x0, x29, 16
+.LVL127:
+	bl	memcpy
+.LVL128:
+	.loc 1 509 0
+	adrp	x0, .LC13
+	add	x0, x0, :lo12:.LC13
+	bl	printf
+.LVL129:
+	.loc 1 511 0
+	mov	x2, 1376
+	mov	w1, 0
+	mov	x0, 136314880
+	bl	memset
+.LVL130:
+	.loc 1 512 0
+	adrp	x0, .LANCHOR1
+	add	x6, x29, 64
+.LBB122:
+.LBB123:
+	.loc 1 177 0
+	mov	x4, 136314880
+	mov	x7, 328
+.LBE123:
+.LBE122:
+	.loc 1 512 0
+	str	x18, [x0, #:lo12:.LANCHOR1]
+.LVL131:
+	add	x0, x29, 16
+.LBB126:
+.LBB124:
+	.loc 1 179 0
+	mov	x8, 40
+	.loc 1 185 0
+	mov	w10, 1
+.LVL132:
+.L122:
+.LBE124:
+.LBE126:
+	.loc 1 514 0
+	cmp	x6, x0
+	bne	.L124
+	.loc 1 517 0
+	bl	flush_dcache_all
+.LVL133:
+.LBB127:
+	.loc 1 518 0
+#APP
+// 518 "common/mp_boot.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	x1, 8
+	adrp	x0, save_boot_params_ret
+	movk	x1, 0xfe48, lsl 16
+	add	x0, x0, :lo12:save_boot_params_ret
+	str	w0, [x1]
+.LVL134:
+.LBE127:
+.LBB128:
+	.loc 1 519 0
+#APP
+// 519 "common/mp_boot.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	x0, 4
+	mov	w1, 48815
+	movk	x0, 0xfe48, lsl 16
+	movk	w1, 0xdead, lsl 16
+	str	w1, [x0]
+.LBE128:
+	.loc 1 520 0
+#APP
+// 520 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 522 0
+// 522 "common/mp_boot.c" 1
+	sev
+// 0 "" 2
+	.loc 1 523 0
+// 523 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+.LVL135:
+#NO_APP
+.L117:
+.LBE121:
+.LBE120:
+	.loc 1 556 0
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+.L124:
+	.cfi_restore_state
+	ldp	w1, w3, [x0]
+.LVL136:
+	ldp	w12, w11, [x0, 16]
+.LBB131:
+.LBB130:
+.LBB129:
+.LBB125:
+	.loc 1 172 0
+	cmp	w1, 3
+	ldr	x13, [x0, 8]
+.LVL137:
+	beq	.L123
+	.loc 1 176 0
+	sub	w2, w3, #1
+	cmp	w2, 6
+	bhi	.L123
+.LVL138:
+	.loc 1 177 0
+	uxtw	x1, w1
+	mul	x2, x1, x7
+	add	x5, x4, x2
+	.loc 1 179 0
+	ldrb	w1, [x5, 328]
+.LVL139:
+	madd	x1, x1, x8, x2
+	add	x1, x4, x1
+	.loc 1 181 0
+	stp	w3, w12, [x1, 20]
+.LVL140:
+	.loc 1 185 0
+	lsl	w3, w10, w3
+.LVL141:
+	.loc 1 183 0
+	stp	w11, wzr, [x1, 28]
+	.loc 1 179 0
+	str	x13, [x1, 8]
+	.loc 1 184 0
+	str	xzr, [x1, 40]
+	.loc 1 185 0
+	ldr	w1, [x4]
+.LVL142:
+	orr	w3, w1, w3
+	str	w3, [x4]
+	.loc 1 186 0
+	ldrb	w1, [x5, 328]
+	add	w1, w1, 1
+	strb	w1, [x5, 328]
+.L123:
+	add	x0, x0, 24
+	b	.L122
+.LVL143:
+.L119:
+.LBE125:
+.LBE129:
+.LBE130:
+.LBE131:
+	.loc 1 544 0
+	mov	w2, -559087616
+	mov	w1, 3
+	mov	w0, 0
+.LVL144:
+	bl	mpb_task_set_state
+.LVL145:
+	.loc 1 545 0
+	bl	flush_dcache_all
+.LVL146:
+	.loc 1 546 0
+#APP
+// 546 "common/mp_boot.c" 1
+	dsb sy
+// 0 "" 2
+	.loc 1 547 0
+// 547 "common/mp_boot.c" 1
+	isb sy
+// 0 "" 2
+.LVL147:
+	.loc 1 556 0
+#NO_APP
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+.LBB132:
+.LBB133:
+	.loc 2 16 0
+	mov	x0, 1000
+	b	udelay
+.LVL148:
+.L120:
+	.cfi_restore_state
+.LBE133:
+.LBE132:
+	.loc 1 556 0
+	ldp	x29, x30, [sp], 64
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	.loc 1 553 0
+	mov	w2, -559087616
+	mov	w1, 7
+	mov	w0, 0
+.LVL149:
+	b	mpb_task_set_state
+.LVL150:
+	.cfi_endproc
+.LFE239:
+	.size	mpb_init_x, .-mpb_init_x
+	.section	.text.mpb_post,"ax",@progbits
+	.align	2
+	.global	mpb_post
+	.type	mpb_post, %function
+mpb_post:
+.LFB240:
+	.loc 1 626 0
+	.cfi_startproc
+.LVL151:
+	.loc 1 627 0
+	cmp	w0, 6
+	bne	.L133
+	.loc 1 626 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 629 0
+	mov	w0, 2
+.LVL152:
+	.loc 1 626 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 629 0
+	bl	mpb_task_wait_done
+.LVL153:
+	sxtw	x0, w0
+	.loc 1 633 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+.LVL154:
+.L133:
+	.loc 1 632 0
+	mov	x0, 0
+.LVL155:
+	ret
+	.cfi_endproc
+.LFE240:
+	.size	mpb_post, .-mpb_post
+	.section	.rodata
+	.align	3
+	.set	.LANCHOR2,. + 0
+.LC0:
+	.word	0
+	.word	2
+	.xword	spl_load_baseparamter
+	.word	0
+	.word	0
+	.word	2
+	.word	1
+	.xword	spl_init_display
+	.word	0
+	.word	0
+	.section	.bss.mpb_gd,"aw",@nobits
+	.align	3
+	.set	.LANCHOR1,. + 0
+	.type	mpb_gd, %object
+	.size	mpb_gd, 8
+mpb_gd:
+	.zero	8
+	.section	.rodata.core_task_run.part.1.str1.1,"aMS",@progbits,1
+.LC10:
+	.string	"-- T%d.%d [%d, %ld]\n"
+.LC11:
+	.string	"++ T%d.%d -\n"
+.LC12:
+	.string	"++ T%d.%d\n"
+	.section	.rodata.mpb_init_x.str1.1,"aMS",@progbits,1
+.LC13:
+	.string	"U-Boot SPL MP\n"
+	.section	.rodata.mpb_task_dump.str1.1,"aMS",@progbits,1
+.LC1:
+	.string	"data: %08lx, %08lx\n"
+.LC2:
+	.string	"T%d.%d:[%s]\n"
+.LC3:
+	.string	"  tid:              %d\n"
+.LC4:
+	.string	"  fn:               0x%08lx\n"
+.LC5:
+	.string	"  state:            0x%08x\n"
+.LC6:
+	.string	"  ret:              %d\n"
+.LC7:
+	.string	"  ms:               %ld\n"
+.LC8:
+	.string	"  ptid_mask:        0x%08x\n"
+.LC9:
+	.string	"  rip_fail:         %d\n\n"
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC14:
+	.string	"none"
+.LC15:
+	.string	"init-display"
+.LC16:
+	.string	"load-baseparameter"
+.LC17:
+	.string	"load-uboot"
+.LC18:
+	.string	"load-fit"
+.LC19:
+	.string	"load-android"
+.LC20:
+	.string	"hash-android"
+.LC21:
+	.string	"run-uboot"
+	.section	.rodata.tid_name,"a",@progbits
+	.align	3
+	.set	.LANCHOR0,. + 0
+	.type	tid_name, %object
+	.size	tid_name, 64
+tid_name:
+	.xword	.LC14
+	.xword	.LC15
+	.xword	.LC16
+	.xword	.LC17
+	.xword	.LC18
+	.xword	.LC19
+	.xword	.LC20
+	.xword	.LC21
+	.text
+.Letext0:
+	.file 4 "include/common.h"
+	.file 5 "./arch/arm/include/asm/types.h"
+	.file 6 "include/linux/types.h"
+	.file 7 "include/errno.h"
+	.file 8 "include/linux/string.h"
+	.file 9 "include/efi.h"
+	.file 10 "include/ide.h"
+	.file 11 "include/linux/list.h"
+	.file 12 "include/part.h"
+	.file 13 "include/flash.h"
+	.file 14 "include/lmb.h"
+	.file 15 "include/asm-generic/u-boot.h"
+	.file 16 "./arch/arm/include/asm/u-boot-arm.h"
+	.file 17 "include/linux/libfdt_env.h"
+	.file 18 "include/linux/../../scripts/dtc/libfdt/fdt.h"
+	.file 19 "include/linux/libfdt.h"
+	.file 20 "include/image.h"
+	.file 21 "./arch/arm/include/asm/global_data.h"
+	.file 22 "include/asm-generic/global_data.h"
+	.file 23 "include/net.h"
+	.file 24 "include/dm/uclass-id.h"
+	.file 25 "./arch/arm/include/asm/spl.h"
+	.file 26 "include/spl.h"
+	.file 27 "include/mp_boot.h"
+	.file 28 "include/log.h"
+	.file 29 "include/stdio.h"
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.4byte	0x2374
+	.2byte	0x4
+	.4byte	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.4byte	.LASF428
+	.byte	0xc
+	.4byte	.LASF429
+	.4byte	.LASF430
+	.4byte	.Ldebug_ranges0+0x230
+	.8byte	0
+	.4byte	.Ldebug_line0
+	.uleb128 0x2
+	.4byte	.LASF4
+	.byte	0x4
+	.byte	0xd
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF0
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF1
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x7
+	.4byte	.LASF2
+	.uleb128 0x4
+	.4byte	.LASF20
+	.byte	0x7
+	.byte	0xc
+	.4byte	0x54
+	.uleb128 0x5
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x6
+	.4byte	.LASF3
+	.uleb128 0x2
+	.4byte	.LASF5
+	.byte	0x5
+	.byte	0xc
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x5
+	.4byte	.LASF6
+	.uleb128 0x2
+	.4byte	.LASF7
+	.byte	0x5
+	.byte	0x12
+	.4byte	0x7f
+	.uleb128 0x3
+	.byte	0x4
+	.byte	0x7
+	.4byte	.LASF8
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF9
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF10
+	.uleb128 0x6
+	.string	"u8"
+	.byte	0x5
+	.byte	0x1f
+	.4byte	0x34
+	.uleb128 0x7
+	.4byte	0x94
+	.uleb128 0x6
+	.string	"u32"
+	.byte	0x5
+	.byte	0x25
+	.4byte	0x7f
+	.uleb128 0x6
+	.string	"u64"
+	.byte	0x5
+	.byte	0x28
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF11
+	.byte	0x5
+	.byte	0x31
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF12
+	.byte	0x5
+	.byte	0x32
+	.4byte	0x8d
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF13
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe3
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF14
+	.uleb128 0x7
+	.4byte	0xdc
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF15
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xdc
+	.uleb128 0x2
+	.4byte	.LASF16
+	.byte	0x6
+	.byte	0x59
+	.4byte	0x42
+	.uleb128 0x2
+	.4byte	.LASF17
+	.byte	0x6
+	.byte	0x5b
+	.4byte	0x3b
+	.uleb128 0x9
+	.4byte	0x100
+	.uleb128 0x2
+	.4byte	.LASF18
+	.byte	0x6
+	.byte	0x69
+	.4byte	0x62
+	.uleb128 0x2
+	.4byte	.LASF19
+	.byte	0x6
+	.byte	0x97
+	.4byte	0x74
+	.uleb128 0xa
+	.byte	0x8
+	.uleb128 0x4
+	.4byte	.LASF21
+	.byte	0x8
+	.byte	0xb
+	.4byte	0xef
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x2
+	.4byte	.LASF22
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0x145
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF23
+	.byte	0x9
+	.2byte	0x140
+	.4byte	0x13a
+	.uleb128 0xd
+	.4byte	.LASF24
+	.byte	0x9
+	.2byte	0x143
+	.4byte	0x13a
+	.uleb128 0xd
+	.4byte	.LASF25
+	.byte	0x9
+	.2byte	0x143
+	.4byte	0x13a
+	.uleb128 0xe
+	.4byte	.LASF38
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x169
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x17a
+	.uleb128 0xf
+	.uleb128 0xb
+	.4byte	0x100
+	.4byte	0x186
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF26
+	.byte	0xa
+	.byte	0x10
+	.4byte	0x17b
+	.uleb128 0xb
+	.4byte	0x34
+	.4byte	0x1a1
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x5
+	.byte	0
+	.uleb128 0x11
+	.4byte	.LASF29
+	.byte	0x10
+	.byte	0xb
+	.byte	0x16
+	.4byte	0x1c6
+	.uleb128 0x12
+	.4byte	.LASF27
+	.byte	0xb
+	.byte	0x17
+	.4byte	0x1c6
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF28
+	.byte	0xb
+	.byte	0x17
+	.4byte	0x1c6
+	.byte	0x8
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1a1
+	.uleb128 0x11
+	.4byte	.LASF30
+	.byte	0x10
+	.byte	0xc
+	.byte	0xf
+	.4byte	0x1f1
+	.uleb128 0x12
+	.4byte	.LASF31
+	.byte	0xc
+	.byte	0x10
+	.4byte	0xef
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF32
+	.byte	0xc
+	.byte	0x11
+	.4byte	0x20a
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x1cc
+	.uleb128 0x13
+	.4byte	0x54
+	.4byte	0x20a
+	.uleb128 0x14
+	.4byte	0x54
+	.uleb128 0x14
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1f6
+	.uleb128 0xb
+	.4byte	0x1f1
+	.4byte	0x21b
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x210
+	.uleb128 0x4
+	.4byte	.LASF30
+	.byte	0xc
+	.byte	0xe1
+	.4byte	0x21b
+	.uleb128 0x15
+	.2byte	0x1220
+	.byte	0xd
+	.byte	0x13
+	.4byte	0x27f
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xd
+	.byte	0x14
+	.4byte	0x100
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF34
+	.byte	0xd
+	.byte	0x15
+	.4byte	0xf5
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF35
+	.byte	0xd
+	.byte	0x16
+	.4byte	0x100
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF36
+	.byte	0xd
+	.byte	0x17
+	.4byte	0x27f
+	.byte	0x18
+	.uleb128 0x16
+	.4byte	.LASF37
+	.byte	0xd
+	.byte	0x18
+	.4byte	0x290
+	.2byte	0x1018
+	.uleb128 0x17
+	.string	"mtd"
+	.byte	0xd
+	.byte	0x31
+	.4byte	0x2a6
+	.2byte	0x1218
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x100
+	.4byte	0x290
+	.uleb128 0x18
+	.4byte	0xcf
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x29
+	.4byte	0x2a1
+	.uleb128 0x18
+	.4byte	0xcf
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF39
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x2a1
+	.uleb128 0x2
+	.4byte	.LASF40
+	.byte	0xd
+	.byte	0x37
+	.4byte	0x22b
+	.uleb128 0xb
+	.4byte	0x2ac
+	.4byte	0x2c2
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF41
+	.byte	0xd
+	.byte	0x39
+	.4byte	0x2b7
+	.uleb128 0x3
+	.byte	0x10
+	.byte	0x4
+	.4byte	.LASF42
+	.uleb128 0x11
+	.4byte	.LASF43
+	.byte	0x10
+	.byte	0xe
+	.byte	0x10
+	.4byte	0x2f9
+	.uleb128 0x12
+	.4byte	.LASF44
+	.byte	0xe
+	.byte	0x11
+	.4byte	0xb9
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xe
+	.byte	0x12
+	.4byte	0xc4
+	.byte	0x8
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF45
+	.2byte	0x120
+	.byte	0xe
+	.byte	0x15
+	.4byte	0x32b
+	.uleb128 0x1a
+	.string	"cnt"
+	.byte	0xe
+	.byte	0x16
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xe
+	.byte	0x17
+	.4byte	0xc4
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF46
+	.byte	0xe
+	.byte	0x18
+	.4byte	0x32b
+	.byte	0x10
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x2d4
+	.4byte	0x33b
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x10
+	.byte	0
+	.uleb128 0x1b
+	.string	"lmb"
+	.2byte	0x240
+	.byte	0xe
+	.byte	0x1b
+	.4byte	0x362
+	.uleb128 0x12
+	.4byte	.LASF47
+	.byte	0xe
+	.byte	0x1c
+	.4byte	0x2f9
+	.byte	0
+	.uleb128 0x16
+	.4byte	.LASF48
+	.byte	0xe
+	.byte	0x1d
+	.4byte	0x2f9
+	.2byte	0x120
+	.byte	0
+	.uleb128 0x1c
+	.string	"lmb"
+	.byte	0xe
+	.byte	0x20
+	.4byte	0x33b
+	.uleb128 0x1d
+	.byte	0x10
+	.byte	0xf
+	.byte	0x5b
+	.4byte	0x38e
+	.uleb128 0x12
+	.4byte	.LASF36
+	.byte	0xf
+	.byte	0x5c
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF33
+	.byte	0xf
+	.byte	0x5d
+	.4byte	0xae
+	.byte	0x8
+	.byte	0
+	.uleb128 0x11
+	.4byte	.LASF49
+	.byte	0xa8
+	.byte	0xf
+	.byte	0x1b
+	.4byte	0x47f
+	.uleb128 0x12
+	.4byte	.LASF50
+	.byte	0xf
+	.byte	0x1c
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF51
+	.byte	0xf
+	.byte	0x1d
+	.4byte	0xc4
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF52
+	.byte	0xf
+	.byte	0x1e
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF53
+	.byte	0xf
+	.byte	0x1f
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF54
+	.byte	0xf
+	.byte	0x20
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF55
+	.byte	0xf
+	.byte	0x21
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF56
+	.byte	0xf
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0x12
+	.4byte	.LASF57
+	.byte	0xf
+	.byte	0x24
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0x12
+	.4byte	.LASF58
+	.byte	0xf
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0x12
+	.4byte	.LASF59
+	.byte	0xf
+	.byte	0x26
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0x12
+	.4byte	.LASF60
+	.byte	0xf
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0x12
+	.4byte	.LASF61
+	.byte	0xf
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0x12
+	.4byte	.LASF62
+	.byte	0xf
+	.byte	0x33
+	.4byte	0x191
+	.byte	0x60
+	.uleb128 0x12
+	.4byte	.LASF63
+	.byte	0xf
+	.byte	0x34
+	.4byte	0x42
+	.byte	0x66
+	.uleb128 0x12
+	.4byte	.LASF64
+	.byte	0xf
+	.byte	0x35
+	.4byte	0x3b
+	.byte	0x68
+	.uleb128 0x12
+	.4byte	.LASF65
+	.byte	0xf
+	.byte	0x36
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0x12
+	.4byte	.LASF66
+	.byte	0xf
+	.byte	0x57
+	.4byte	0x100
+	.byte	0x78
+	.uleb128 0x12
+	.4byte	.LASF67
+	.byte	0xf
+	.byte	0x58
+	.4byte	0x100
+	.byte	0x80
+	.uleb128 0x12
+	.4byte	.LASF68
+	.byte	0xf
+	.byte	0x5e
+	.4byte	0x47f
+	.byte	0x88
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x36d
+	.4byte	0x48f
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x1
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF69
+	.byte	0xf
+	.byte	0x60
+	.4byte	0x38e
+	.uleb128 0x4
+	.4byte	.LASF70
+	.byte	0x10
+	.byte	0x13
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF71
+	.byte	0x10
+	.byte	0x14
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF72
+	.byte	0x10
+	.byte	0x15
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF73
+	.byte	0x10
+	.byte	0x16
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF74
+	.byte	0x10
+	.byte	0x17
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF75
+	.byte	0x10
+	.byte	0x18
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF76
+	.byte	0x10
+	.byte	0x19
+	.4byte	0x100
+	.uleb128 0x2
+	.4byte	.LASF77
+	.byte	0x11
+	.byte	0x11
+	.4byte	0x11b
+	.uleb128 0x11
+	.4byte	.LASF78
+	.byte	0x28
+	.byte	0x12
+	.byte	0x39
+	.4byte	0x577
+	.uleb128 0x12
+	.4byte	.LASF79
+	.byte	0x12
+	.byte	0x3a
+	.4byte	0x4e7
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF80
+	.byte	0x12
+	.byte	0x3b
+	.4byte	0x4e7
+	.byte	0x4
+	.uleb128 0x12
+	.4byte	.LASF81
+	.byte	0x12
+	.byte	0x3c
+	.4byte	0x4e7
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF82
+	.byte	0x12
+	.byte	0x3d
+	.4byte	0x4e7
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF83
+	.byte	0x12
+	.byte	0x3e
+	.4byte	0x4e7
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF84
+	.byte	0x12
+	.byte	0x3f
+	.4byte	0x4e7
+	.byte	0x14
+	.uleb128 0x12
+	.4byte	.LASF85
+	.byte	0x12
+	.byte	0x40
+	.4byte	0x4e7
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF86
+	.byte	0x12
+	.byte	0x43
+	.4byte	0x4e7
+	.byte	0x1c
+	.uleb128 0x12
+	.4byte	.LASF87
+	.byte	0x12
+	.byte	0x46
+	.4byte	0x4e7
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF88
+	.byte	0x12
+	.byte	0x49
+	.4byte	0x4e7
+	.byte	0x24
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF89
+	.byte	0x13
+	.2byte	0x136
+	.4byte	0x583
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x4f2
+	.uleb128 0x1e
+	.4byte	.LASF90
+	.byte	0x40
+	.byte	0x14
+	.2byte	0x137
+	.4byte	0x633
+	.uleb128 0x1f
+	.4byte	.LASF91
+	.byte	0x14
+	.2byte	0x138
+	.4byte	0x11b
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF92
+	.byte	0x14
+	.2byte	0x139
+	.4byte	0x11b
+	.byte	0x4
+	.uleb128 0x1f
+	.4byte	.LASF93
+	.byte	0x14
+	.2byte	0x13a
+	.4byte	0x11b
+	.byte	0x8
+	.uleb128 0x1f
+	.4byte	.LASF94
+	.byte	0x14
+	.2byte	0x13b
+	.4byte	0x11b
+	.byte	0xc
+	.uleb128 0x1f
+	.4byte	.LASF95
+	.byte	0x14
+	.2byte	0x13c
+	.4byte	0x11b
+	.byte	0x10
+	.uleb128 0x1f
+	.4byte	.LASF96
+	.byte	0x14
+	.2byte	0x13d
+	.4byte	0x11b
+	.byte	0x14
+	.uleb128 0x1f
+	.4byte	.LASF97
+	.byte	0x14
+	.2byte	0x13e
+	.4byte	0x11b
+	.byte	0x18
+	.uleb128 0x1f
+	.4byte	.LASF98
+	.byte	0x14
+	.2byte	0x13f
+	.4byte	0x110
+	.byte	0x1c
+	.uleb128 0x1f
+	.4byte	.LASF99
+	.byte	0x14
+	.2byte	0x140
+	.4byte	0x110
+	.byte	0x1d
+	.uleb128 0x1f
+	.4byte	.LASF100
+	.byte	0x14
+	.2byte	0x141
+	.4byte	0x110
+	.byte	0x1e
+	.uleb128 0x1f
+	.4byte	.LASF101
+	.byte	0x14
+	.2byte	0x142
+	.4byte	0x110
+	.byte	0x1f
+	.uleb128 0x1f
+	.4byte	.LASF102
+	.byte	0x14
+	.2byte	0x143
+	.4byte	0x633
+	.byte	0x20
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x110
+	.4byte	0x643
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x20
+	.4byte	.LASF103
+	.byte	0x14
+	.2byte	0x144
+	.4byte	0x589
+	.uleb128 0x1e
+	.4byte	.LASF104
+	.byte	0x30
+	.byte	0x14
+	.2byte	0x146
+	.4byte	0x6d1
+	.uleb128 0x1f
+	.4byte	.LASF36
+	.byte	0x14
+	.2byte	0x147
+	.4byte	0x100
+	.byte	0
+	.uleb128 0x21
+	.string	"end"
+	.byte	0x14
+	.2byte	0x147
+	.4byte	0x100
+	.byte	0x8
+	.uleb128 0x1f
+	.4byte	.LASF105
+	.byte	0x14
+	.2byte	0x148
+	.4byte	0x100
+	.byte	0x10
+	.uleb128 0x1f
+	.4byte	.LASF106
+	.byte	0x14
+	.2byte	0x148
+	.4byte	0x100
+	.byte	0x18
+	.uleb128 0x1f
+	.4byte	.LASF107
+	.byte	0x14
+	.2byte	0x149
+	.4byte	0x100
+	.byte	0x20
+	.uleb128 0x1f
+	.4byte	.LASF108
+	.byte	0x14
+	.2byte	0x14a
+	.4byte	0x110
+	.byte	0x28
+	.uleb128 0x1f
+	.4byte	.LASF109
+	.byte	0x14
+	.2byte	0x14a
+	.4byte	0x110
+	.byte	0x29
+	.uleb128 0x21
+	.string	"os"
+	.byte	0x14
+	.2byte	0x14a
+	.4byte	0x110
+	.byte	0x2a
+	.uleb128 0x1f
+	.4byte	.LASF110
+	.byte	0x14
+	.2byte	0x14b
+	.4byte	0x110
+	.byte	0x2b
+	.byte	0
+	.uleb128 0x20
+	.4byte	.LASF111
+	.byte	0x14
+	.2byte	0x14c
+	.4byte	0x64f
+	.uleb128 0x22
+	.4byte	.LASF112
+	.2byte	0x380
+	.byte	0x14
+	.2byte	0x152
+	.4byte	0x87a
+	.uleb128 0x1f
+	.4byte	.LASF113
+	.byte	0x14
+	.2byte	0x158
+	.4byte	0x87a
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF114
+	.byte	0x14
+	.2byte	0x159
+	.4byte	0x643
+	.byte	0x8
+	.uleb128 0x1f
+	.4byte	.LASF115
+	.byte	0x14
+	.2byte	0x15a
+	.4byte	0x100
+	.byte	0x48
+	.uleb128 0x1f
+	.4byte	.LASF116
+	.byte	0x14
+	.2byte	0x15d
+	.4byte	0xd6
+	.byte	0x50
+	.uleb128 0x1f
+	.4byte	.LASF117
+	.byte	0x14
+	.2byte	0x15f
+	.4byte	0x126
+	.byte	0x58
+	.uleb128 0x1f
+	.4byte	.LASF118
+	.byte	0x14
+	.2byte	0x160
+	.4byte	0xd6
+	.byte	0x60
+	.uleb128 0x1f
+	.4byte	.LASF119
+	.byte	0x14
+	.2byte	0x161
+	.4byte	0x54
+	.byte	0x68
+	.uleb128 0x1f
+	.4byte	.LASF120
+	.byte	0x14
+	.2byte	0x163
+	.4byte	0x126
+	.byte	0x70
+	.uleb128 0x1f
+	.4byte	.LASF121
+	.byte	0x14
+	.2byte	0x164
+	.4byte	0xd6
+	.byte	0x78
+	.uleb128 0x1f
+	.4byte	.LASF122
+	.byte	0x14
+	.2byte	0x165
+	.4byte	0x54
+	.byte	0x80
+	.uleb128 0x1f
+	.4byte	.LASF123
+	.byte	0x14
+	.2byte	0x167
+	.4byte	0x126
+	.byte	0x88
+	.uleb128 0x1f
+	.4byte	.LASF124
+	.byte	0x14
+	.2byte	0x168
+	.4byte	0xd6
+	.byte	0x90
+	.uleb128 0x1f
+	.4byte	.LASF125
+	.byte	0x14
+	.2byte	0x169
+	.4byte	0x54
+	.byte	0x98
+	.uleb128 0x1f
+	.4byte	.LASF126
+	.byte	0x14
+	.2byte	0x16b
+	.4byte	0x126
+	.byte	0xa0
+	.uleb128 0x1f
+	.4byte	.LASF127
+	.byte	0x14
+	.2byte	0x16c
+	.4byte	0xd6
+	.byte	0xa8
+	.uleb128 0x1f
+	.4byte	.LASF128
+	.byte	0x14
+	.2byte	0x16d
+	.4byte	0x54
+	.byte	0xb0
+	.uleb128 0x21
+	.string	"os"
+	.byte	0x14
+	.2byte	0x171
+	.4byte	0x6d1
+	.byte	0xb8
+	.uleb128 0x21
+	.string	"ep"
+	.byte	0x14
+	.2byte	0x172
+	.4byte	0x100
+	.byte	0xe8
+	.uleb128 0x1f
+	.4byte	.LASF129
+	.byte	0x14
+	.2byte	0x174
+	.4byte	0x100
+	.byte	0xf0
+	.uleb128 0x1f
+	.4byte	.LASF130
+	.byte	0x14
+	.2byte	0x174
+	.4byte	0x100
+	.byte	0xf8
+	.uleb128 0x23
+	.4byte	.LASF131
+	.byte	0x14
+	.2byte	0x176
+	.4byte	0xef
+	.2byte	0x100
+	.uleb128 0x23
+	.4byte	.LASF132
+	.byte	0x14
+	.2byte	0x177
+	.4byte	0x100
+	.2byte	0x108
+	.uleb128 0x23
+	.4byte	.LASF133
+	.byte	0x14
+	.2byte	0x179
+	.4byte	0x100
+	.2byte	0x110
+	.uleb128 0x23
+	.4byte	.LASF134
+	.byte	0x14
+	.2byte	0x17a
+	.4byte	0x100
+	.2byte	0x118
+	.uleb128 0x23
+	.4byte	.LASF135
+	.byte	0x14
+	.2byte	0x17b
+	.4byte	0x100
+	.2byte	0x120
+	.uleb128 0x23
+	.4byte	.LASF136
+	.byte	0x14
+	.2byte	0x17c
+	.4byte	0x100
+	.2byte	0x128
+	.uleb128 0x24
+	.string	"kbd"
+	.byte	0x14
+	.2byte	0x17d
+	.4byte	0x880
+	.2byte	0x130
+	.uleb128 0x23
+	.4byte	.LASF137
+	.byte	0x14
+	.2byte	0x180
+	.4byte	0x54
+	.2byte	0x138
+	.uleb128 0x23
+	.4byte	.LASF138
+	.byte	0x14
+	.2byte	0x18d
+	.4byte	0x54
+	.2byte	0x13c
+	.uleb128 0x24
+	.string	"lmb"
+	.byte	0x14
+	.2byte	0x190
+	.4byte	0x33b
+	.2byte	0x140
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x643
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x48f
+	.uleb128 0x20
+	.4byte	.LASF139
+	.byte	0x14
+	.2byte	0x196
+	.4byte	0x6dd
+	.uleb128 0xd
+	.4byte	.LASF140
+	.byte	0x14
+	.2byte	0x198
+	.4byte	0x886
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0x8af
+	.uleb128 0x18
+	.4byte	0xcf
+	.2byte	0x3ff
+	.byte	0
+	.uleb128 0x25
+	.4byte	.LASF331
+	.byte	0x4
+	.4byte	0x54
+	.byte	0x18
+	.byte	0xe
+	.4byte	0xb18
+	.uleb128 0x26
+	.4byte	.LASF141
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF142
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF143
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF144
+	.byte	0x3
+	.uleb128 0x26
+	.4byte	.LASF145
+	.byte	0x4
+	.uleb128 0x26
+	.4byte	.LASF146
+	.byte	0x5
+	.uleb128 0x26
+	.4byte	.LASF147
+	.byte	0x6
+	.uleb128 0x26
+	.4byte	.LASF148
+	.byte	0x7
+	.uleb128 0x26
+	.4byte	.LASF149
+	.byte	0x8
+	.uleb128 0x26
+	.4byte	.LASF150
+	.byte	0x9
+	.uleb128 0x26
+	.4byte	.LASF151
+	.byte	0xa
+	.uleb128 0x26
+	.4byte	.LASF152
+	.byte	0xb
+	.uleb128 0x26
+	.4byte	.LASF153
+	.byte	0xc
+	.uleb128 0x26
+	.4byte	.LASF154
+	.byte	0xd
+	.uleb128 0x26
+	.4byte	.LASF155
+	.byte	0xe
+	.uleb128 0x26
+	.4byte	.LASF156
+	.byte	0xf
+	.uleb128 0x26
+	.4byte	.LASF157
+	.byte	0x10
+	.uleb128 0x26
+	.4byte	.LASF158
+	.byte	0x11
+	.uleb128 0x26
+	.4byte	.LASF159
+	.byte	0x12
+	.uleb128 0x26
+	.4byte	.LASF160
+	.byte	0x13
+	.uleb128 0x26
+	.4byte	.LASF161
+	.byte	0x14
+	.uleb128 0x26
+	.4byte	.LASF162
+	.byte	0x15
+	.uleb128 0x26
+	.4byte	.LASF163
+	.byte	0x16
+	.uleb128 0x26
+	.4byte	.LASF164
+	.byte	0x17
+	.uleb128 0x26
+	.4byte	.LASF165
+	.byte	0x18
+	.uleb128 0x26
+	.4byte	.LASF166
+	.byte	0x19
+	.uleb128 0x26
+	.4byte	.LASF167
+	.byte	0x1a
+	.uleb128 0x26
+	.4byte	.LASF168
+	.byte	0x1b
+	.uleb128 0x26
+	.4byte	.LASF169
+	.byte	0x1c
+	.uleb128 0x26
+	.4byte	.LASF170
+	.byte	0x1d
+	.uleb128 0x26
+	.4byte	.LASF171
+	.byte	0x1e
+	.uleb128 0x26
+	.4byte	.LASF172
+	.byte	0x1f
+	.uleb128 0x26
+	.4byte	.LASF173
+	.byte	0x20
+	.uleb128 0x26
+	.4byte	.LASF174
+	.byte	0x21
+	.uleb128 0x26
+	.4byte	.LASF175
+	.byte	0x22
+	.uleb128 0x26
+	.4byte	.LASF176
+	.byte	0x23
+	.uleb128 0x26
+	.4byte	.LASF177
+	.byte	0x24
+	.uleb128 0x26
+	.4byte	.LASF178
+	.byte	0x25
+	.uleb128 0x26
+	.4byte	.LASF179
+	.byte	0x26
+	.uleb128 0x26
+	.4byte	.LASF180
+	.byte	0x27
+	.uleb128 0x26
+	.4byte	.LASF181
+	.byte	0x28
+	.uleb128 0x26
+	.4byte	.LASF182
+	.byte	0x29
+	.uleb128 0x26
+	.4byte	.LASF183
+	.byte	0x2a
+	.uleb128 0x26
+	.4byte	.LASF184
+	.byte	0x2b
+	.uleb128 0x26
+	.4byte	.LASF185
+	.byte	0x2c
+	.uleb128 0x26
+	.4byte	.LASF186
+	.byte	0x2d
+	.uleb128 0x26
+	.4byte	.LASF187
+	.byte	0x2e
+	.uleb128 0x26
+	.4byte	.LASF188
+	.byte	0x2f
+	.uleb128 0x26
+	.4byte	.LASF189
+	.byte	0x30
+	.uleb128 0x26
+	.4byte	.LASF190
+	.byte	0x31
+	.uleb128 0x26
+	.4byte	.LASF191
+	.byte	0x32
+	.uleb128 0x26
+	.4byte	.LASF192
+	.byte	0x33
+	.uleb128 0x26
+	.4byte	.LASF193
+	.byte	0x34
+	.uleb128 0x26
+	.4byte	.LASF194
+	.byte	0x35
+	.uleb128 0x26
+	.4byte	.LASF195
+	.byte	0x36
+	.uleb128 0x26
+	.4byte	.LASF196
+	.byte	0x37
+	.uleb128 0x26
+	.4byte	.LASF197
+	.byte	0x38
+	.uleb128 0x26
+	.4byte	.LASF198
+	.byte	0x39
+	.uleb128 0x26
+	.4byte	.LASF199
+	.byte	0x3a
+	.uleb128 0x26
+	.4byte	.LASF200
+	.byte	0x3b
+	.uleb128 0x26
+	.4byte	.LASF201
+	.byte	0x3c
+	.uleb128 0x26
+	.4byte	.LASF202
+	.byte	0x3d
+	.uleb128 0x26
+	.4byte	.LASF203
+	.byte	0x3e
+	.uleb128 0x26
+	.4byte	.LASF204
+	.byte	0x3f
+	.uleb128 0x26
+	.4byte	.LASF205
+	.byte	0x40
+	.uleb128 0x26
+	.4byte	.LASF206
+	.byte	0x41
+	.uleb128 0x26
+	.4byte	.LASF207
+	.byte	0x42
+	.uleb128 0x26
+	.4byte	.LASF208
+	.byte	0x43
+	.uleb128 0x26
+	.4byte	.LASF209
+	.byte	0x44
+	.uleb128 0x26
+	.4byte	.LASF210
+	.byte	0x45
+	.uleb128 0x26
+	.4byte	.LASF211
+	.byte	0x46
+	.uleb128 0x26
+	.4byte	.LASF212
+	.byte	0x47
+	.uleb128 0x26
+	.4byte	.LASF213
+	.byte	0x48
+	.uleb128 0x26
+	.4byte	.LASF214
+	.byte	0x49
+	.uleb128 0x26
+	.4byte	.LASF215
+	.byte	0x4a
+	.uleb128 0x26
+	.4byte	.LASF216
+	.byte	0x4b
+	.uleb128 0x26
+	.4byte	.LASF217
+	.byte	0x4c
+	.uleb128 0x26
+	.4byte	.LASF218
+	.byte	0x4d
+	.uleb128 0x26
+	.4byte	.LASF219
+	.byte	0x4e
+	.uleb128 0x26
+	.4byte	.LASF220
+	.byte	0x4f
+	.uleb128 0x26
+	.4byte	.LASF221
+	.byte	0x50
+	.uleb128 0x26
+	.4byte	.LASF222
+	.byte	0x51
+	.uleb128 0x26
+	.4byte	.LASF223
+	.byte	0x52
+	.uleb128 0x26
+	.4byte	.LASF224
+	.byte	0x53
+	.uleb128 0x26
+	.4byte	.LASF225
+	.byte	0x54
+	.uleb128 0x26
+	.4byte	.LASF226
+	.byte	0x55
+	.uleb128 0x26
+	.4byte	.LASF227
+	.byte	0x56
+	.uleb128 0x26
+	.4byte	.LASF228
+	.byte	0x57
+	.uleb128 0x26
+	.4byte	.LASF229
+	.byte	0x58
+	.uleb128 0x26
+	.4byte	.LASF230
+	.byte	0x59
+	.uleb128 0x26
+	.4byte	.LASF231
+	.byte	0x5a
+	.uleb128 0x26
+	.4byte	.LASF232
+	.byte	0x5b
+	.uleb128 0x26
+	.4byte	.LASF233
+	.byte	0x5c
+	.uleb128 0x26
+	.4byte	.LASF234
+	.byte	0x5d
+	.uleb128 0x26
+	.4byte	.LASF235
+	.byte	0x5e
+	.uleb128 0x26
+	.4byte	.LASF236
+	.byte	0x5f
+	.uleb128 0x26
+	.4byte	.LASF237
+	.byte	0x60
+	.uleb128 0x26
+	.4byte	.LASF238
+	.byte	0x61
+	.uleb128 0x26
+	.4byte	.LASF239
+	.byte	0x62
+	.uleb128 0x27
+	.4byte	.LASF240
+	.sleb128 -1
+	.byte	0
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1c
+	.byte	0xf6
+	.4byte	0xb2b
+	.uleb128 0x26
+	.4byte	.LASF241
+	.byte	0x5
+	.byte	0
+	.uleb128 0x11
+	.4byte	.LASF242
+	.byte	0x40
+	.byte	0x15
+	.byte	0xc
+	.4byte	0xba4
+	.uleb128 0x12
+	.4byte	.LASF243
+	.byte	0x15
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x1a
+	.string	"tbu"
+	.byte	0x15
+	.byte	0x23
+	.4byte	0x7f
+	.byte	0x8
+	.uleb128 0x1a
+	.string	"tbl"
+	.byte	0x15
+	.byte	0x24
+	.4byte	0x7f
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF244
+	.byte	0x15
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF245
+	.byte	0x15
+	.byte	0x26
+	.4byte	0x8d
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF246
+	.byte	0x15
+	.byte	0x29
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF247
+	.byte	0x15
+	.byte	0x2a
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF248
+	.byte	0x15
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0x12
+	.4byte	.LASF249
+	.byte	0x15
+	.byte	0x2d
+	.4byte	0x3b
+	.byte	0x38
+	.byte	0
+	.uleb128 0x11
+	.4byte	.LASF250
+	.byte	0x18
+	.byte	0x16
+	.byte	0x22
+	.4byte	0xbec
+	.uleb128 0x12
+	.4byte	.LASF251
+	.byte	0x16
+	.byte	0x23
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF252
+	.byte	0x16
+	.byte	0x24
+	.4byte	0xa3
+	.byte	0x4
+	.uleb128 0x1a
+	.string	"id"
+	.byte	0x16
+	.byte	0x25
+	.4byte	0xa3
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF253
+	.byte	0x16
+	.byte	0x26
+	.4byte	0xa3
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF254
+	.byte	0x16
+	.byte	0x27
+	.4byte	0x100
+	.byte	0x10
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF255
+	.2byte	0x1c8
+	.byte	0x16
+	.byte	0x2a
+	.4byte	0xe22
+	.uleb128 0x1a
+	.string	"bd"
+	.byte	0x16
+	.byte	0x2b
+	.4byte	0x880
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF256
+	.byte	0x16
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF253
+	.byte	0x16
+	.byte	0x2d
+	.4byte	0x7f
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF257
+	.byte	0x16
+	.byte	0x2e
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF258
+	.byte	0x16
+	.byte	0x2f
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0x12
+	.4byte	.LASF259
+	.byte	0x16
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF260
+	.byte	0x16
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0x12
+	.4byte	.LASF261
+	.byte	0x16
+	.byte	0x3e
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0x12
+	.4byte	.LASF262
+	.byte	0x16
+	.byte	0x42
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0x12
+	.4byte	.LASF263
+	.byte	0x16
+	.byte	0x43
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0x12
+	.4byte	.LASF264
+	.byte	0x16
+	.byte	0x45
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0x12
+	.4byte	.LASF265
+	.byte	0x16
+	.byte	0x46
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0x12
+	.4byte	.LASF266
+	.byte	0x16
+	.byte	0x47
+	.4byte	0x3b
+	.byte	0x60
+	.uleb128 0x12
+	.4byte	.LASF267
+	.byte	0x16
+	.byte	0x48
+	.4byte	0xc4
+	.byte	0x68
+	.uleb128 0x12
+	.4byte	.LASF268
+	.byte	0x16
+	.byte	0x49
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0x12
+	.4byte	.LASF269
+	.byte	0x16
+	.byte	0x4a
+	.4byte	0x3b
+	.byte	0x78
+	.uleb128 0x12
+	.4byte	.LASF270
+	.byte	0x16
+	.byte	0x4b
+	.4byte	0x3b
+	.byte	0x80
+	.uleb128 0x12
+	.4byte	.LASF271
+	.byte	0x16
+	.byte	0x4c
+	.4byte	0x3b
+	.byte	0x88
+	.uleb128 0x12
+	.4byte	.LASF272
+	.byte	0x16
+	.byte	0x4d
+	.4byte	0xe22
+	.byte	0x90
+	.uleb128 0x12
+	.4byte	.LASF273
+	.byte	0x16
+	.byte	0x50
+	.4byte	0x16e
+	.byte	0x98
+	.uleb128 0x12
+	.4byte	.LASF274
+	.byte	0x16
+	.byte	0x51
+	.4byte	0x16e
+	.byte	0xa0
+	.uleb128 0x12
+	.4byte	.LASF275
+	.byte	0x16
+	.byte	0x52
+	.4byte	0x1a1
+	.byte	0xa8
+	.uleb128 0x12
+	.4byte	.LASF276
+	.byte	0x16
+	.byte	0x57
+	.4byte	0x174
+	.byte	0xb8
+	.uleb128 0x12
+	.4byte	.LASF277
+	.byte	0x16
+	.byte	0x58
+	.4byte	0x126
+	.byte	0xc0
+	.uleb128 0x12
+	.4byte	.LASF278
+	.byte	0x16
+	.byte	0x59
+	.4byte	0x3b
+	.byte	0xc8
+	.uleb128 0x12
+	.4byte	.LASF279
+	.byte	0x16
+	.byte	0x5b
+	.4byte	0xe2d
+	.byte	0xd0
+	.uleb128 0x12
+	.4byte	.LASF280
+	.byte	0x16
+	.byte	0x5c
+	.4byte	0xe2d
+	.byte	0xd8
+	.uleb128 0x12
+	.4byte	.LASF281
+	.byte	0x16
+	.byte	0x5e
+	.4byte	0x174
+	.byte	0xe0
+	.uleb128 0x12
+	.4byte	.LASF282
+	.byte	0x16
+	.byte	0x5f
+	.4byte	0x174
+	.byte	0xe8
+	.uleb128 0x1a
+	.string	"jt"
+	.byte	0x16
+	.byte	0x60
+	.4byte	0xe38
+	.byte	0xf0
+	.uleb128 0x12
+	.4byte	.LASF283
+	.byte	0x16
+	.byte	0x61
+	.4byte	0xe3e
+	.byte	0xf8
+	.uleb128 0x16
+	.4byte	.LASF284
+	.byte	0x16
+	.byte	0x6b
+	.4byte	0x7f
+	.2byte	0x118
+	.uleb128 0x16
+	.4byte	.LASF285
+	.byte	0x16
+	.byte	0x6c
+	.4byte	0x7f
+	.2byte	0x11c
+	.uleb128 0x16
+	.4byte	.LASF286
+	.byte	0x16
+	.byte	0x6e
+	.4byte	0x3b
+	.2byte	0x120
+	.uleb128 0x16
+	.4byte	.LASF287
+	.byte	0x16
+	.byte	0x6f
+	.4byte	0x3b
+	.2byte	0x128
+	.uleb128 0x16
+	.4byte	.LASF288
+	.byte	0x16
+	.byte	0x70
+	.4byte	0x3b
+	.2byte	0x130
+	.uleb128 0x16
+	.4byte	.LASF289
+	.byte	0x16
+	.byte	0x79
+	.4byte	0x16e
+	.2byte	0x138
+	.uleb128 0x16
+	.4byte	.LASF110
+	.byte	0x16
+	.byte	0x7a
+	.4byte	0xb2b
+	.2byte	0x140
+	.uleb128 0x16
+	.4byte	.LASF290
+	.byte	0x16
+	.byte	0x80
+	.4byte	0x100
+	.2byte	0x180
+	.uleb128 0x16
+	.4byte	.LASF291
+	.byte	0x16
+	.byte	0x81
+	.4byte	0x100
+	.2byte	0x188
+	.uleb128 0x16
+	.4byte	.LASF292
+	.byte	0x16
+	.byte	0x87
+	.4byte	0xb9
+	.2byte	0x190
+	.uleb128 0x16
+	.4byte	.LASF293
+	.byte	0x16
+	.byte	0x8a
+	.4byte	0x54
+	.2byte	0x198
+	.uleb128 0x16
+	.4byte	.LASF294
+	.byte	0x16
+	.byte	0x8c
+	.4byte	0xba4
+	.2byte	0x1a0
+	.uleb128 0x16
+	.4byte	.LASF295
+	.byte	0x16
+	.byte	0x8d
+	.4byte	0x100
+	.2byte	0x1b8
+	.uleb128 0x16
+	.4byte	.LASF296
+	.byte	0x16
+	.byte	0x8e
+	.4byte	0x54
+	.2byte	0x1c0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xbec
+	.uleb128 0xe
+	.4byte	.LASF297
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe28
+	.uleb128 0xe
+	.4byte	.LASF298
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe33
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0xe4e
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF299
+	.byte	0x16
+	.byte	0x9b
+	.4byte	0xbec
+	.uleb128 0x9
+	.4byte	0xe4e
+	.uleb128 0x4
+	.4byte	.LASF300
+	.byte	0x4
+	.byte	0xad
+	.4byte	0x100
+	.uleb128 0xb
+	.4byte	0x94
+	.4byte	0xe74
+	.uleb128 0xc
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF301
+	.byte	0x4
+	.byte	0xaf
+	.4byte	0xe69
+	.uleb128 0x4
+	.4byte	.LASF302
+	.byte	0x4
+	.byte	0xb0
+	.4byte	0xe69
+	.uleb128 0x4
+	.4byte	.LASF303
+	.byte	0x4
+	.byte	0xfe
+	.4byte	0x100
+	.uleb128 0x4
+	.4byte	.LASF304
+	.byte	0x4
+	.byte	0xff
+	.4byte	0x100
+	.uleb128 0xd
+	.4byte	.LASF305
+	.byte	0x4
+	.2byte	0x100
+	.4byte	0x100
+	.uleb128 0x11
+	.4byte	.LASF306
+	.byte	0x4
+	.byte	0x17
+	.byte	0x2e
+	.4byte	0xec5
+	.uleb128 0x12
+	.4byte	.LASF307
+	.byte	0x17
+	.byte	0x2f
+	.4byte	0x11b
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x29
+	.uleb128 0xb
+	.4byte	0x94
+	.4byte	0xedb
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x5
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF308
+	.byte	0x17
+	.2byte	0x1fd
+	.4byte	0xeac
+	.uleb128 0xd
+	.4byte	.LASF309
+	.byte	0x17
+	.2byte	0x1fe
+	.4byte	0xeac
+	.uleb128 0xd
+	.4byte	.LASF310
+	.byte	0x17
+	.2byte	0x200
+	.4byte	0xeac
+	.uleb128 0xd
+	.4byte	.LASF311
+	.byte	0x17
+	.2byte	0x205
+	.4byte	0xe3e
+	.uleb128 0xd
+	.4byte	.LASF312
+	.byte	0x17
+	.2byte	0x206
+	.4byte	0xe3e
+	.uleb128 0xb
+	.4byte	0xdc
+	.4byte	0xf27
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x3f
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF313
+	.byte	0x17
+	.2byte	0x207
+	.4byte	0xf17
+	.uleb128 0xd
+	.4byte	.LASF314
+	.byte	0x17
+	.2byte	0x209
+	.4byte	0xecb
+	.uleb128 0xd
+	.4byte	.LASF315
+	.byte	0x17
+	.2byte	0x20a
+	.4byte	0xecb
+	.uleb128 0xd
+	.4byte	.LASF316
+	.byte	0x17
+	.2byte	0x20b
+	.4byte	0xeac
+	.uleb128 0xd
+	.4byte	.LASF317
+	.byte	0x17
+	.2byte	0x20c
+	.4byte	0xeac
+	.uleb128 0xd
+	.4byte	.LASF318
+	.byte	0x17
+	.2byte	0x20d
+	.4byte	0xec5
+	.uleb128 0xb
+	.4byte	0xec5
+	.4byte	0xf7f
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF319
+	.byte	0x17
+	.2byte	0x20e
+	.4byte	0xf6f
+	.uleb128 0xd
+	.4byte	.LASF320
+	.byte	0x17
+	.2byte	0x20f
+	.4byte	0xec5
+	.uleb128 0xd
+	.4byte	.LASF321
+	.byte	0x17
+	.2byte	0x210
+	.4byte	0x54
+	.uleb128 0xb
+	.4byte	0x9e
+	.4byte	0xfb3
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x5
+	.byte	0
+	.uleb128 0x7
+	.4byte	0xfa3
+	.uleb128 0xd
+	.4byte	.LASF322
+	.byte	0x17
+	.2byte	0x211
+	.4byte	0xfb3
+	.uleb128 0xd
+	.4byte	.LASF323
+	.byte	0x17
+	.2byte	0x212
+	.4byte	0xfb3
+	.uleb128 0xd
+	.4byte	.LASF324
+	.byte	0x17
+	.2byte	0x216
+	.4byte	0xf5
+	.uleb128 0xd
+	.4byte	.LASF325
+	.byte	0x17
+	.2byte	0x217
+	.4byte	0xf5
+	.uleb128 0xd
+	.4byte	.LASF326
+	.byte	0x17
+	.2byte	0x219
+	.4byte	0x54
+	.uleb128 0xd
+	.4byte	.LASF327
+	.byte	0x17
+	.2byte	0x220
+	.4byte	0x89e
+	.uleb128 0xd
+	.4byte	.LASF328
+	.byte	0x17
+	.2byte	0x222
+	.4byte	0xa3
+	.uleb128 0xd
+	.4byte	.LASF329
+	.byte	0x17
+	.2byte	0x224
+	.4byte	0xa3
+	.uleb128 0xd
+	.4byte	.LASF330
+	.byte	0x17
+	.2byte	0x230
+	.4byte	0xeac
+	.uleb128 0x29
+	.4byte	.LASF332
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x17
+	.2byte	0x286
+	.4byte	0x104e
+	.uleb128 0x26
+	.4byte	.LASF333
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF334
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF335
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF336
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF337
+	.byte	0x17
+	.2byte	0x28c
+	.4byte	0x1024
+	.uleb128 0x4
+	.4byte	.LASF338
+	.byte	0x19
+	.byte	0x2b
+	.4byte	0x13a
+	.uleb128 0x4
+	.4byte	.LASF339
+	.byte	0x19
+	.byte	0x2b
+	.4byte	0x13a
+	.uleb128 0x11
+	.4byte	.LASF340
+	.byte	0x28
+	.byte	0x1a
+	.byte	0x39
+	.4byte	0x10b9
+	.uleb128 0x1a
+	.string	"dev"
+	.byte	0x1a
+	.byte	0x3a
+	.4byte	0x126
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF341
+	.byte	0x1a
+	.byte	0x3b
+	.4byte	0x126
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF342
+	.byte	0x1a
+	.byte	0x3c
+	.4byte	0x54
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF343
+	.byte	0x1a
+	.byte	0x3d
+	.4byte	0xd6
+	.byte	0x18
+	.uleb128 0x12
+	.4byte	.LASF344
+	.byte	0x1a
+	.byte	0x3e
+	.4byte	0x10dd
+	.byte	0x20
+	.byte	0
+	.uleb128 0x13
+	.4byte	0x100
+	.4byte	0x10d7
+	.uleb128 0x14
+	.4byte	0x10d7
+	.uleb128 0x14
+	.4byte	0x100
+	.uleb128 0x14
+	.4byte	0x100
+	.uleb128 0x14
+	.4byte	0x126
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1070
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x10b9
+	.uleb128 0x11
+	.4byte	.LASF345
+	.byte	0x38
+	.byte	0x1b
+	.byte	0xc
+	.4byte	0x1114
+	.uleb128 0x12
+	.4byte	.LASF346
+	.byte	0x1b
+	.byte	0xd
+	.4byte	0x1070
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF347
+	.byte	0x1b
+	.byte	0x10
+	.4byte	0x126
+	.byte	0x28
+	.uleb128 0x12
+	.4byte	.LASF348
+	.byte	0x1b
+	.byte	0x11
+	.4byte	0x100
+	.byte	0x30
+	.byte	0
+	.uleb128 0x2a
+	.string	"gd"
+	.byte	0x1
+	.byte	0xf
+	.4byte	0x111e
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe59
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1
+	.byte	0x40
+	.4byte	0x1149
+	.uleb128 0x26
+	.4byte	.LASF349
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF350
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF351
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF352
+	.byte	0x3
+	.byte	0
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1
+	.byte	0x47
+	.4byte	0x1180
+	.uleb128 0x26
+	.4byte	.LASF353
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF354
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF355
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF356
+	.byte	0x3
+	.uleb128 0x26
+	.4byte	.LASF357
+	.byte	0x4
+	.uleb128 0x26
+	.4byte	.LASF358
+	.byte	0x5
+	.uleb128 0x26
+	.4byte	.LASF359
+	.byte	0x6
+	.byte	0
+	.uleb128 0x28
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1
+	.byte	0x51
+	.4byte	0x11c3
+	.uleb128 0x26
+	.4byte	.LASF360
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF361
+	.byte	0x1
+	.uleb128 0x26
+	.4byte	.LASF362
+	.byte	0x2
+	.uleb128 0x26
+	.4byte	.LASF363
+	.byte	0x3
+	.uleb128 0x26
+	.4byte	.LASF364
+	.byte	0x4
+	.uleb128 0x26
+	.4byte	.LASF365
+	.byte	0x5
+	.uleb128 0x26
+	.4byte	.LASF366
+	.byte	0x6
+	.uleb128 0x26
+	.4byte	.LASF367
+	.byte	0x7
+	.uleb128 0x26
+	.4byte	.LASF368
+	.byte	0x8
+	.byte	0
+	.uleb128 0xb
+	.4byte	0xd6
+	.4byte	0x11d3
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x7
+	.byte	0
+	.uleb128 0x2b
+	.4byte	.LASF369
+	.byte	0x1
+	.byte	0x5d
+	.4byte	0x11c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	tid_name
+	.uleb128 0x2
+	.4byte	.LASF370
+	.byte	0x1
+	.byte	0x68
+	.4byte	0x11f3
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x11f9
+	.uleb128 0x13
+	.4byte	0x54
+	.4byte	0x1208
+	.uleb128 0x14
+	.4byte	0x1208
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x10e3
+	.uleb128 0x11
+	.4byte	.LASF371
+	.byte	0x28
+	.byte	0x1
+	.byte	0x69
+	.4byte	0x126d
+	.uleb128 0x1a
+	.string	"fn"
+	.byte	0x1
+	.byte	0x6a
+	.4byte	0x11e8
+	.byte	0
+	.uleb128 0x12
+	.4byte	.LASF138
+	.byte	0x1
+	.byte	0x6b
+	.4byte	0xa3
+	.byte	0x8
+	.uleb128 0x1a
+	.string	"tid"
+	.byte	0x1
+	.byte	0x6c
+	.4byte	0xa3
+	.byte	0xc
+	.uleb128 0x12
+	.4byte	.LASF372
+	.byte	0x1
+	.byte	0x6d
+	.4byte	0xa3
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF373
+	.byte	0x1
+	.byte	0x6e
+	.4byte	0xa3
+	.byte	0x14
+	.uleb128 0x1a
+	.string	"ret"
+	.byte	0x1
+	.byte	0x6f
+	.4byte	0x54
+	.byte	0x18
+	.uleb128 0x1a
+	.string	"ms"
+	.byte	0x1
+	.byte	0x70
+	.4byte	0x100
+	.byte	0x20
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF374
+	.2byte	0x148
+	.byte	0x1
+	.byte	0x73
+	.4byte	0x1294
+	.uleb128 0x12
+	.4byte	.LASF375
+	.byte	0x1
+	.byte	0x74
+	.4byte	0x1294
+	.byte	0
+	.uleb128 0x17
+	.string	"num"
+	.byte	0x1
+	.byte	0x75
+	.4byte	0x94
+	.2byte	0x140
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x120e
+	.4byte	0x12a4
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x7
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF376
+	.2byte	0x560
+	.byte	0x1
+	.byte	0x78
+	.4byte	0x12d7
+	.uleb128 0x12
+	.4byte	.LASF377
+	.byte	0x1
+	.byte	0x79
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x1a
+	.string	"cpu"
+	.byte	0x1
+	.byte	0x7a
+	.4byte	0x12d7
+	.byte	0x8
+	.uleb128 0x16
+	.4byte	.LASF378
+	.byte	0x1
+	.byte	0x7b
+	.4byte	0x10e3
+	.2byte	0x528
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x126d
+	.4byte	0x12e7
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x3
+	.byte	0
+	.uleb128 0x2c
+	.string	"mpb"
+	.byte	0x1
+	.byte	0x7e
+	.4byte	0x12f2
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x12a4
+	.uleb128 0x2b
+	.4byte	.LASF379
+	.byte	0x1
+	.byte	0x7f
+	.4byte	0x100
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	mpb_gd
+	.uleb128 0x11
+	.4byte	.LASF380
+	.byte	0x18
+	.byte	0x1
+	.byte	0x95
+	.4byte	0x1355
+	.uleb128 0x1a
+	.string	"cid"
+	.byte	0x1
+	.byte	0x96
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x1a
+	.string	"tid"
+	.byte	0x1
+	.byte	0x97
+	.4byte	0xa3
+	.byte	0x4
+	.uleb128 0x1a
+	.string	"fn"
+	.byte	0x1
+	.byte	0x98
+	.4byte	0x11e8
+	.byte	0x8
+	.uleb128 0x12
+	.4byte	.LASF372
+	.byte	0x1
+	.byte	0x99
+	.4byte	0xa3
+	.byte	0x10
+	.uleb128 0x12
+	.4byte	.LASF373
+	.byte	0x1
+	.byte	0x9a
+	.4byte	0xa3
+	.byte	0x14
+	.byte	0
+	.uleb128 0x2d
+	.4byte	.LASF389
+	.byte	0x1
+	.2byte	0x271
+	.4byte	0x100
+	.8byte	.LFB240
+	.8byte	.LFE240-.LFB240
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x139b
+	.uleb128 0x2e
+	.string	"evt"
+	.byte	0x1
+	.2byte	0x271
+	.4byte	0x54
+	.4byte	.LLST61
+	.uleb128 0x2f
+	.8byte	.LVL153
+	.4byte	0x19e7
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF381
+	.byte	0x1
+	.2byte	0x219
+	.8byte	.LFB239
+	.8byte	.LFE239-.LFB239
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1584
+	.uleb128 0x2e
+	.string	"evt"
+	.byte	0x1
+	.2byte	0x219
+	.4byte	0x54
+	.4byte	.LLST53
+	.uleb128 0x32
+	.4byte	0x1618
+	.8byte	.LBB120
+	.4byte	.Ldebug_ranges0+0x1c0
+	.byte	0x1
+	.2byte	0x21d
+	.4byte	0x14f3
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0x1c0
+	.uleb128 0x34
+	.4byte	0x1625
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x35
+	.4byte	0x1631
+	.4byte	.LLST54
+	.uleb128 0x32
+	.4byte	0x1eb5
+	.8byte	.LBB122
+	.4byte	.Ldebug_ranges0+0x1f0
+	.byte	0x1
+	.2byte	0x203
+	.4byte	0x143a
+	.uleb128 0x36
+	.4byte	0x1ec5
+	.4byte	.LLST55
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0x1f0
+	.uleb128 0x35
+	.4byte	0x1ed0
+	.4byte	.LLST56
+	.uleb128 0x35
+	.4byte	0x1edb
+	.4byte	.LLST57
+	.uleb128 0x35
+	.4byte	0x1ee6
+	.4byte	.LLST58
+	.byte	0
+	.byte	0
+	.uleb128 0x37
+	.8byte	.LBB127
+	.8byte	.LBE127-.LBB127
+	.4byte	0x1455
+	.uleb128 0x38
+	.4byte	0x1640
+	.byte	0
+	.uleb128 0x37
+	.8byte	.LBB128
+	.8byte	.LBE128-.LBB128
+	.4byte	0x1474
+	.uleb128 0x35
+	.4byte	0x164e
+	.4byte	.LLST59
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL128
+	.4byte	0x22d5
+	.4byte	0x149f
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8f
+	.sleb128 16
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR2
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x30
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL129
+	.4byte	0x22de
+	.4byte	0x14be
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC13
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL130
+	.4byte	0x22e9
+	.4byte	0x14e4
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x4
+	.byte	0x8
+	.byte	0x82
+	.byte	0x44
+	.byte	0x24
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x560
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL133
+	.4byte	0x22f4
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.4byte	0x1fd7
+	.8byte	.LBB132
+	.8byte	.LBE132-.LBB132
+	.byte	0x1
+	.2byte	0x226
+	.4byte	0x152e
+	.uleb128 0x36
+	.4byte	0x1fe3
+	.4byte	.LLST60
+	.uleb128 0x3c
+	.8byte	.LVL148
+	.4byte	0x2300
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x3e8
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL145
+	.4byte	0x1d6b
+	.4byte	0x1554
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x33
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x6
+	.byte	0x11
+	.sleb128 -559087616
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL146
+	.4byte	0x22f4
+	.uleb128 0x3c
+	.8byte	.LVL150
+	.4byte	0x1d6b
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x37
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x6
+	.byte	0x11
+	.sleb128 -559087616
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF382
+	.byte	0x1
+	.2byte	0x20e
+	.8byte	.LFB238
+	.8byte	.LFE238-.LFB238
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1618
+	.uleb128 0x3d
+	.4byte	.LASF346
+	.byte	0x1
+	.2byte	0x20e
+	.4byte	0x1070
+	.uleb128 0x2
+	.byte	0x70
+	.sleb128 0
+	.uleb128 0x39
+	.8byte	.LVL122
+	.4byte	0x22d5
+	.4byte	0x15c9
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x28
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL123
+	.4byte	0x184a
+	.4byte	0x15e5
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL124
+	.4byte	0x1d6b
+	.4byte	0x160a
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x30
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x33
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x5
+	.byte	0xc
+	.4byte	0x11111111
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL125
+	.4byte	0x22f4
+	.byte	0
+	.uleb128 0x3e
+	.4byte	.LASF403
+	.byte	0x1
+	.2byte	0x1e9
+	.byte	0x1
+	.4byte	0x165c
+	.uleb128 0x3f
+	.4byte	.LASF383
+	.byte	0x1
+	.2byte	0x1ee
+	.4byte	0x165c
+	.uleb128 0x40
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1fb
+	.4byte	0x54
+	.uleb128 0x41
+	.4byte	0x164d
+	.uleb128 0x40
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x206
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x42
+	.uleb128 0x40
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x207
+	.4byte	0xa3
+	.byte	0
+	.byte	0
+	.uleb128 0xb
+	.4byte	0x130d
+	.4byte	0x166c
+	.uleb128 0x10
+	.4byte	0xcf
+	.byte	0x1
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF384
+	.byte	0x1
+	.2byte	0x1bf
+	.8byte	.LFB236
+	.8byte	.LFE236-.LFB236
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1764
+	.uleb128 0x2e
+	.string	"cpu"
+	.byte	0x1
+	.2byte	0x1bf
+	.4byte	0xa3
+	.4byte	.LLST51
+	.uleb128 0x3b
+	.4byte	0x1f14
+	.8byte	.LBB106
+	.8byte	.LBE106-.LBB106
+	.byte	0x1
+	.2byte	0x1c2
+	.4byte	0x16c0
+	.uleb128 0x36
+	.4byte	0x1f20
+	.4byte	.LLST52
+	.byte	0
+	.uleb128 0x43
+	.4byte	0x1fcf
+	.8byte	.LBB108
+	.8byte	.LBE108-.LBB108
+	.byte	0x1
+	.2byte	0x1d6
+	.uleb128 0x43
+	.4byte	0x1f0c
+	.8byte	.LBB110
+	.8byte	.LBE110-.LBB110
+	.byte	0x1
+	.2byte	0x1da
+	.uleb128 0x3a
+	.8byte	.LVL114
+	.4byte	0x230b
+	.uleb128 0x39
+	.8byte	.LVL115
+	.4byte	0x1764
+	.4byte	0x1715
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL116
+	.4byte	0x22f4
+	.uleb128 0x3a
+	.8byte	.LVL117
+	.4byte	0x2317
+	.uleb128 0x3a
+	.8byte	.LVL118
+	.4byte	0x2323
+	.uleb128 0x3a
+	.8byte	.LVL119
+	.4byte	0x232f
+	.uleb128 0x3a
+	.8byte	.LVL120
+	.4byte	0x233b
+	.uleb128 0x3a
+	.8byte	.LVL121
+	.4byte	0x2347
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF385
+	.byte	0x1
+	.2byte	0x1b1
+	.8byte	.LFB235
+	.8byte	.LFE235-.LFB235
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1844
+	.uleb128 0x2e
+	.string	"cpu"
+	.byte	0x1
+	.2byte	0x1b1
+	.4byte	0xa3
+	.4byte	.LLST42
+	.uleb128 0x44
+	.4byte	.LASF375
+	.byte	0x1
+	.2byte	0x1b3
+	.4byte	0x1844
+	.4byte	.LLST43
+	.uleb128 0x45
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1b4
+	.4byte	0x54
+	.4byte	.LLST44
+	.uleb128 0x46
+	.4byte	0x1976
+	.8byte	.LBB98
+	.4byte	.Ldebug_ranges0+0x160
+	.byte	0x1
+	.2byte	0x1b8
+	.uleb128 0x36
+	.4byte	0x19aa
+	.4byte	.LLST45
+	.uleb128 0x36
+	.4byte	0x199e
+	.4byte	.LLST46
+	.uleb128 0x36
+	.4byte	0x1993
+	.4byte	.LLST47
+	.uleb128 0x36
+	.4byte	0x1987
+	.4byte	.LLST48
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0x160
+	.uleb128 0x38
+	.4byte	0x19b6
+	.uleb128 0x38
+	.4byte	0x19c2
+	.uleb128 0x35
+	.4byte	0x19ce
+	.4byte	.LLST49
+	.uleb128 0x35
+	.4byte	0x19da
+	.4byte	.LLST50
+	.uleb128 0x32
+	.4byte	0x1ef0
+	.8byte	.LBB100
+	.4byte	.Ldebug_ranges0+0x190
+	.byte	0x1
+	.2byte	0x179
+	.4byte	0x1827
+	.uleb128 0x47
+	.4byte	0x1f00
+	.byte	0
+	.uleb128 0x2f
+	.8byte	.LVL108
+	.4byte	0x2014
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x87
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x120e
+	.uleb128 0x31
+	.4byte	.LASF386
+	.byte	0x1
+	.2byte	0x1a3
+	.8byte	.LFB234
+	.8byte	.LFE234-.LFB234
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1976
+	.uleb128 0x2e
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x1a3
+	.4byte	0xa3
+	.4byte	.LLST31
+	.uleb128 0x2e
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x1a3
+	.4byte	0xa3
+	.4byte	.LLST32
+	.uleb128 0x44
+	.4byte	.LASF375
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0x1844
+	.4byte	.LLST33
+	.uleb128 0x45
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1a6
+	.4byte	0x54
+	.4byte	.LLST34
+	.uleb128 0x32
+	.4byte	0x1ef0
+	.8byte	.LBB86
+	.4byte	.Ldebug_ranges0+0x130
+	.byte	0x1
+	.2byte	0x1a8
+	.4byte	0x18c8
+	.uleb128 0x36
+	.4byte	0x1f00
+	.4byte	.LLST35
+	.byte	0
+	.uleb128 0x48
+	.4byte	0x1976
+	.8byte	.LBB90
+	.8byte	.LBE90-.LBB90
+	.byte	0x1
+	.2byte	0x1ad
+	.uleb128 0x36
+	.4byte	0x19aa
+	.4byte	.LLST36
+	.uleb128 0x36
+	.4byte	0x199e
+	.4byte	.LLST37
+	.uleb128 0x36
+	.4byte	0x1993
+	.4byte	.LLST38
+	.uleb128 0x36
+	.4byte	0x1987
+	.4byte	.LLST39
+	.uleb128 0x49
+	.8byte	.LBB91
+	.8byte	.LBE91-.LBB91
+	.uleb128 0x38
+	.4byte	0x19b6
+	.uleb128 0x38
+	.4byte	0x19c2
+	.uleb128 0x35
+	.4byte	0x19ce
+	.4byte	.LLST40
+	.uleb128 0x35
+	.4byte	0x19da
+	.4byte	.LLST41
+	.uleb128 0x3b
+	.4byte	0x1ef0
+	.8byte	.LBB92
+	.8byte	.LBE92-.LBB92
+	.byte	0x1
+	.2byte	0x179
+	.4byte	0x1953
+	.uleb128 0x47
+	.4byte	0x1f00
+	.byte	0
+	.uleb128 0x2f
+	.8byte	.LVL97
+	.4byte	0x2014
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x87
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF391
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x19e7
+	.uleb128 0x4b
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xa3
+	.uleb128 0x4b
+	.string	"id"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0x94
+	.uleb128 0x4b
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xa3
+	.uleb128 0x4c
+	.4byte	.LASF372
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xa3
+	.uleb128 0x3f
+	.4byte	.LASF387
+	.byte	0x1
+	.2byte	0x174
+	.4byte	0x8d
+	.uleb128 0x3f
+	.4byte	.LASF388
+	.byte	0x1
+	.2byte	0x175
+	.4byte	0x54
+	.uleb128 0x40
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x176
+	.4byte	0x54
+	.uleb128 0x40
+	.string	"run"
+	.byte	0x1
+	.2byte	0x177
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x2d
+	.4byte	.LASF390
+	.byte	0x1
+	.2byte	0x16d
+	.4byte	0x54
+	.8byte	.LFB232
+	.8byte	.LFE232-.LFB232
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1aca
+	.uleb128 0x2e
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x16d
+	.4byte	0xa3
+	.4byte	.LLST28
+	.uleb128 0x46
+	.4byte	0x1aca
+	.8byte	.LBB74
+	.4byte	.Ldebug_ranges0+0x100
+	.byte	0x1
+	.2byte	0x16f
+	.uleb128 0x4d
+	.4byte	0x1ae7
+	.byte	0
+	.uleb128 0x36
+	.4byte	0x1adb
+	.4byte	.LLST29
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0x100
+	.uleb128 0x38
+	.4byte	0x1af3
+	.uleb128 0x3b
+	.4byte	0x1fd7
+	.8byte	.LBB76
+	.8byte	.LBE76-.LBB76
+	.byte	0x1
+	.2byte	0x164
+	.4byte	0x1a9a
+	.uleb128 0x36
+	.4byte	0x1fe3
+	.4byte	.LLST30
+	.uleb128 0x39
+	.8byte	.LVL84
+	.4byte	0x2300
+	.4byte	0x1a84
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x3e8
+	.byte	0
+	.uleb128 0x2f
+	.8byte	.LVL85
+	.4byte	0x2300
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xa
+	.2byte	0x3e8
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL82
+	.4byte	0x1ccc
+	.4byte	0x1ab2
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3c
+	.8byte	.LVL87
+	.4byte	0x1ccc
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF392
+	.byte	0x1
+	.2byte	0x15f
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1afe
+	.uleb128 0x4b
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x15f
+	.4byte	0xa3
+	.uleb128 0x4c
+	.4byte	.LASF393
+	.byte	0x1
+	.2byte	0x15f
+	.4byte	0xa3
+	.uleb128 0x40
+	.string	"i"
+	.byte	0x1
+	.2byte	0x161
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF394
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1b6d
+	.uleb128 0x4b
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xa3
+	.uleb128 0x4b
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xa3
+	.uleb128 0x4c
+	.4byte	.LASF372
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xa3
+	.uleb128 0x3f
+	.4byte	.LASF388
+	.byte	0x1
+	.2byte	0x13a
+	.4byte	0x54
+	.uleb128 0x40
+	.string	"us"
+	.byte	0x1
+	.2byte	0x13b
+	.4byte	0x54
+	.uleb128 0x40
+	.string	"i"
+	.byte	0x1
+	.2byte	0x13c
+	.4byte	0x54
+	.uleb128 0x3f
+	.4byte	.LASF395
+	.byte	0x1
+	.2byte	0x13c
+	.4byte	0x54
+	.uleb128 0x3f
+	.4byte	.LASF396
+	.byte	0x1
+	.2byte	0x13d
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF397
+	.byte	0x1
+	.2byte	0x121
+	.8byte	.LFB229
+	.8byte	.LFE229-.LFB229
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1ccc
+	.uleb128 0x44
+	.4byte	.LASF375
+	.byte	0x1
+	.2byte	0x123
+	.4byte	0x1844
+	.4byte	.LLST8
+	.uleb128 0x45
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0x54
+	.4byte	.LLST9
+	.uleb128 0x45
+	.string	"i"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0x54
+	.4byte	.LLST10
+	.uleb128 0x39
+	.8byte	.LVL24
+	.4byte	0x22de
+	.4byte	0x1bd8
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC1
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL27
+	.4byte	0x22de
+	.4byte	0x1bf6
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL28
+	.4byte	0x22de
+	.4byte	0x1c15
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC3
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL29
+	.4byte	0x22de
+	.4byte	0x1c34
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC4
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL30
+	.4byte	0x22de
+	.4byte	0x1c53
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC5
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL31
+	.4byte	0x22de
+	.4byte	0x1c72
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC6
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL32
+	.4byte	0x22de
+	.4byte	0x1c91
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC7
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL33
+	.4byte	0x22de
+	.4byte	0x1cb0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC8
+	.byte	0
+	.uleb128 0x2f
+	.8byte	.LVL34
+	.4byte	0x22de
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC9
+	.byte	0
+	.byte	0
+	.uleb128 0x2d
+	.4byte	.LASF398
+	.byte	0x1
+	.2byte	0x104
+	.4byte	0x54
+	.8byte	.LFB228
+	.8byte	.LFE228-.LFB228
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1d65
+	.uleb128 0x2e
+	.string	"tid"
+	.byte	0x1
+	.2byte	0x104
+	.4byte	0xa3
+	.4byte	.LLST5
+	.uleb128 0x40
+	.string	"cid"
+	.byte	0x1
+	.2byte	0x106
+	.4byte	0x54
+	.uleb128 0x45
+	.string	"i"
+	.byte	0x1
+	.2byte	0x106
+	.4byte	0x54
+	.4byte	.LLST6
+	.uleb128 0x45
+	.string	"ptr"
+	.byte	0x1
+	.2byte	0x107
+	.4byte	0x1d65
+	.4byte	.LLST7
+	.uleb128 0x3b
+	.4byte	0x1ef0
+	.8byte	.LBB36
+	.8byte	.LBE36-.LBB36
+	.byte	0x1
+	.2byte	0x109
+	.4byte	0x1d4a
+	.uleb128 0x47
+	.4byte	0x1f00
+	.byte	0
+	.uleb128 0x2f
+	.8byte	.LVL21
+	.4byte	0x2353
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xa3
+	.uleb128 0x4e
+	.4byte	.LASF431
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0x54
+	.8byte	.LFB227
+	.8byte	.LFE227-.LFB227
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1e38
+	.uleb128 0x4f
+	.string	"cid"
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0xa3
+	.4byte	.LLST0
+	.uleb128 0x4f
+	.string	"tid"
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0xa3
+	.4byte	.LLST1
+	.uleb128 0x4f
+	.string	"st"
+	.byte	0x1
+	.byte	0xe2
+	.4byte	0xa3
+	.4byte	.LLST2
+	.uleb128 0x50
+	.4byte	.LASF31
+	.byte	0x1
+	.byte	0xe4
+	.4byte	0xef
+	.uleb128 0x2c
+	.string	"ptr"
+	.byte	0x1
+	.byte	0xe5
+	.4byte	0x1d65
+	.uleb128 0x2c
+	.string	"id"
+	.byte	0x1
+	.byte	0xe6
+	.4byte	0x54
+	.uleb128 0x51
+	.4byte	0x1ef0
+	.8byte	.LBB30
+	.8byte	.LBE30-.LBB30
+	.byte	0x1
+	.byte	0xe8
+	.4byte	0x1df9
+	.uleb128 0x47
+	.4byte	0x1f00
+	.byte	0
+	.uleb128 0x52
+	.4byte	0x1e85
+	.8byte	.LBB32
+	.4byte	.Ldebug_ranges0+0
+	.byte	0x1
+	.byte	0xeb
+	.4byte	0x1e2a
+	.uleb128 0x47
+	.4byte	0x1ea0
+	.uleb128 0x47
+	.4byte	0x1e95
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0
+	.uleb128 0x35
+	.4byte	0x1eab
+	.4byte	.LLST3
+	.byte	0
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL8
+	.4byte	0x235f
+	.byte	0
+	.uleb128 0x53
+	.4byte	.LASF399
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1e7f
+	.uleb128 0x54
+	.string	"cid"
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0xa3
+	.uleb128 0x54
+	.string	"tid"
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0xa3
+	.uleb128 0x54
+	.string	"ret"
+	.byte	0x1
+	.byte	0xcf
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"ptr"
+	.byte	0x1
+	.byte	0xd1
+	.4byte	0x1e7f
+	.uleb128 0x2c
+	.string	"id"
+	.byte	0x1
+	.byte	0xd2
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x54
+	.uleb128 0x53
+	.4byte	.LASF400
+	.byte	0x1
+	.byte	0xc3
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1eb5
+	.uleb128 0x54
+	.string	"cid"
+	.byte	0x1
+	.byte	0xc3
+	.4byte	0xa3
+	.uleb128 0x54
+	.string	"tid"
+	.byte	0x1
+	.byte	0xc3
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"i"
+	.byte	0x1
+	.byte	0xc5
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x53
+	.4byte	.LASF401
+	.byte	0x1
+	.byte	0x9d
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1ef0
+	.uleb128 0x55
+	.4byte	.LASF383
+	.byte	0x1
+	.byte	0x9d
+	.4byte	0x130d
+	.uleb128 0x2c
+	.string	"cid"
+	.byte	0x1
+	.byte	0x9f
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"tid"
+	.byte	0x1
+	.byte	0xa0
+	.4byte	0xa3
+	.uleb128 0x2c
+	.string	"i"
+	.byte	0x1
+	.byte	0xa1
+	.4byte	0x94
+	.byte	0
+	.uleb128 0x53
+	.4byte	.LASF402
+	.byte	0x1
+	.byte	0x90
+	.4byte	0x54
+	.byte	0x3
+	.4byte	0x1f0c
+	.uleb128 0x54
+	.string	"tid"
+	.byte	0x1
+	.byte	0x90
+	.4byte	0xa3
+	.byte	0
+	.uleb128 0x56
+	.4byte	.LASF411
+	.byte	0x1
+	.byte	0x86
+	.byte	0x3
+	.uleb128 0x57
+	.4byte	.LASF404
+	.byte	0x1
+	.byte	0x81
+	.byte	0x3
+	.4byte	0x1f2c
+	.uleb128 0x54
+	.string	"ptr"
+	.byte	0x1
+	.byte	0x81
+	.4byte	0x10b
+	.byte	0
+	.uleb128 0x58
+	.4byte	.LASF432
+	.byte	0x1
+	.byte	0x34
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x1f48
+	.uleb128 0x55
+	.4byte	.LASF405
+	.byte	0x1
+	.byte	0x34
+	.4byte	0x1208
+	.byte	0
+	.uleb128 0x59
+	.4byte	.LASF406
+	.byte	0x1
+	.byte	0x33
+	.4byte	0x54
+	.4byte	0x1f63
+	.uleb128 0x55
+	.4byte	.LASF405
+	.byte	0x1
+	.byte	0x33
+	.4byte	0x1208
+	.byte	0
+	.uleb128 0x59
+	.4byte	.LASF407
+	.byte	0x1
+	.byte	0x32
+	.4byte	0x54
+	.4byte	0x1f7e
+	.uleb128 0x55
+	.4byte	.LASF405
+	.byte	0x1
+	.byte	0x32
+	.4byte	0x1208
+	.byte	0
+	.uleb128 0x59
+	.4byte	.LASF408
+	.byte	0x1
+	.byte	0x31
+	.4byte	0x54
+	.4byte	0x1f99
+	.uleb128 0x55
+	.4byte	.LASF405
+	.byte	0x1
+	.byte	0x31
+	.4byte	0x1208
+	.byte	0
+	.uleb128 0x59
+	.4byte	.LASF409
+	.byte	0x1
+	.byte	0x30
+	.4byte	0x54
+	.4byte	0x1fb4
+	.uleb128 0x55
+	.4byte	.LASF405
+	.byte	0x1
+	.byte	0x30
+	.4byte	0x1208
+	.byte	0
+	.uleb128 0x59
+	.4byte	.LASF410
+	.byte	0x1
+	.byte	0x2f
+	.4byte	0x54
+	.4byte	0x1fcf
+	.uleb128 0x55
+	.4byte	.LASF405
+	.byte	0x1
+	.byte	0x2f
+	.4byte	0x1208
+	.byte	0
+	.uleb128 0x56
+	.4byte	.LASF412
+	.byte	0x3
+	.byte	0xbf
+	.byte	0x3
+	.uleb128 0x57
+	.4byte	.LASF413
+	.byte	0x2
+	.byte	0xd
+	.byte	0x3
+	.4byte	0x1fef
+	.uleb128 0x55
+	.4byte	.LASF414
+	.byte	0x2
+	.byte	0xd
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x1f2c
+	.8byte	.LFB220
+	.8byte	.LFE220-.LFB220
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x2014
+	.uleb128 0x36
+	.4byte	0x1f3c
+	.4byte	.LLST4
+	.byte	0
+	.uleb128 0x5b
+	.4byte	0x1976
+	.8byte	.LFB242
+	.8byte	.LFE242-.LFB242
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x22d5
+	.uleb128 0x36
+	.4byte	0x1987
+	.4byte	.LLST11
+	.uleb128 0x36
+	.4byte	0x1993
+	.4byte	.LLST12
+	.uleb128 0x36
+	.4byte	0x199e
+	.4byte	.LLST13
+	.uleb128 0x36
+	.4byte	0x19aa
+	.4byte	.LLST14
+	.uleb128 0x35
+	.4byte	0x19b6
+	.4byte	.LLST15
+	.uleb128 0x38
+	.4byte	0x19c2
+	.uleb128 0x35
+	.4byte	0x19ce
+	.4byte	.LLST16
+	.uleb128 0x35
+	.4byte	0x19da
+	.4byte	.LLST17
+	.uleb128 0x32
+	.4byte	0x1afe
+	.8byte	.LBB48
+	.4byte	.Ldebug_ranges0+0x30
+	.byte	0x1
+	.2byte	0x17f
+	.4byte	0x2128
+	.uleb128 0x36
+	.4byte	0x1b0f
+	.4byte	.LLST18
+	.uleb128 0x36
+	.4byte	0x1b1b
+	.4byte	.LLST19
+	.uleb128 0x36
+	.4byte	0x1b27
+	.4byte	.LLST20
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0x30
+	.uleb128 0x35
+	.4byte	0x1b33
+	.4byte	.LLST21
+	.uleb128 0x5c
+	.4byte	0x1b3f
+	.byte	0x64
+	.uleb128 0x38
+	.4byte	0x1b4a
+	.uleb128 0x35
+	.4byte	0x1b54
+	.4byte	.LLST22
+	.uleb128 0x35
+	.4byte	0x1b60
+	.4byte	.LLST23
+	.uleb128 0x39
+	.8byte	.LVL41
+	.4byte	0x1ccc
+	.4byte	0x20e9
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL42
+	.4byte	0x1ccc
+	.4byte	0x2101
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL51
+	.4byte	0x2300
+	.4byte	0x2119
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x64
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL54
+	.4byte	0x1b6d
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.4byte	0x1e38
+	.8byte	.LBB52
+	.4byte	.Ldebug_ranges0+0x60
+	.byte	0x1
+	.2byte	0x19e
+	.4byte	0x21cb
+	.uleb128 0x36
+	.4byte	0x1e5e
+	.4byte	.LLST24
+	.uleb128 0x36
+	.4byte	0x1e53
+	.4byte	.LLST25
+	.uleb128 0x36
+	.4byte	0x1e48
+	.4byte	.LLST26
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0x60
+	.uleb128 0x38
+	.4byte	0x1e69
+	.uleb128 0x38
+	.4byte	0x1e74
+	.uleb128 0x51
+	.4byte	0x1ef0
+	.8byte	.LBB54
+	.8byte	.LBE54-.LBB54
+	.byte	0x1
+	.byte	0xd4
+	.4byte	0x218b
+	.uleb128 0x47
+	.4byte	0x1f00
+	.byte	0
+	.uleb128 0x52
+	.4byte	0x1e85
+	.8byte	.LBB56
+	.4byte	.Ldebug_ranges0+0xd0
+	.byte	0x1
+	.byte	0xd7
+	.4byte	0x21bc
+	.uleb128 0x47
+	.4byte	0x1ea0
+	.uleb128 0x47
+	.4byte	0x1e95
+	.uleb128 0x33
+	.4byte	.Ldebug_ranges0+0xd0
+	.uleb128 0x35
+	.4byte	0x1eab
+	.4byte	.LLST27
+	.byte	0
+	.byte	0
+	.uleb128 0x5d
+	.8byte	.LVL79
+	.4byte	0x235f
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL48
+	.4byte	0x22de
+	.4byte	0x21f6
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC11
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL49
+	.4byte	0x1d6b
+	.4byte	0x221d
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x5
+	.byte	0xc
+	.4byte	0x55555555
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL57
+	.4byte	0x22de
+	.4byte	0x2248
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC12
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL58
+	.4byte	0x236b
+	.uleb128 0x39
+	.8byte	.LVL61
+	.4byte	0x1d6b
+	.4byte	0x227c
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x5
+	.byte	0xc
+	.4byte	0x11111111
+	.byte	0
+	.uleb128 0x39
+	.8byte	.LVL65
+	.4byte	0x1d6b
+	.4byte	0x229a
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3a
+	.8byte	.LVL66
+	.4byte	0x236b
+	.uleb128 0x2f
+	.8byte	.LVL68
+	.4byte	0x22de
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC10
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x30
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.4byte	.LASF433
+	.4byte	.LASF433
+	.uleb128 0x5f
+	.4byte	.LASF415
+	.4byte	.LASF415
+	.byte	0x1d
+	.byte	0x13
+	.uleb128 0x5f
+	.4byte	.LASF416
+	.4byte	.LASF416
+	.byte	0x8
+	.byte	0x66
+	.uleb128 0x60
+	.4byte	.LASF417
+	.4byte	.LASF417
+	.byte	0x4
+	.2byte	0x260
+	.uleb128 0x5f
+	.4byte	.LASF418
+	.4byte	.LASF418
+	.byte	0x2
+	.byte	0xb
+	.uleb128 0x60
+	.4byte	.LASF419
+	.4byte	.LASF419
+	.byte	0x4
+	.2byte	0x1f3
+	.uleb128 0x60
+	.4byte	.LASF420
+	.4byte	.LASF420
+	.byte	0x4
+	.2byte	0x248
+	.uleb128 0x60
+	.4byte	.LASF421
+	.4byte	.LASF421
+	.byte	0x4
+	.2byte	0x1f1
+	.uleb128 0x60
+	.4byte	.LASF422
+	.4byte	.LASF422
+	.byte	0x4
+	.2byte	0x264
+	.uleb128 0x60
+	.4byte	.LASF423
+	.4byte	.LASF423
+	.byte	0x4
+	.2byte	0x1f4
+	.uleb128 0x60
+	.4byte	.LASF424
+	.4byte	.LASF424
+	.byte	0x4
+	.2byte	0x263
+	.uleb128 0x60
+	.4byte	.LASF425
+	.4byte	.LASF425
+	.byte	0x4
+	.2byte	0x262
+	.uleb128 0x60
+	.4byte	.LASF426
+	.4byte	.LASF426
+	.byte	0x4
+	.2byte	0x261
+	.uleb128 0x60
+	.4byte	.LASF427
+	.4byte	.LASF427
+	.byte	0x4
+	.2byte	0x276
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x26
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0x35
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0x1
+	.byte	0x1
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xc
+	.uleb128 0x21
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0xe
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0xf
+	.uleb128 0x26
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x10
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x12
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x13
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x14
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x15
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x16
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x17
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x18
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1a
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x1b
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x1d
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1e
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1f
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x20
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x21
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x22
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x23
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x24
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x25
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x26
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x27
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x28
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x29
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x2b
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x2c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2d
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2e
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2f
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x30
+	.uleb128 0x410a
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x18
+	.uleb128 0x2111
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x33
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x34
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x36
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x37
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x38
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3a
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3c
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3d
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x3e
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x40
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x41
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x42
+	.uleb128 0xb
+	.byte	0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x43
+	.uleb128 0x1d
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x44
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x47
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x48
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4d
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x4e
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4f
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x52
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x55
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x56
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x57
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5b
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2116
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x5d
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x60
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST61:
+	.8byte	.LVL151
+	.8byte	.LVL152
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL152
+	.8byte	.LVL154
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL154
+	.8byte	.LVL155
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL155
+	.8byte	.LFE240
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST53:
+	.8byte	.LVL126
+	.8byte	.LVL127
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL127
+	.8byte	.LVL143
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL143
+	.8byte	.LVL144
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL144
+	.8byte	.LVL148
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL148
+	.8byte	.LVL149
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL149
+	.8byte	.LFE239
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST54:
+	.8byte	.LVL131
+	.8byte	.LVL132
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST55:
+	.8byte	.LVL136
+	.8byte	.LVL137
+	.2byte	0x7
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x53
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x93
+	.uleb128 0x10
+	.8byte	.LVL137
+	.8byte	.LVL141
+	.2byte	0xe
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x53
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5d
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5c
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5b
+	.byte	0x93
+	.uleb128 0x4
+	.8byte	.LVL141
+	.8byte	.LVL142
+	.2byte	0xf
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x71
+	.sleb128 20
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5d
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5c
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5b
+	.byte	0x93
+	.uleb128 0x4
+	.8byte	.LVL142
+	.8byte	.LVL143
+	.2byte	0xb
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5d
+	.byte	0x93
+	.uleb128 0x8
+	.byte	0x5c
+	.byte	0x93
+	.uleb128 0x4
+	.byte	0x5b
+	.byte	0x93
+	.uleb128 0x4
+	.8byte	0
+	.8byte	0
+.LLST56:
+	.8byte	.LVL137
+	.8byte	.LVL139
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL139
+	.8byte	.LVL140
+	.2byte	0x2
+	.byte	0x70
+	.sleb128 0
+	.8byte	0
+	.8byte	0
+.LLST57:
+	.8byte	.LVL137
+	.8byte	.LVL141
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL141
+	.8byte	.LVL142
+	.2byte	0x2
+	.byte	0x71
+	.sleb128 20
+	.8byte	0
+	.8byte	0
+.LLST58:
+	.8byte	.LVL138
+	.8byte	.LVL139
+	.2byte	0x11
+	.byte	0x71
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200148
+	.8byte	.LVL139
+	.8byte	.LVL140
+	.2byte	0x13
+	.byte	0x70
+	.sleb128 0
+	.byte	0x94
+	.byte	0x4
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200148
+	.8byte	0
+	.8byte	0
+.LLST59:
+	.8byte	.LVL134
+	.8byte	.LVL135
+	.2byte	0x6
+	.byte	0x9e
+	.uleb128 0x4
+	.4byte	0xdeadbeaf
+	.8byte	0
+	.8byte	0
+.LLST60:
+	.8byte	.LVL147
+	.8byte	.LVL148
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST51:
+	.8byte	.LVL110
+	.8byte	.LVL111
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL111
+	.8byte	.LFE236
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST52:
+	.8byte	.LVL112
+	.8byte	.LVL113
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL99
+	.8byte	.LVL100
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL100
+	.8byte	.LVL102
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL102
+	.8byte	.LVL105
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL105
+	.8byte	.LFE235
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL101
+	.8byte	.LVL102
+	.2byte	0x12
+	.byte	0x86
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL102
+	.8byte	.LVL105
+	.2byte	0x12
+	.byte	0x87
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL105
+	.8byte	.LVL106
+	.2byte	0x13
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL106
+	.8byte	.LFE235
+	.2byte	0x12
+	.byte	0x87
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST44:
+	.8byte	.LVL101
+	.8byte	.LVL103
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL103
+	.8byte	.LVL104
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL106
+	.8byte	.LFE235
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST45:
+	.8byte	.LVL107
+	.8byte	.LVL108-1
+	.2byte	0x2
+	.byte	0x83
+	.sleb128 16
+	.8byte	0
+	.8byte	0
+.LLST46:
+	.8byte	.LVL107
+	.8byte	.LVL108-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST47:
+	.8byte	.LVL107
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST48:
+	.8byte	.LVL107
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST49:
+	.8byte	.LVL107
+	.8byte	.LVL108
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST50:
+	.8byte	.LVL107
+	.8byte	.LVL108
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST31:
+	.8byte	.LVL88
+	.8byte	.LVL91
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL91
+	.8byte	.LVL92
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL92
+	.8byte	.LVL94
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL94
+	.8byte	.LFE234
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST32:
+	.8byte	.LVL88
+	.8byte	.LVL93
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL93
+	.8byte	.LVL94
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL94
+	.8byte	.LVL95
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL95
+	.8byte	.LFE234
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST33:
+	.8byte	.LVL88
+	.8byte	.LVL90
+	.2byte	0x12
+	.byte	0x70
+	.sleb128 0
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL90
+	.8byte	.LVL92
+	.2byte	0xc
+	.byte	0x89
+	.sleb128 0
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL92
+	.8byte	.LVL94
+	.2byte	0xc
+	.byte	0x86
+	.sleb128 0
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL94
+	.8byte	.LVL95
+	.2byte	0x13
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0xc
+	.4byte	0xffffffff
+	.byte	0x1a
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL95
+	.8byte	.LFE234
+	.2byte	0xc
+	.byte	0x86
+	.sleb128 0
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST34:
+	.8byte	.LVL93
+	.8byte	.LVL94
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL95
+	.8byte	.LFE234
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST35:
+	.8byte	.LVL88
+	.8byte	.LVL89
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST36:
+	.8byte	.LVL96
+	.8byte	.LVL97-1
+	.2byte	0x2
+	.byte	0x83
+	.sleb128 16
+	.8byte	0
+	.8byte	0
+.LLST37:
+	.8byte	.LVL96
+	.8byte	.LVL97
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL96
+	.8byte	.LVL97
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST39:
+	.8byte	.LVL96
+	.8byte	.LVL97
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST40:
+	.8byte	.LVL96
+	.8byte	.LVL97
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST41:
+	.8byte	.LVL96
+	.8byte	.LVL97
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST28:
+	.8byte	.LVL80
+	.8byte	.LVL81
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL81
+	.8byte	.LVL86
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL86
+	.8byte	.LVL87-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL87-1
+	.8byte	.LFE232
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST29:
+	.8byte	.LVL81
+	.8byte	.LVL86
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL86
+	.8byte	.LVL87-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL87-1
+	.8byte	.LFE232
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST30:
+	.8byte	.LVL83
+	.8byte	.LVL84
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	.LVL84
+	.8byte	.LVL85
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST8:
+	.8byte	.LVL25
+	.8byte	.LVL26
+	.2byte	0x1e
+	.byte	0x86
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0x8
+	.byte	0x28
+	.byte	0x1e
+	.byte	0x85
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	.LVL26
+	.8byte	.LVL34
+	.2byte	0x1e
+	.byte	0x86
+	.sleb128 -1
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0x8
+	.byte	0x28
+	.byte	0x1e
+	.byte	0x85
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0xa
+	.2byte	0x148
+	.byte	0x1e
+	.byte	0x22
+	.byte	0x23
+	.uleb128 0x8200008
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST9:
+	.8byte	.LVL24
+	.8byte	.LVL36
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST10:
+	.8byte	.LVL25
+	.8byte	.LVL26
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL26
+	.8byte	.LVL34
+	.2byte	0x3
+	.byte	0x86
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL34
+	.8byte	.LVL36
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST5:
+	.8byte	.LVL11
+	.8byte	.LVL12
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL12
+	.8byte	.LVL17
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL17
+	.8byte	.LVL19
+	.2byte	0x5
+	.byte	0x8b
+	.sleb128 65536
+	.byte	0x9f
+	.8byte	.LVL19
+	.8byte	.LVL20
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL20
+	.8byte	.LVL22
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL22
+	.8byte	.LVL23
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL23
+	.8byte	.LFE228
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL13
+	.8byte	.LVL18
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL20
+	.8byte	.LVL22
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST7:
+	.8byte	.LVL20
+	.8byte	.LVL22
+	.2byte	0x3
+	.byte	0x84
+	.sleb128 -4
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST0:
+	.8byte	.LVL0
+	.8byte	.LVL1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1
+	.8byte	.LVL3
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL3
+	.8byte	.LFE227
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST1:
+	.8byte	.LVL0
+	.8byte	.LVL7
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL7
+	.8byte	.LFE227
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST2:
+	.8byte	.LVL0
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL8-1
+	.8byte	.LFE227
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST3:
+	.8byte	.LVL2
+	.8byte	.LVL3
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL4
+	.8byte	.LVL6
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST4:
+	.8byte	.LVL9
+	.8byte	.LVL10
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL10
+	.8byte	.LFE220
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST11:
+	.8byte	.LVL37
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL39
+	.8byte	.LVL69
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL69
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL71
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST12:
+	.8byte	.LVL37
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL39
+	.8byte	.LVL67
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL67
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST13:
+	.8byte	.LVL37
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL39
+	.8byte	.LVL72
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL72
+	.8byte	.LVL74
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL74
+	.8byte	.LVL77
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL77
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST14:
+	.8byte	.LVL37
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL39
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL47
+	.8byte	.LVL50
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL50
+	.8byte	.LVL55
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL55
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST15:
+	.8byte	.LVL59
+	.8byte	.LVL60
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL60
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST16:
+	.8byte	.LVL63
+	.8byte	.LVL64
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL64
+	.8byte	.LVL73
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL74
+	.8byte	.LVL78
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL78
+	.8byte	.LVL79-1
+	.2byte	0x2
+	.byte	0x72
+	.sleb128 32
+	.8byte	0
+	.8byte	0
+.LLST17:
+	.8byte	.LVL46
+	.8byte	.LVL50
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL56
+	.8byte	.LVL68
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST18:
+	.8byte	.LVL38
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL39
+	.8byte	.LVL69
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL69
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL71
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL38
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL39
+	.8byte	.LVL72
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL72
+	.8byte	.LVL74
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL74
+	.8byte	.LVL77
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL77
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST20:
+	.8byte	.LVL38
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL39
+	.8byte	.LVL45
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL50
+	.8byte	.LVL55
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST21:
+	.8byte	.LVL38
+	.8byte	.LVL39
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL39
+	.8byte	.LVL45
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL50
+	.8byte	.LVL55
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST22:
+	.8byte	.LVL39
+	.8byte	.LVL45
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL50
+	.8byte	.LVL55
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST23:
+	.8byte	.LVL40
+	.8byte	.LVL43
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e20
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL50
+	.8byte	.LVL51
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e20
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL51
+	.8byte	.LVL52
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e21
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL52
+	.8byte	.LVL53
+	.2byte	0x7
+	.byte	0xa
+	.2byte	0x4e20
+	.byte	0x88
+	.sleb128 0
+	.byte	0x1c
+	.byte	0x9f
+	.8byte	.LVL53
+	.8byte	.LVL55
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST24:
+	.8byte	.LVL68
+	.8byte	.LVL73
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL74
+	.8byte	.LVL78
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL78
+	.8byte	.LVL79-1
+	.2byte	0x2
+	.byte	0x72
+	.sleb128 32
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL68
+	.8byte	.LVL72
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL72
+	.8byte	.LVL74
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL74
+	.8byte	.LVL77
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL77
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST26:
+	.8byte	.LVL68
+	.8byte	.LVL69
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL69
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL71
+	.8byte	.LFE242
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL70
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL74
+	.8byte	.LVL76
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+	.section	.debug_aranges,"",@progbits
+	.4byte	0xdc
+	.2byte	0x2
+	.4byte	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.2byte	0
+	.2byte	0
+	.8byte	.LFB227
+	.8byte	.LFE227-.LFB227
+	.8byte	.LFB220
+	.8byte	.LFE220-.LFB220
+	.8byte	.LFB228
+	.8byte	.LFE228-.LFB228
+	.8byte	.LFB229
+	.8byte	.LFE229-.LFB229
+	.8byte	.LFB242
+	.8byte	.LFE242-.LFB242
+	.8byte	.LFB232
+	.8byte	.LFE232-.LFB232
+	.8byte	.LFB234
+	.8byte	.LFE234-.LFB234
+	.8byte	.LFB235
+	.8byte	.LFE235-.LFB235
+	.8byte	.LFB236
+	.8byte	.LFE236-.LFB236
+	.8byte	.LFB238
+	.8byte	.LFE238-.LFB238
+	.8byte	.LFB239
+	.8byte	.LFE239-.LFB239
+	.8byte	.LFB240
+	.8byte	.LFE240-.LFB240
+	.8byte	0
+	.8byte	0
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.8byte	.LBB32
+	.8byte	.LBE32
+	.8byte	.LBB35
+	.8byte	.LBE35
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB48
+	.8byte	.LBE48
+	.8byte	.LBB51
+	.8byte	.LBE51
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB52
+	.8byte	.LBE52
+	.8byte	.LBB65
+	.8byte	.LBE65
+	.8byte	.LBB66
+	.8byte	.LBE66
+	.8byte	.LBB67
+	.8byte	.LBE67
+	.8byte	.LBB68
+	.8byte	.LBE68
+	.8byte	.LBB69
+	.8byte	.LBE69
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB56
+	.8byte	.LBE56
+	.8byte	.LBB59
+	.8byte	.LBE59
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB74
+	.8byte	.LBE74
+	.8byte	.LBB79
+	.8byte	.LBE79
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB86
+	.8byte	.LBE86
+	.8byte	.LBB89
+	.8byte	.LBE89
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB98
+	.8byte	.LBE98
+	.8byte	.LBB105
+	.8byte	.LBE105
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB100
+	.8byte	.LBE100
+	.8byte	.LBB103
+	.8byte	.LBE103
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB120
+	.8byte	.LBE120
+	.8byte	.LBB131
+	.8byte	.LBE131
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB122
+	.8byte	.LBE122
+	.8byte	.LBB126
+	.8byte	.LBE126
+	.8byte	.LBB129
+	.8byte	.LBE129
+	.8byte	0
+	.8byte	0
+	.8byte	.LFB227
+	.8byte	.LFE227
+	.8byte	.LFB220
+	.8byte	.LFE220
+	.8byte	.LFB228
+	.8byte	.LFE228
+	.8byte	.LFB229
+	.8byte	.LFE229
+	.8byte	.LFB242
+	.8byte	.LFE242
+	.8byte	.LFB232
+	.8byte	.LFE232
+	.8byte	.LFB234
+	.8byte	.LFE234
+	.8byte	.LFB235
+	.8byte	.LFE235
+	.8byte	.LFB236
+	.8byte	.LFE236
+	.8byte	.LFB238
+	.8byte	.LFE238
+	.8byte	.LFB239
+	.8byte	.LFE239
+	.8byte	.LFB240
+	.8byte	.LFE240
+	.8byte	0
+	.8byte	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF83:
+	.string	"off_mem_rsvmap"
+.LASF166:
+	.string	"UCLASS_I2C_EEPROM"
+.LASF298:
+	.string	"jt_funcs"
+.LASF171:
+	.string	"UCLASS_IRQ"
+.LASF133:
+	.string	"initrd_start"
+.LASF165:
+	.string	"UCLASS_I2C"
+.LASF13:
+	.string	"sizetype"
+.LASF312:
+	.string	"net_hostname"
+.LASF36:
+	.string	"start"
+.LASF206:
+	.string	"UCLASS_SPI"
+.LASF169:
+	.string	"UCLASS_I2S"
+.LASF334:
+	.string	"NETLOOP_RESTART"
+.LASF167:
+	.string	"UCLASS_I2C_GENERIC"
+.LASF179:
+	.string	"UCLASS_MOD_EXP"
+.LASF230:
+	.string	"UCLASS_IO_DOMAIN"
+.LASF251:
+	.string	"using_pre_serial"
+.LASF200:
+	.string	"UCLASS_RKNAND"
+.LASF142:
+	.string	"UCLASS_DEMO"
+.LASF373:
+	.string	"rip_fail"
+.LASF91:
+	.string	"ih_magic"
+.LASF29:
+	.string	"list_head"
+.LASF292:
+	.string	"pm_ctx_phys"
+.LASF146:
+	.string	"UCLASS_TEST_PROBE"
+.LASF226:
+	.string	"UCLASS_KEY"
+.LASF64:
+	.string	"bi_intfreq"
+.LASF11:
+	.string	"phys_addr_t"
+.LASF221:
+	.string	"UCLASS_VIDEO_BRIDGE"
+.LASF291:
+	.string	"video_bottom"
+.LASF5:
+	.string	"__u8"
+.LASF377:
+	.string	"task_list"
+.LASF333:
+	.string	"NETLOOP_CONTINUE"
+.LASF209:
+	.string	"UCLASS_SPI_GENERIC"
+.LASF286:
+	.string	"malloc_base"
+.LASF369:
+	.string	"tid_name"
+.LASF40:
+	.string	"flash_info_t"
+.LASF184:
+	.string	"UCLASS_PANEL"
+.LASF108:
+	.string	"comp"
+.LASF103:
+	.string	"image_header_t"
+.LASF138:
+	.string	"state"
+.LASF412:
+	.string	"disable_serror"
+.LASF159:
+	.string	"UCLASS_CROS_EC"
+.LASF58:
+	.string	"bi_dsp_freq"
+.LASF105:
+	.string	"image_start"
+.LASF422:
+	.string	"invalidate_icache_all"
+.LASF420:
+	.string	"disable_interrupts"
+.LASF144:
+	.string	"UCLASS_TEST_FDT"
+.LASF49:
+	.string	"bd_info"
+.LASF331:
+	.string	"uclass_id"
+.LASF95:
+	.string	"ih_load"
+.LASF215:
+	.string	"UCLASS_UFS"
+.LASF302:
+	.string	"__dtb_dt_spl_begin"
+.LASF363:
+	.string	"TASK_LOAD_UBOOT"
+.LASF7:
+	.string	"__u32"
+.LASF149:
+	.string	"UCLASS_PCI_EMUL"
+.LASF430:
+	.string	"/home4/cjh/uboot-nextdev-v3"
+.LASF289:
+	.string	"cur_serial_dev"
+.LASF318:
+	.string	"net_tx_packet"
+.LASF225:
+	.string	"UCLASS_FG"
+.LASF317:
+	.string	"net_server_ip"
+.LASF325:
+	.string	"net_native_vlan"
+.LASF265:
+	.string	"ram_top_ext_size"
+.LASF223:
+	.string	"UCLASS_VIDEO_CRTC"
+.LASF158:
+	.string	"UCLASS_CODEC"
+.LASF283:
+	.string	"env_buf"
+.LASF20:
+	.string	"errno"
+.LASF15:
+	.string	"long int"
+.LASF53:
+	.string	"bi_flashsize"
+.LASF339:
+	.string	"__bss_end"
+.LASF189:
+	.string	"UCLASS_PHY"
+.LASF76:
+	.string	"IRQ_STACK_START_IN"
+.LASF87:
+	.string	"size_dt_strings"
+.LASF220:
+	.string	"UCLASS_VIDEO"
+.LASF356:
+	.string	"EVT_CRYPTO"
+.LASF266:
+	.string	"relocaddr"
+.LASF389:
+	.string	"mpb_post"
+.LASF429:
+	.string	"common/mp_boot.c"
+.LASF328:
+	.string	"net_boot_file_size"
+.LASF374:
+	.string	"cpu_core"
+.LASF97:
+	.string	"ih_dcrc"
+.LASF63:
+	.string	"bi_ethspeed"
+.LASF141:
+	.string	"UCLASS_ROOT"
+.LASF26:
+	.string	"ide_bus_offset"
+.LASF361:
+	.string	"TASK_INIT_DISPLAY"
+.LASF315:
+	.string	"net_server_ethaddr"
+.LASF66:
+	.string	"bi_arch_number"
+.LASF3:
+	.string	"signed char"
+.LASF172:
+	.string	"UCLASS_KEYBOARD"
+.LASF18:
+	.string	"uint8_t"
+.LASF38:
+	.string	"udevice"
+.LASF418:
+	.string	"udelay"
+.LASF99:
+	.string	"ih_arch"
+.LASF80:
+	.string	"totalsize"
+.LASF92:
+	.string	"ih_hcrc"
+.LASF268:
+	.string	"mon_len"
+.LASF107:
+	.string	"load"
+.LASF214:
+	.string	"UCLASS_TPM"
+.LASF43:
+	.string	"lmb_property"
+.LASF85:
+	.string	"last_comp_version"
+.LASF0:
+	.string	"unsigned char"
+.LASF140:
+	.string	"images"
+.LASF341:
+	.string	"priv"
+.LASF229:
+	.string	"UCLASS_DVFS"
+.LASF59:
+	.string	"bi_ddr_freq"
+.LASF403:
+	.string	"mpb_initial"
+.LASF173:
+	.string	"UCLASS_LED"
+.LASF94:
+	.string	"ih_size"
+.LASF419:
+	.string	"dcache_enable"
+.LASF203:
+	.string	"UCLASS_SCMI_AGENT"
+.LASF233:
+	.string	"UCLASS_MDIO"
+.LASF22:
+	.string	"_Bool"
+.LASF337:
+	.string	"net_state"
+.LASF168:
+	.string	"UCLASS_I2C_MUX"
+.LASF14:
+	.string	"char"
+.LASF24:
+	.string	"_binary_u_boot_bin_start"
+.LASF219:
+	.string	"UCLASS_USB_GADGET_GENERIC"
+.LASF335:
+	.string	"NETLOOP_SUCCESS"
+.LASF415:
+	.string	"printf"
+.LASF372:
+	.string	"ptid_mask"
+.LASF332:
+	.string	"net_loop_state"
+.LASF247:
+	.string	"tlb_size"
+.LASF274:
+	.string	"dm_root_f"
+.LASF157:
+	.string	"UCLASS_AMP"
+.LASF195:
+	.string	"UCLASS_PWRSEQ"
+.LASF123:
+	.string	"fit_hdr_fdt"
+.LASF326:
+	.string	"net_restart_wrap"
+.LASF314:
+	.string	"net_ethaddr"
+.LASF256:
+	.string	"flags"
+.LASF100:
+	.string	"ih_type"
+.LASF355:
+	.string	"EVT_BOOT_SIZE"
+.LASF81:
+	.string	"off_dt_struct"
+.LASF413:
+	.string	"mdelay"
+.LASF54:
+	.string	"bi_flashoffset"
+.LASF327:
+	.string	"net_boot_file_name"
+.LASF143:
+	.string	"UCLASS_TEST"
+.LASF397:
+	.string	"mpb_task_dump"
+.LASF93:
+	.string	"ih_time"
+.LASF258:
+	.string	"bus_clk"
+.LASF196:
+	.string	"UCLASS_RAM"
+.LASF162:
+	.string	"UCLASS_ETH"
+.LASF364:
+	.string	"TASK_LOAD_FIT"
+.LASF104:
+	.string	"image_info"
+.LASF110:
+	.string	"arch"
+.LASF260:
+	.string	"mem_clk"
+.LASF257:
+	.string	"cpu_clk"
+.LASF32:
+	.string	"select_hwpart"
+.LASF319:
+	.string	"net_rx_packets"
+.LASF75:
+	.string	"_datarelro_start_ofs"
+.LASF17:
+	.string	"ulong"
+.LASF371:
+	.string	"task_fn"
+.LASF96:
+	.string	"ih_ep"
+.LASF45:
+	.string	"lmb_region"
+.LASF375:
+	.string	"task"
+.LASF392:
+	.string	"mpb_task_wait_timeout_done"
+.LASF400:
+	.string	"tid_to_task_index"
+.LASF118:
+	.string	"fit_uname_os"
+.LASF60:
+	.string	"bi_bootflags"
+.LASF316:
+	.string	"net_ip"
+.LASF278:
+	.string	"fdt_size"
+.LASF310:
+	.string	"net_dns_server"
+.LASF338:
+	.string	"__bss_start"
+.LASF330:
+	.string	"net_ping_ip"
+.LASF47:
+	.string	"memory"
+.LASF78:
+	.string	"fdt_header"
+.LASF175:
+	.string	"UCLASS_MAILBOX"
+.LASF343:
+	.string	"filename"
+.LASF130:
+	.string	"rd_end"
+.LASF269:
+	.string	"irq_sp"
+.LASF135:
+	.string	"cmdline_start"
+.LASF255:
+	.string	"global_data"
+.LASF358:
+	.string	"EVT_SIMPLE_BOOTM"
+.LASF366:
+	.string	"TASK_HASH_ANDROID"
+.LASF204:
+	.string	"UCLASS_SCSI"
+.LASF217:
+	.string	"UCLASS_USB_DEV_GENERIC"
+.LASF176:
+	.string	"UCLASS_MASS_STORAGE"
+.LASF1:
+	.string	"long unsigned int"
+.LASF151:
+	.string	"UCLASS_SIMPLE_BUS"
+.LASF299:
+	.string	"gd_t"
+.LASF311:
+	.string	"net_nis_domain"
+.LASF125:
+	.string	"fit_noffset_fdt"
+.LASF342:
+	.string	"bl_len"
+.LASF427:
+	.string	"get_ticks"
+.LASF336:
+	.string	"NETLOOP_FAIL"
+.LASF224:
+	.string	"UCLASS_WDT"
+.LASF245:
+	.string	"timer_reset_value"
+.LASF270:
+	.string	"start_addr_sp"
+.LASF55:
+	.string	"bi_sramstart"
+.LASF25:
+	.string	"_binary_u_boot_bin_end"
+.LASF271:
+	.string	"reloc_off"
+.LASF86:
+	.string	"boot_cpuid_phys"
+.LASF244:
+	.string	"lastinc"
+.LASF248:
+	.string	"tlb_fillptr"
+.LASF121:
+	.string	"fit_uname_rd"
+.LASF210:
+	.string	"UCLASS_SYSCON"
+.LASF116:
+	.string	"fit_uname_cfg"
+.LASF205:
+	.string	"UCLASS_SERIAL"
+.LASF324:
+	.string	"net_our_vlan"
+.LASF294:
+	.string	"serial"
+.LASF154:
+	.string	"UCLASS_BLK"
+.LASF111:
+	.string	"image_info_t"
+.LASF150:
+	.string	"UCLASS_USB_EMUL"
+.LASF421:
+	.string	"icache_disable"
+.LASF246:
+	.string	"tlb_addr"
+.LASF188:
+	.string	"UCLASS_PCI_GENERIC"
+.LASF370:
+	.string	"task_t"
+.LASF407:
+	.string	"spl_load_android"
+.LASF387:
+	.string	"ticks"
+.LASF106:
+	.string	"image_len"
+.LASF362:
+	.string	"TASK_LOAD_BASEPARAMETER"
+.LASF61:
+	.string	"bi_ip_addr"
+.LASF393:
+	.string	"timeout_ms"
+.LASF190:
+	.string	"UCLASS_PINCONFIG"
+.LASF384:
+	.string	"smp_entry"
+.LASF212:
+	.string	"UCLASS_THERMAL"
+.LASF114:
+	.string	"legacy_hdr_os_copy"
+.LASF354:
+	.string	"EVT_BOOT_ADDR"
+.LASF9:
+	.string	"long long int"
+.LASF277:
+	.string	"new_fdt"
+.LASF21:
+	.string	"___strtok"
+.LASF329:
+	.string	"net_boot_file_expected_size_in_blocks"
+.LASF252:
+	.string	"enable"
+.LASF395:
+	.string	"ptid"
+.LASF183:
+	.string	"UCLASS_NVME"
+.LASF249:
+	.string	"tlb_emerg"
+.LASF112:
+	.string	"bootm_headers"
+.LASF37:
+	.string	"protect"
+.LASF216:
+	.string	"UCLASS_USB"
+.LASF227:
+	.string	"UCLASS_RC"
+.LASF398:
+	.string	"mpb_task_is_done"
+.LASF284:
+	.string	"timebase_h"
+.LASF285:
+	.string	"timebase_l"
+.LASF160:
+	.string	"UCLASS_DISPLAY"
+.LASF323:
+	.string	"net_null_ethaddr"
+.LASF263:
+	.string	"env_valid"
+.LASF228:
+	.string	"UCLASS_CHARGE_DISPLAY"
+.LASF303:
+	.string	"load_addr"
+.LASF117:
+	.string	"fit_hdr_os"
+.LASF73:
+	.string	"_datarelrolocal_start_ofs"
+.LASF396:
+	.string	"timeout"
+.LASF254:
+	.string	"addr"
+.LASF344:
+	.string	"read"
+.LASF8:
+	.string	"unsigned int"
+.LASF16:
+	.string	"ushort"
+.LASF402:
+	.string	"task_is_registered"
+.LASF281:
+	.string	"ufdt_blob"
+.LASF410:
+	.string	"spl_init_display"
+.LASF287:
+	.string	"malloc_limit"
+.LASF401:
+	.string	"mpb_task_register"
+.LASF192:
+	.string	"UCLASS_PMIC"
+.LASF113:
+	.string	"legacy_hdr_os"
+.LASF82:
+	.string	"off_dt_strings"
+.LASF300:
+	.string	"monitor_flash_len"
+.LASF177:
+	.string	"UCLASS_MISC"
+.LASF51:
+	.string	"bi_memsize"
+.LASF394:
+	.string	"mpb_task_wait_parent"
+.LASF23:
+	.string	"image_base"
+.LASF382:
+	.string	"mpb_init_1"
+.LASF211:
+	.string	"UCLASS_SYSRESET"
+.LASF164:
+	.string	"UCLASS_FIRMWARE"
+.LASF425:
+	.string	"invalidate_dcache_range"
+.LASF174:
+	.string	"UCLASS_LPC"
+.LASF170:
+	.string	"UCLASS_IDE"
+.LASF290:
+	.string	"video_top"
+.LASF280:
+	.string	"of_root_f"
+.LASF139:
+	.string	"bootm_headers_t"
+.LASF57:
+	.string	"bi_arm_freq"
+.LASF198:
+	.string	"UCLASS_REMOTEPROC"
+.LASF109:
+	.string	"type"
+.LASF120:
+	.string	"fit_hdr_rd"
+.LASF388:
+	.string	"fail"
+.LASF262:
+	.string	"env_addr"
+.LASF56:
+	.string	"bi_sramsize"
+.LASF348:
+	.string	"boot_size"
+.LASF390:
+	.string	"mpb_task_wait_done"
+.LASF406:
+	.string	"spl_hash_android"
+.LASF275:
+	.string	"uclass_root"
+.LASF163:
+	.string	"UCLASS_GPIO"
+.LASF193:
+	.string	"UCLASS_PWM"
+.LASF404:
+	.string	"set_gd"
+.LASF42:
+	.string	"long double"
+.LASF264:
+	.string	"ram_top"
+.LASF296:
+	.string	"console_evt"
+.LASF381:
+	.string	"mpb_init_x"
+.LASF431:
+	.string	"mpb_task_set_state"
+.LASF129:
+	.string	"rd_start"
+.LASF194:
+	.string	"UCLASS_POWER_DOMAIN"
+.LASF197:
+	.string	"UCLASS_REGULATOR"
+.LASF305:
+	.string	"save_size"
+.LASF414:
+	.string	"msec"
+.LASF155:
+	.string	"UCLASS_CLK"
+.LASF391:
+	.string	"core_task_run"
+.LASF346:
+	.string	"info"
+.LASF72:
+	.string	"_datarel_start_ofs"
+.LASF250:
+	.string	"pre_serial"
+.LASF428:
+	.ascii	"GNU C11 6.3.1 201"
+	.string	"70404 -mstrict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18"
+.LASF102:
+	.string	"ih_name"
+.LASF98:
+	.string	"ih_os"
+.LASF345:
+	.string	"task_data"
+.LASF136:
+	.string	"cmdline_end"
+.LASF320:
+	.string	"net_rx_packet"
+.LASF241:
+	.string	"LOGF_MAX_CATEGORIES"
+.LASF276:
+	.string	"fdt_blob"
+.LASF33:
+	.string	"size"
+.LASF10:
+	.string	"long long unsigned int"
+.LASF90:
+	.string	"image_header"
+.LASF350:
+	.string	"CPU_1"
+.LASF19:
+	.string	"__be32"
+.LASF52:
+	.string	"bi_flashstart"
+.LASF119:
+	.string	"fit_noffset_os"
+.LASF399:
+	.string	"mpb_task_set_result"
+.LASF178:
+	.string	"UCLASS_MMC"
+.LASF240:
+	.string	"UCLASS_INVALID"
+.LASF376:
+	.string	"mpb_core"
+.LASF218:
+	.string	"UCLASS_USB_HUB"
+.LASF279:
+	.string	"of_root"
+.LASF234:
+	.string	"UCLASS_EBC"
+.LASF340:
+	.string	"spl_load_info"
+.LASF293:
+	.string	"new_line"
+.LASF416:
+	.string	"memset"
+.LASF41:
+	.string	"flash_info"
+.LASF84:
+	.string	"version"
+.LASF46:
+	.string	"region"
+.LASF88:
+	.string	"size_dt_struct"
+.LASF273:
+	.string	"dm_root"
+.LASF236:
+	.string	"UCLASS_RNG"
+.LASF295:
+	.string	"sys_start_tick"
+.LASF180:
+	.string	"UCLASS_MTD"
+.LASF77:
+	.string	"fdt32_t"
+.LASF272:
+	.string	"new_gd"
+.LASF182:
+	.string	"UCLASS_NORTHBRIDGE"
+.LASF62:
+	.string	"bi_enetaddr"
+.LASF39:
+	.string	"mtd_info"
+.LASF306:
+	.string	"in_addr"
+.LASF321:
+	.string	"net_rx_packet_len"
+.LASF383:
+	.string	"init"
+.LASF301:
+	.string	"__dtb_dt_begin"
+.LASF199:
+	.string	"UCLASS_RESET"
+.LASF122:
+	.string	"fit_noffset_rd"
+.LASF153:
+	.string	"UCLASS_AHCI"
+.LASF12:
+	.string	"phys_size_t"
+.LASF156:
+	.string	"UCLASS_CPU"
+.LASF71:
+	.string	"FIQ_STACK_START"
+.LASF137:
+	.string	"verify"
+.LASF31:
+	.string	"name"
+.LASF235:
+	.string	"UCLASS_EINK_DISPLAY"
+.LASF185:
+	.string	"UCLASS_PANEL_BACKLIGHT"
+.LASF213:
+	.string	"UCLASS_TIMER"
+.LASF208:
+	.string	"UCLASS_SPI_FLASH"
+.LASF261:
+	.string	"have_console"
+.LASF65:
+	.string	"bi_busfreq"
+.LASF6:
+	.string	"short int"
+.LASF347:
+	.string	"boot_addr"
+.LASF191:
+	.string	"UCLASS_PINCTRL"
+.LASF201:
+	.string	"UCLASS_RAMDISK"
+.LASF148:
+	.string	"UCLASS_I2C_EMUL"
+.LASF365:
+	.string	"TASK_LOAD_ANDROID"
+.LASF207:
+	.string	"UCLASS_SPMI"
+.LASF378:
+	.string	"tdata"
+.LASF145:
+	.string	"UCLASS_TEST_BUS"
+.LASF417:
+	.string	"flush_dcache_all"
+.LASF304:
+	.string	"save_addr"
+.LASF426:
+	.string	"flush_dcache_range"
+.LASF288:
+	.string	"malloc_ptr"
+.LASF411:
+	.string	"cpuectlr_disable"
+.LASF386:
+	.string	"mpb_task_run"
+.LASF408:
+	.string	"spl_load_fit"
+.LASF134:
+	.string	"initrd_end"
+.LASF359:
+	.string	"EVT_VIDEO_BP"
+.LASF253:
+	.string	"baudrate"
+.LASF74:
+	.string	"_datarellocal_start_ofs"
+.LASF242:
+	.string	"arch_global_data"
+.LASF239:
+	.string	"UCLASS_COUNT"
+.LASF349:
+	.string	"CPU_0"
+.LASF259:
+	.string	"pci_clk"
+.LASF351:
+	.string	"CPU_2"
+.LASF352:
+	.string	"CPU_3"
+.LASF30:
+	.string	"block_drvr"
+.LASF433:
+	.string	"memcpy"
+.LASF35:
+	.string	"flash_id"
+.LASF231:
+	.string	"UCLASS_CRYPTO"
+.LASF297:
+	.string	"device_node"
+.LASF267:
+	.string	"ram_size"
+.LASF128:
+	.string	"fit_noffset_setup"
+.LASF89:
+	.string	"working_fdt"
+.LASF282:
+	.string	"fdt_blob_kern"
+.LASF313:
+	.string	"net_root_path"
+.LASF161:
+	.string	"UCLASS_DMA"
+.LASF69:
+	.string	"bd_t"
+.LASF237:
+	.string	"UCLASS_DMC"
+.LASF307:
+	.string	"s_addr"
+.LASF322:
+	.string	"net_bcast_ethaddr"
+.LASF379:
+	.string	"mpb_gd"
+.LASF67:
+	.string	"bi_boot_params"
+.LASF308:
+	.string	"net_gateway"
+.LASF50:
+	.string	"bi_memstart"
+.LASF222:
+	.string	"UCLASS_VIDEO_CONSOLE"
+.LASF48:
+	.string	"reserved"
+.LASF360:
+	.string	"TASK_NONE"
+.LASF238:
+	.string	"UCLASS_PD"
+.LASF423:
+	.string	"dcache_disable"
+.LASF68:
+	.string	"bi_dram"
+.LASF2:
+	.string	"short unsigned int"
+.LASF79:
+	.string	"magic"
+.LASF126:
+	.string	"fit_hdr_setup"
+.LASF115:
+	.string	"legacy_hdr_valid"
+.LASF368:
+	.string	"TASK_MAX"
+.LASF44:
+	.string	"base"
+.LASF432:
+	.string	"spl_dummy"
+.LASF202:
+	.string	"UCLASS_RTC"
+.LASF353:
+	.string	"EVT_BOOT_DEV"
+.LASF243:
+	.string	"timer_rate_hz"
+.LASF34:
+	.string	"sector_count"
+.LASF101:
+	.string	"ih_comp"
+.LASF385:
+	.string	"core_main"
+.LASF131:
+	.string	"ft_addr"
+.LASF232:
+	.string	"UCLASS_ETH_PHY"
+.LASF380:
+	.string	"task_init"
+.LASF4:
+	.string	"uchar"
+.LASF132:
+	.string	"ft_len"
+.LASF27:
+	.string	"next"
+.LASF405:
+	.string	"data"
+.LASF181:
+	.string	"UCLASS_NOP"
+.LASF367:
+	.string	"TASK_RUN_UBOOT"
+.LASF357:
+	.string	"EVT_LINUX"
+.LASF127:
+	.string	"fit_uname_setup"
+.LASF28:
+	.string	"prev"
+.LASF424:
+	.string	"invalidate_dcache_all"
+.LASF186:
+	.string	"UCLASS_PCH"
+.LASF187:
+	.string	"UCLASS_PCI"
+.LASF309:
+	.string	"net_netmask"
+.LASF70:
+	.string	"IRQ_STACK_START"
+.LASF152:
+	.string	"UCLASS_ADC"
+.LASF147:
+	.string	"UCLASS_SPI_EMUL"
+.LASF409:
+	.string	"spl_load_baseparamter"
+.LASF124:
+	.string	"fit_uname_fdt"
+	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/u-boot/configs/px30-tb_defconfig b/u-boot/configs/px30-tb_defconfig
index 3d6037c..9a084ff 100644
--- a/u-boot/configs/px30-tb_defconfig
+++ b/u-boot/configs/px30-tb_defconfig
@@ -4,7 +4,7 @@
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x80000
 CONFIG_ROCKCHIP_PX30=y
-CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py"
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh"
 CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
 CONFIG_ROCKCHIP_FIT_IMAGE=y
 CONFIG_ROCKCHIP_VENDOR_PARTITION=y
diff --git a/u-boot/configs/px30_defconfig b/u-boot/configs/px30_defconfig
index 1882d48..0055891 100644
--- a/u-boot/configs/px30_defconfig
+++ b/u-boot/configs/px30_defconfig
@@ -135,6 +135,7 @@
 CONFIG_LCD=y
 CONFIG_USE_TINY_PRINTF=y
 CONFIG_SPL_TINY_MEMSET=y
+CONFIG_XBC=y
 CONFIG_LZ4=y
 CONFIG_LZO=y
 CONFIG_ERRNO_STR=y
diff --git a/u-boot/configs/rk-amp.config b/u-boot/configs/rk-amp.config
new file mode 100644
index 0000000..b76e182
--- /dev/null
+++ b/u-boot/configs/rk-amp.config
@@ -0,0 +1,3 @@
+# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
+CONFIG_AMP=y
+CONFIG_ROCKCHIP_AMP=y
diff --git a/u-boot/configs/rk3036_defconfig b/u-boot/configs/rk3036_defconfig
index 2b91aaf..b0ea431 100644
--- a/u-boot/configs/rk3036_defconfig
+++ b/u-boot/configs/rk3036_defconfig
@@ -73,11 +73,13 @@
 CONFIG_SYS_I2C_ROCKCHIP=y
 CONFIG_DM_KEY=y
 CONFIG_ADC_KEY=y
+CONFIG_GPIO_KEY=y
 CONFIG_LED=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_SPEED=20000000
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
 CONFIG_PINCTRL=y
 CONFIG_SPL_PINCTRL=y
 CONFIG_REGULATOR_PWM=y
diff --git a/u-boot/configs/rk3126_defconfig b/u-boot/configs/rk3126_defconfig
index a95e38d..f9bdb8e 100644
--- a/u-boot/configs/rk3126_defconfig
+++ b/u-boot/configs/rk3126_defconfig
@@ -15,6 +15,7 @@
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_ANDROID_BOOTLOADER=y
 CONFIG_ANDROID_AVB=y
+# CONFIG_SKIP_RELOCATE_UBOOT is not set
 CONFIG_FASTBOOT_BUF_ADDR=0x60800800
 CONFIG_FASTBOOT_BUF_SIZE=0x04000000
 CONFIG_FASTBOOT_FLASH=y
diff --git a/u-boot/configs/rk3128_defconfig b/u-boot/configs/rk3128_defconfig
index e24b274..c1c1ddc 100644
--- a/u-boot/configs/rk3128_defconfig
+++ b/u-boot/configs/rk3128_defconfig
@@ -2,7 +2,6 @@
 CONFIG_ARCH_ROCKCHIP=y
 CONFIG_SYS_MALLOC_F_LEN=0x38000
 CONFIG_ROCKCHIP_RK3128=y
-CONFIG_RKIMG_BOOTLOADER=y
 CONFIG_ROCKCHIP_VENDOR_PARTITION=y
 CONFIG_DEFAULT_DEVICE_TREE="rk3126-evb"
 CONFIG_DEBUG_UART=y
@@ -13,6 +12,7 @@
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_ANDROID_BOOTLOADER=y
 CONFIG_ANDROID_AVB=y
+# CONFIG_SKIP_RELOCATE_UBOOT is not set
 CONFIG_FASTBOOT_BUF_ADDR=0x60800800
 CONFIG_FASTBOOT_BUF_SIZE=0x04000000
 CONFIG_FASTBOOT_FLASH=y
@@ -82,9 +82,6 @@
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DWC2_OTG=y
 CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_G_DNL_MANUFACTURER="Rockchip"
-CONFIG_G_DNL_VENDOR_NUM=0x2207
-CONFIG_G_DNL_PRODUCT_NUM=0x310c
 CONFIG_DM_VIDEO=y
 CONFIG_DISPLAY=y
 CONFIG_VIDEO_ROCKCHIP=y
diff --git a/u-boot/configs/rk3128x_defconfig b/u-boot/configs/rk3128x_defconfig
index ada3b40..d0cc774 100644
--- a/u-boot/configs/rk3128x_defconfig
+++ b/u-boot/configs/rk3128x_defconfig
@@ -120,7 +120,7 @@
 CONFIG_DRM_ROCKCHIP=y
 CONFIG_DRM_ROCKCHIP_DW_HDMI=y
 CONFIG_ROCKCHIP_INNO_HDMI_PHY=y
-CONFIG_ROCKCHIP_DRM_TVE=y
+CONFIG_DRM_ROCKCHIP_TVE=y
 CONFIG_LCD=y
 CONFIG_USE_TINY_PRINTF=y
 CONFIG_SPL_TINY_MEMSET=y
diff --git a/u-boot/configs/rk312x-rkflash.config b/u-boot/configs/rk312x-rkflash.config
new file mode 100644
index 0000000..92ad355
--- /dev/null
+++ b/u-boot/configs/rk312x-rkflash.config
@@ -0,0 +1,6 @@
+CONFIG_RKFLASH=y
+# CONFIG_RKNAND is not set
+CONFIG_CMD_RKSFC=y
+CONFIG_RKNANDC_NAND=y
+CONFIG_RKSFC_NAND=y
+CONFIG_RKSFC_NOR=y
diff --git a/u-boot/configs/rk322x_defconfig b/u-boot/configs/rk322x_defconfig
index a2ead85..22621cd 100644
--- a/u-boot/configs/rk322x_defconfig
+++ b/u-boot/configs/rk322x_defconfig
@@ -115,7 +115,7 @@
 CONFIG_DRM_ROCKCHIP=y
 CONFIG_DRM_ROCKCHIP_DW_HDMI=y
 CONFIG_ROCKCHIP_INNO_HDMI_PHY=y
-CONFIG_ROCKCHIP_DRM_TVE=y
+CONFIG_DRM_ROCKCHIP_TVE=y
 CONFIG_LCD=y
 CONFIG_USE_TINY_PRINTF=y
 CONFIG_SPL_TINY_MEMSET=y
diff --git a/u-boot/configs/rk3308-amp.config b/u-boot/configs/rk3308-amp.config
new file mode 100644
index 0000000..4e7e3ba
--- /dev/null
+++ b/u-boot/configs/rk3308-amp.config
@@ -0,0 +1,3 @@
+CONFIG_AMP=y
+CONFIG_BASE_DEFCONFIG="rk3308_defconfig"
+CONFIG_ROCKCHIP_AMP=y
diff --git a/u-boot/configs/rk3326_defconfig b/u-boot/configs/rk3326_defconfig
index 290a283..d1f0e1f 100644
--- a/u-boot/configs/rk3326_defconfig
+++ b/u-boot/configs/rk3326_defconfig
@@ -69,6 +69,8 @@
 CONFIG_SPL_SYSCON=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
+CONFIG_AMP=y
+CONFIG_ROCKCHIP_AMP=y
 CONFIG_DM_CRYPTO=y
 CONFIG_ROCKCHIP_CRYPTO_V2=y
 CONFIG_ROCKCHIP_GPIO=y
@@ -128,6 +130,8 @@
 CONFIG_LCD=y
 CONFIG_USE_TINY_PRINTF=y
 CONFIG_SPL_TINY_MEMSET=y
+CONFIG_XBC=y
+CONFIG_SHA256=y
 CONFIG_LZ4=y
 CONFIG_LZO=y
 CONFIG_ERRNO_STR=y
diff --git a/u-boot/configs/rk3328_defconfig b/u-boot/configs/rk3328_defconfig
index 2e7096b..03de227 100644
--- a/u-boot/configs/rk3328_defconfig
+++ b/u-boot/configs/rk3328_defconfig
@@ -129,7 +129,7 @@
 CONFIG_DRM_ROCKCHIP_PANEL=y
 CONFIG_DRM_ROCKCHIP_DW_HDMI=y
 CONFIG_ROCKCHIP_INNO_HDMI_PHY=y
-CONFIG_ROCKCHIP_DRM_TVE=y
+CONFIG_DRM_ROCKCHIP_TVE=y
 CONFIG_LCD=y
 # CONFIG_IRQ is not set
 CONFIG_USE_TINY_PRINTF=y
diff --git a/u-boot/configs/rk3399_defconfig b/u-boot/configs/rk3399_defconfig
index cfadc7b..7c6e123 100644
--- a/u-boot/configs/rk3399_defconfig
+++ b/u-boot/configs/rk3399_defconfig
@@ -90,8 +90,8 @@
 CONFIG_PINCTRL=y
 CONFIG_SPL_PINCTRL=y
 CONFIG_DM_FUEL_GAUGE=y
-CONFIG_POWER_FG_RK817=y
 CONFIG_POWER_FG_RK818=y
+CONFIG_POWER_FG_RK817=y
 CONFIG_IO_DOMAIN=y
 CONFIG_ROCKCHIP_IO_DOMAIN=y
 CONFIG_DM_PMIC=y
@@ -137,6 +137,7 @@
 CONFIG_USE_TINY_PRINTF=y
 CONFIG_LIB_RAND=y
 CONFIG_SPL_TINY_MEMSET=y
+CONFIG_XBC=y
 CONFIG_ERRNO_STR=y
 CONFIG_AVB_LIBAVB=y
 CONFIG_AVB_LIBAVB_AB=y
diff --git a/u-boot/configs/rk3528-aarch32.config b/u-boot/configs/rk3528-aarch32.config
new file mode 100644
index 0000000..a80ed33
--- /dev/null
+++ b/u-boot/configs/rk3528-aarch32.config
@@ -0,0 +1,24 @@
+CONFIG_ARM64_BOOT_AARCH32=y
+# CONFIG_ARM64_SUPPORT_AARCH32 is not set
+# CONFIG_ARMV7_LPAE is not set
+CONFIG_BASE_DEFCONFIG="rk3528_defconfig"
+CONFIG_BOOTP_PXE_CLIENTARCH=0x15
+CONFIG_BOOTP_VCI_STRING="U-Boot.armv7"
+CONFIG_CPU_V7=y
+# CONFIG_DEBUG_LL is not set
+CONFIG_HAS_THUMB2=y
+CONFIG_HAS_VBAR=y
+CONFIG_HAVE_PRIVATE_LIBGCC=y
+# CONFIG_PHYS_64BIT is not set
+# CONFIG_SPL_OF_LIBFDT is not set
+CONFIG_SPL_SYS_THUMB_BUILD=y
+CONFIG_SPL_USE_ARCH_MEMCPY=y
+CONFIG_SPL_USE_ARCH_MEMSET=y
+CONFIG_SYS_ARM_ARCH=7
+CONFIG_SYS_CPU="armv7"
+CONFIG_SYS_THUMB_BUILD=y
+CONFIG_TPL_USE_ARCH_MEMCPY=y
+CONFIG_TPL_USE_ARCH_MEMSET=y
+CONFIG_USE_ARCH_MEMCPY=y
+CONFIG_USE_ARCH_MEMSET=y
+CONFIG_USE_PRIVATE_LIBGCC=y
diff --git a/u-boot/configs/rk3528_defconfig b/u-boot/configs/rk3528_defconfig
new file mode 100644
index 0000000..cfa8bbb
--- /dev/null
+++ b/u-boot/configs/rk3528_defconfig
@@ -0,0 +1,201 @@
+CONFIG_ARM=y
+CONFIG_ARM_SMCCC=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x80000
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh"
+CONFIG_ROCKCHIP_RK3528=y
+CONFIG_ROCKCHIP_FIT_IMAGE=y
+CONFIG_ROCKCHIP_VENDOR_PARTITION=y
+CONFIG_USING_KERNEL_DTB_V2=y
+CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y
+CONFIG_ROCKCHIP_NEW_IDB=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_TARGET_EVB_RK3528=y
+CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
+CONFIG_DEFAULT_DEVICE_TREE="rk3528-evb"
+CONFIG_DEBUG_UART=y
+CONFIG_FIT=y
+CONFIG_FIT_IMAGE_POST_PROCESS=y
+CONFIG_FIT_HW_CRYPTO=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y
+CONFIG_SPL_FIT_HW_CRYPTO=y
+# CONFIG_SPL_SYS_DCACHE_OFF is not set
+CONFIG_BOOTDELAY=0
+# CONFIG_CONSOLE_MUX is not set
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_ANDROID_BOOTLOADER=y
+CONFIG_ANDROID_AVB=y
+CONFIG_ANDROID_BOOT_IMAGE_HASH=y
+CONFIG_SPL_BOARD_INIT=y
+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
+# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
+CONFIG_SPL_CRYPTO_SUPPORT=y
+CONFIG_SPL_MMC_WRITE=y
+CONFIG_SPL_MTD_SUPPORT=y
+CONFIG_SPL_MTD_WRITE=y
+CONFIG_SPL_ATF=y
+CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
+CONFIG_SPL_AB=y
+CONFIG_FASTBOOT_BUF_ADDR=0xc00800
+CONFIG_FASTBOOT_BUF_SIZE=0x04000000
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=0
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_DTIMG=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_LZMADEC is not set
+# CONFIG_CMD_UNZIP is not set
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_GPT=y
+# CONFIG_CMD_LOADB is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_BOOT_ANDROID=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_MTD=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_CMD_ITEST is not set
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_TFTP_BOOTM=y
+CONFIG_CMD_TFTP_FLASH=y
+# CONFIG_CMD_MISC is not set
+CONFIG_CMD_MTD_BLK=y
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_ISO_PARTITION is not set
+CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_SPL_DTB_MINIMUM=y
+CONFIG_OF_LIVE=y
+CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clock-parents"
+# CONFIG_NET_TFTP_VARS is not set
+CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
+# CONFIG_SARADC_ROCKCHIP is not set
+CONFIG_SARADC_ROCKCHIP_V2=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+CONFIG_CLK_SCMI=y
+CONFIG_SPL_CLK_SCMI=y
+CONFIG_DM_CRYPTO=y
+CONFIG_SPL_DM_CRYPTO=y
+CONFIG_ROCKCHIP_CRYPTO_V2=y
+CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_ROCKCHIP=y
+CONFIG_SCMI_FIRMWARE=y
+CONFIG_SPL_SCMI_FIRMWARE=y
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_ROCKCHIP_GPIO_V2=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_DM_KEY=y
+CONFIG_ADC_KEY=y
+CONFIG_MISC=y
+CONFIG_SPL_MISC=y
+CONFIG_ROCKCHIP_OTP=y
+CONFIG_SPL_ROCKCHIP_SECURE_OTP=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
+CONFIG_MMC_SDHCI_ROCKCHIP=y
+CONFIG_MTD=y
+CONFIG_MTD_BLK=y
+CONFIG_MTD_DEVICE=y
+CONFIG_MTD_SPI_NAND=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_EON=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_ISSI=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_XMC=y
+CONFIG_SPI_FLASH_XTX=y
+CONFIG_SPI_FLASH_PUYA=y
+CONFIG_SPI_FLASH_FMSH=y
+CONFIG_SPI_FLASH_DOSILICON=y
+CONFIG_SPI_FLASH_BOYA=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_SPL_SPI_FLASH_MTD=y
+CONFIG_PHY_RK630=y
+CONFIG_DM_ETH=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_DWC_ETH_QOS=y
+CONFIG_GMAC_ROCKCHIP=y
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_RAM=y
+CONFIG_SPL_RAM=y
+CONFIG_TPL_RAM=y
+CONFIG_DM_RESET=y
+CONFIG_SPL_DM_RESET=y
+CONFIG_SPL_RESET_ROCKCHIP=y
+CONFIG_BAUDRATE=1500000
+CONFIG_DEBUG_UART_BASE=0xff9f0000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_ROCKCHIP_SFC=y
+CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_GENERIC=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
+CONFIG_USB_GADGET_VENDOR_NUM=0x2207
+CONFIG_USB_GADGET_PRODUCT_NUM=0x350a
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_DM_VIDEO=y
+CONFIG_DISPLAY=y
+CONFIG_VIDEO_ROCKCHIP=y
+CONFIG_DRM_ROCKCHIP=y
+CONFIG_DRM_ROCKCHIP_DW_HDMI=y
+CONFIG_ROCKCHIP_INNO_HDMI_PHY=y
+CONFIG_DRM_ROCKCHIP_TVE=y
+CONFIG_USE_TINY_PRINTF=y
+CONFIG_SPL_TINY_MEMSET=y
+CONFIG_RSA=y
+CONFIG_SPL_RSA=y
+CONFIG_RSA_N_SIZE=0x200
+CONFIG_RSA_E_SIZE=0x10
+CONFIG_RSA_C_SIZE=0x20
+CONFIG_LZ4=y
+CONFIG_LZMA=y
+CONFIG_SPL_GZIP=y
+CONFIG_ERRNO_STR=y
+# CONFIG_EFI_LOADER is not set
+CONFIG_AVB_LIBAVB=y
+CONFIG_AVB_LIBAVB_AB=y
+CONFIG_AVB_LIBAVB_ATX=y
+CONFIG_AVB_LIBAVB_USER=y
+CONFIG_RK_AVB_LIBAVB_USER=y
+CONFIG_OPTEE_CLIENT=y
+CONFIG_OPTEE_V2=y
diff --git a/u-boot/configs/rk3562_defconfig b/u-boot/configs/rk3562_defconfig
new file mode 100644
index 0000000..229e37b
--- /dev/null
+++ b/u-boot/configs/rk3562_defconfig
@@ -0,0 +1,211 @@
+CONFIG_ARM=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x80000
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh"
+CONFIG_ROCKCHIP_RK3562=y
+CONFIG_ROCKCHIP_FIT_IMAGE=y
+CONFIG_ROCKCHIP_VENDOR_PARTITION=y
+CONFIG_USING_KERNEL_DTB_V2=y
+CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y
+CONFIG_ROCKCHIP_NEW_IDB=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_TARGET_EVB_RK3562=y
+CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
+CONFIG_DEFAULT_DEVICE_TREE="rk3562-evb"
+CONFIG_DEBUG_UART=y
+CONFIG_FIT=y
+CONFIG_FIT_IMAGE_POST_PROCESS=y
+CONFIG_FIT_HW_CRYPTO=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y
+CONFIG_SPL_FIT_HW_CRYPTO=y
+# CONFIG_SPL_SYS_DCACHE_OFF is not set
+CONFIG_BOOTDELAY=0
+# CONFIG_CONSOLE_MUX is not set
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_ANDROID_BOOTLOADER=y
+CONFIG_ANDROID_AVB=y
+CONFIG_ANDROID_BOOT_IMAGE_HASH=y
+CONFIG_SPL_BOARD_INIT=y
+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
+# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
+CONFIG_SPL_MMC_WRITE=y
+CONFIG_SPL_MTD_SUPPORT=y
+CONFIG_SPL_MTD_WRITE=y
+CONFIG_SPL_ATF=y
+CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
+CONFIG_SPL_AB=y
+CONFIG_FASTBOOT_BUF_ADDR=0xc00800
+CONFIG_FASTBOOT_BUF_SIZE=0x04000000
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=0
+# CONFIG_CMD_BDI is not set
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_DTIMG=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_LZMADEC is not set
+# CONFIG_CMD_UNZIP is not set
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_GPT=y
+# CONFIG_CMD_LOADB is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_BOOT_ANDROID=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_MTD=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_CMD_ITEST is not set
+# CONFIG_CMD_SETEXPR is not set
+# CONFIG_CMD_MISC is not set
+CONFIG_CMD_MTD_BLK=y
+# CONFIG_ISO_PARTITION is not set
+CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_SPL_DTB_MINIMUM=y
+CONFIG_OF_LIVE=y
+CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
+# CONFIG_NET_TFTP_VARS is not set
+CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
+# CONFIG_SARADC_ROCKCHIP is not set
+CONFIG_SARADC_ROCKCHIP_V2=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+CONFIG_CLK_SCMI=y
+CONFIG_SPL_CLK_SCMI=y
+CONFIG_DM_CRYPTO=y
+CONFIG_SPL_DM_CRYPTO=y
+CONFIG_ROCKCHIP_CRYPTO_V2=y
+CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_ROCKCHIP=y
+CONFIG_SCMI_FIRMWARE=y
+CONFIG_SPL_SCMI_FIRMWARE=y
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_ROCKCHIP_GPIO_V2=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_DM_KEY=y
+CONFIG_RK8XX_PWRKEY=y
+CONFIG_ADC_KEY=y
+CONFIG_MISC=y
+CONFIG_SPL_MISC=y
+CONFIG_ROCKCHIP_OTP=y
+CONFIG_SPL_ROCKCHIP_SECURE_OTP=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
+CONFIG_MMC_SDHCI_ROCKCHIP=y
+CONFIG_MTD=y
+CONFIG_MTD_BLK=y
+CONFIG_MTD_DEVICE=y
+CONFIG_MTD_SPI_NAND=y
+CONFIG_SPI_FLASH=y
+CONFIG_SF_DEFAULT_MODE=0x3
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_XMC=y
+CONFIG_SPI_FLASH_XTX=y
+CONFIG_SPI_FLASH_PUYA=y
+CONFIG_SPI_FLASH_FMSH=y
+CONFIG_SPI_FLASH_DOSILICON=y
+CONFIG_SPI_FLASH_BOYA=y
+CONFIG_SPI_FLASH_NORMEM=y
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_SPL_SPI_FLASH_MTD=y
+CONFIG_DM_ETH=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_DWC_ETH_QOS=y
+CONFIG_GMAC_ROCKCHIP=y
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_DM_FUEL_GAUGE=y
+CONFIG_POWER_FG_RK817=y
+CONFIG_DM_PMIC=y
+CONFIG_PMIC_RK8XX=y
+CONFIG_REGULATOR_FAN53555=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_REGULATOR_RK8XX=y
+CONFIG_DM_CHARGE_DISPLAY=y
+CONFIG_CHARGE_ANIMATION=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_RAM=y
+CONFIG_SPL_RAM=y
+CONFIG_TPL_RAM=y
+CONFIG_DM_DMC=y
+CONFIG_DM_RESET=y
+CONFIG_SPL_DM_RESET=y
+CONFIG_SPL_RESET_ROCKCHIP=y
+CONFIG_BAUDRATE=1500000
+CONFIG_DEBUG_UART_BASE=0xff210000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_ROCKCHIP_SFC=y
+CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_GENERIC=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
+CONFIG_USB_GADGET_VENDOR_NUM=0x2207
+CONFIG_USB_GADGET_PRODUCT_NUM=0x350a
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_DM_VIDEO=y
+CONFIG_DISPLAY=y
+CONFIG_DRM_ROCKCHIP=y
+CONFIG_DRM_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y
+CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI=y
+CONFIG_DRM_ROCKCHIP_LVDS=y
+CONFIG_DRM_ROCKCHIP_RGB=y
+CONFIG_USE_TINY_PRINTF=y
+CONFIG_SPL_TINY_MEMSET=y
+CONFIG_RSA=y
+CONFIG_SPL_RSA=y
+CONFIG_RSA_N_SIZE=0x200
+CONFIG_RSA_E_SIZE=0x10
+CONFIG_RSA_C_SIZE=0x20
+CONFIG_XBC=y
+CONFIG_SHA1=y
+CONFIG_SHA256=y
+CONFIG_LZ4=y
+CONFIG_SPL_GZIP=y
+CONFIG_ERRNO_STR=y
+# CONFIG_EFI_LOADER is not set
+CONFIG_AVB_LIBAVB=y
+CONFIG_AVB_LIBAVB_AB=y
+CONFIG_AVB_LIBAVB_ATX=y
+CONFIG_AVB_LIBAVB_USER=y
+CONFIG_RK_AVB_LIBAVB_USER=y
+CONFIG_OPTEE_CLIENT=y
+CONFIG_OPTEE_V2=y
+CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
diff --git a/u-boot/configs/rk3568-rt.config b/u-boot/configs/rk3568-rt.config
new file mode 100644
index 0000000..8dc3c69
--- /dev/null
+++ b/u-boot/configs/rk3568-rt.config
@@ -0,0 +1,2 @@
+CONFIG_BASE_DEFCONFIG="rk3568_defconfig"
+CONFIG_TRUST_INI="RK3568TRUST_RT.ini"
diff --git a/u-boot/configs/rk3568-spl-spi-nand_defconfig b/u-boot/configs/rk3568-spl-spi-nand_defconfig
index eabdae7..074ccc3 100755
--- a/u-boot/configs/rk3568-spl-spi-nand_defconfig
+++ b/u-boot/configs/rk3568-spl-spi-nand_defconfig
@@ -26,9 +26,6 @@
 CONFIG_BOOTDELAY=0
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
 # CONFIG_DISPLAY_CPUINFO is not set
-# CONFIG_ANDROID_WRITE_KEYBOX is not set
-CONFIG_ANDROID_AVB=y
-# CONFIG_ANDROID_KEYMASTER_CA is not set
 CONFIG_SPL_BOARD_INIT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
@@ -183,12 +180,4 @@
 CONFIG_RSA_E_SIZE=0x10
 CONFIG_RSA_C_SIZE=0x20
 CONFIG_SHA512=y
-CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
-CONFIG_AVB_LIBAVB=y
-CONFIG_AVB_LIBAVB_AB=y
-CONFIG_AVB_LIBAVB_ATX=y
-CONFIG_AVB_LIBAVB_USER=y
-CONFIG_RK_AVB_LIBAVB_USER=y
-CONFIG_OPTEE_CLIENT=y
-CONFIG_OPTEE_V2=y
diff --git a/u-boot/configs/rk3568_defconfig b/u-boot/configs/rk3568_defconfig
index fbd9820..d157307 100644
--- a/u-boot/configs/rk3568_defconfig
+++ b/u-boot/configs/rk3568_defconfig
@@ -83,6 +83,7 @@
 # CONFIG_ISO_PARTITION is not set
 CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
 CONFIG_SPL_OF_CONTROL=y
+CONFIG_SPL_DTB_MINIMUM=y
 CONFIG_OF_LIVE=y
 CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 # CONFIG_NET_TFTP_VARS is not set
@@ -206,6 +207,7 @@
 CONFIG_RSA_N_SIZE=0x200
 CONFIG_RSA_E_SIZE=0x10
 CONFIG_RSA_C_SIZE=0x20
+CONFIG_XBC=y
 CONFIG_SHA512=y
 CONFIG_LZ4=y
 CONFIG_LZMA=y
diff --git a/u-boot/configs/rk3588-ab.config b/u-boot/configs/rk3588-ab.config
new file mode 100644
index 0000000..a67f0d9
--- /dev/null
+++ b/u-boot/configs/rk3588-ab.config
@@ -0,0 +1,3 @@
+CONFIG_ANDROID_AB=y
+CONFIG_BASE_DEFCONFIG="rk3588_defconfig"
+# CONFIG_CMD_ANDROID_AB_SELECT is not set
diff --git a/u-boot/configs/rk3588-qnx_defconfig b/u-boot/configs/rk3588-qnx_defconfig
new file mode 100644
index 0000000..0c42ff1
--- /dev/null
+++ b/u-boot/configs/rk3588-qnx_defconfig
@@ -0,0 +1,212 @@
+CONFIG_ARM=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x80000
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh"
+CONFIG_ROCKCHIP_RK3588=y
+CONFIG_ROCKCHIP_FIT_IMAGE=y
+CONFIG_ROCKCHIP_HWID_DTB=y
+CONFIG_ROCKCHIP_VENDOR_PARTITION=y
+CONFIG_USING_KERNEL_DTB_V2=y
+CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y
+CONFIG_ROCKCHIP_NEW_IDB=y
+CONFIG_PSTORE=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_TARGET_EVB_RK3588=y
+CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_DEFAULT_DEVICE_TREE="rk3588-evb"
+CONFIG_DEBUG_UART=y
+CONFIG_FIT=y
+CONFIG_FIT_IMAGE_POST_PROCESS=y
+CONFIG_FIT_HW_CRYPTO=y
+CONFIG_FIT_OMIT_UBOOT=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y
+CONFIG_SPL_FIT_HW_CRYPTO=y
+# CONFIG_SPL_SYS_DCACHE_OFF is not set
+CONFIG_BOOTDELAY=0
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_ANDROID_BOOTLOADER=y
+CONFIG_ANDROID_AVB=y
+CONFIG_ANDROID_BOOT_IMAGE_HASH=y
+CONFIG_SPL_BOARD_INIT=y
+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
+# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=0x1
+CONFIG_SPL_MMC_WRITE=y
+CONFIG_SPL_ATF=y
+CONFIG_SPL_KERNEL_BOOT=y
+# CONFIG_SPL_KERNEL_BOOT_PREBUILT is not set
+CONFIG_FASTBOOT_BUF_ADDR=0xc00800
+CONFIG_FASTBOOT_BUF_SIZE=0x07000000
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=0
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_DTIMG=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_LZMADEC is not set
+# CONFIG_CMD_UNZIP is not set
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_GPT=y
+# CONFIG_CMD_LOADB is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_BOOT_ANDROID=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_CMD_ITEST is not set
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_TFTP_BOOTM=y
+CONFIG_CMD_TFTP_FLASH=y
+# CONFIG_CMD_MISC is not set
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_ISO_PARTITION is not set
+CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_SPL_DTB_MINIMUM=y
+CONFIG_OF_LIVE=y
+CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
+CONFIG_OF_U_BOOT_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
+# CONFIG_NET_TFTP_VARS is not set
+CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
+# CONFIG_SARADC_ROCKCHIP is not set
+CONFIG_SARADC_ROCKCHIP_V2=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+CONFIG_CLK_SCMI=y
+CONFIG_SPL_CLK_SCMI=y
+CONFIG_DM_CRYPTO=y
+CONFIG_SPL_DM_CRYPTO=y
+CONFIG_ROCKCHIP_CRYPTO_V2=y
+CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_ROCKCHIP=y
+CONFIG_SCMI_FIRMWARE=y
+CONFIG_SPL_SCMI_FIRMWARE=y
+CONFIG_GPIO_HOG=y
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_ROCKCHIP_GPIO_V2=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_I2C_MUX=y
+CONFIG_DM_KEY=y
+CONFIG_RK8XX_PWRKEY=y
+CONFIG_ADC_KEY=y
+CONFIG_MISC=y
+CONFIG_SPL_MISC=y
+CONFIG_MISC_DECOMPRESS=y
+CONFIG_SPL_MISC_DECOMPRESS=y
+CONFIG_ROCKCHIP_OTP=y
+CONFIG_ROCKCHIP_HW_DECOMPRESS=y
+CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS=y
+CONFIG_SPL_ROCKCHIP_SECURE_OTP=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
+CONFIG_MMC_SDHCI_ROCKCHIP=y
+CONFIG_DM_ETH=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_DWC_ETH_QOS=y
+CONFIG_GMAC_ROCKCHIP=y
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX=y
+CONFIG_PHY_ROCKCHIP_USBDP=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_DM_FUEL_GAUGE=y
+CONFIG_POWER_FG_CW201X=y
+CONFIG_POWER_FG_CW221X=y
+CONFIG_DM_PMIC=y
+CONFIG_PMIC_SPI_RK8XX=y
+CONFIG_DM_POWER_DELIVERY=y
+CONFIG_TYPEC_TCPM=y
+CONFIG_TYPEC_TCPCI=y
+CONFIG_TYPEC_HUSB311=y
+CONFIG_TYPEC_FUSB302=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_REGULATOR_RK860X=y
+CONFIG_REGULATOR_RK806=y
+CONFIG_CHARGER_BQ25700=y
+CONFIG_CHARGER_BQ25890=y
+CONFIG_CHARGER_SC8551=y
+CONFIG_CHARGER_SGM41542=y
+CONFIG_DM_CHARGE_DISPLAY=y
+CONFIG_CHARGE_ANIMATION=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_RAM=y
+CONFIG_SPL_RAM=y
+CONFIG_TPL_RAM=y
+CONFIG_DM_RAMDISK=y
+CONFIG_RAMDISK_RO=y
+CONFIG_DM_RESET=y
+CONFIG_SPL_DM_RESET=y
+CONFIG_SPL_RESET_ROCKCHIP=y
+CONFIG_BAUDRATE=1500000
+CONFIG_DEBUG_UART_BASE=0xFEB50000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_GENERIC=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_DWC3_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
+CONFIG_USB_GADGET_VENDOR_NUM=0x2207
+CONFIG_USB_GADGET_PRODUCT_NUM=0x350a
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_DM_VIDEO=y
+CONFIG_DISPLAY=y
+CONFIG_DRM_ROCKCHIP=y
+CONFIG_DRM_MAXIM_MAX96745=y
+CONFIG_DRM_MAXIM_MAX96755F=y
+CONFIG_DRM_PANEL_MAXIM_DESERIALIZER=y
+CONFIG_DRM_ROHM_BU18XL82=y
+CONFIG_DRM_ROCKCHIP_DW_HDMI_QP=y
+CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI2=y
+CONFIG_DRM_ROCKCHIP_DW_DP=y
+CONFIG_DRM_ROCKCHIP_ANALOGIX_DP=y
+CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY=y
+CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX_HDMI=y
+CONFIG_USE_TINY_PRINTF=y
+CONFIG_LIB_RAND=y
+CONFIG_SPL_TINY_MEMSET=y
+CONFIG_RSA=y
+CONFIG_SPL_RSA=y
+CONFIG_RSA_N_SIZE=0x200
+CONFIG_RSA_E_SIZE=0x10
+CONFIG_RSA_C_SIZE=0x20
+CONFIG_XBC=y
+CONFIG_LZ4=y
+CONFIG_LZMA=y
+CONFIG_ERRNO_STR=y
+# CONFIG_EFI_LOADER is not set
+CONFIG_AVB_LIBAVB=y
+CONFIG_AVB_LIBAVB_AB=y
+CONFIG_AVB_LIBAVB_ATX=y
+CONFIG_AVB_LIBAVB_USER=y
+CONFIG_RK_AVB_LIBAVB_USER=y
+CONFIG_OPTEE_CLIENT=y
+CONFIG_OPTEE_V2=y
+CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
diff --git a/u-boot/configs/rk3588_defconfig b/u-boot/configs/rk3588_defconfig
index 535e9fb..97a9cb8 100644
--- a/u-boot/configs/rk3588_defconfig
+++ b/u-boot/configs/rk3588_defconfig
@@ -12,8 +12,6 @@
 CONFIG_USING_KERNEL_DTB_V2=y
 CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y
 CONFIG_ROCKCHIP_NEW_IDB=y
-CONFIG_LOADER_INI="RK3588MINIALL.ini"
-CONFIG_TRUST_INI="RK3588TRUST.ini"
 CONFIG_PSTORE=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
@@ -45,6 +43,7 @@
 CONFIG_SPL_MMC_WRITE=y
 CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_SPL_ATF=y
+CONFIG_SPL_AB=y
 CONFIG_FASTBOOT_BUF_ADDR=0xc00800
 CONFIG_FASTBOOT_BUF_SIZE=0x07000000
 CONFIG_FASTBOOT_FLASH=y
@@ -204,14 +203,14 @@
 CONFIG_DISPLAY=y
 CONFIG_DRM_ROCKCHIP=y
 CONFIG_DRM_MAXIM_MAX96745=y
-CONFIG_DRM_MAXIM_MAX96752F=y
 CONFIG_DRM_MAXIM_MAX96755F=y
-CONFIG_DRM_PANEL_MAXIM_DESERIALIZER=y
+CONFIG_DRM_PANEL_ROHM_BU18RL82=y
+CONFIG_DRM_PANEL_MAXIM_MAX96752F=y
 CONFIG_DRM_ROHM_BU18XL82=y
 CONFIG_DRM_ROCKCHIP_DW_HDMI_QP=y
 CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI2=y
-CONFIG_DRM_ROCKCHIP_ANALOGIX_DP=y
 CONFIG_DRM_ROCKCHIP_DW_DP=y
+CONFIG_DRM_ROCKCHIP_ANALOGIX_DP=y
 CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY=y
 CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX_HDMI=y
 CONFIG_USE_TINY_PRINTF=y
diff --git a/u-boot/configs/rv1106-display.config b/u-boot/configs/rv1106-display.config
index 842cde0..a03a2bf 100644
--- a/u-boot/configs/rv1106-display.config
+++ b/u-boot/configs/rv1106-display.config
@@ -48,7 +48,7 @@
 # CONFIG_REGULATOR_PWM is not set
 # CONFIG_REGULATOR_RK860X is not set
 CONFIG_ROCKCHIP_CUBIC_LUT_SIZE=0
-# CONFIG_ROCKCHIP_DRM_TVE is not set
+# CONFIG_DRM_ROCKCHIP_TVE is not set
 # CONFIG_ROCKCHIP_INNO_HDMI_PHY is not set
 # CONFIG_SPL_DM_REGULATOR is not set
 # CONFIG_VIDCONSOLE_AS_LCD is not set
diff --git a/u-boot/configs/rv1106-emmc-tb_defconfig b/u-boot/configs/rv1106-emmc-tb_defconfig
index 6929db4..c53ddc0 100644
--- a/u-boot/configs/rv1106-emmc-tb_defconfig
+++ b/u-boot/configs/rv1106-emmc-tb_defconfig
@@ -3,7 +3,7 @@
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x100000
-CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh"
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh"
 CONFIG_ROCKCHIP_RV1106=y
 CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
 CONFIG_ROCKCHIP_FIT_IMAGE=y
@@ -38,12 +38,12 @@
 CONFIG_ANDROID_BOOTLOADER=y
 CONFIG_ANDROID_BOOT_IMAGE_HASH=y
 # CONFIG_SKIP_RELOCATE_UBOOT is not set
+CONFIG_SPL_ADC_SUPPORT=y
 CONFIG_SPL_BOARD_INIT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
 CONFIG_SPL_MMC_WRITE=y
-CONFIG_SPL_OPTEE=y
 CONFIG_SPL_KERNEL_BOOT=y
 CONFIG_HUSH_PARSER=y
 # CONFIG_CMD_BDI is not set
@@ -78,14 +78,19 @@
 CONFIG_SPL_REGMAP=y
 CONFIG_SYSCON=y
 CONFIG_SPL_SYSCON=y
-# CONFIG_ADC is not set
 # CONFIG_SARADC_ROCKCHIP is not set
+CONFIG_SARADC_ROCKCHIP_V2=y
 CONFIG_SPL_BLK_READ_PREPARE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_SPL_DM_CRYPTO=y
+CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y
 CONFIG_ROCKCHIP_GPIO=y
 # CONFIG_DM_I2C is not set
+CONFIG_SPL_INPUT=y
+CONFIG_DM_KEY=y
+CONFIG_ADC_KEY=y
+CONFIG_SPL_ADC_KEY=y
 CONFIG_SPL_MISC=y
 CONFIG_SPL_MISC_DECOMPRESS=y
 CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS=y
diff --git a/u-boot/configs/rv1106-optee.config b/u-boot/configs/rv1106-optee.config
new file mode 100644
index 0000000..dc76adc
--- /dev/null
+++ b/u-boot/configs/rv1106-optee.config
@@ -0,0 +1,5 @@
+CONFIG_BASE_DEFCONFIG="rv1106_defconfig"
+CONFIG_OPTEE_CLIENT=y
+CONFIG_OPTEE_V2=y
+CONFIG_SPL_FIT_IMAGE_KB=512
+CONFIG_SPL_OPTEE=y
diff --git a/u-boot/configs/rv1106-spi-nor-tb_defconfig b/u-boot/configs/rv1106-spi-nor-tb_defconfig
index d518921..e80759e 100644
--- a/u-boot/configs/rv1106-spi-nor-tb_defconfig
+++ b/u-boot/configs/rv1106-spi-nor-tb_defconfig
@@ -3,7 +3,7 @@
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x80000
-CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh"
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh"
 CONFIG_ROCKCHIP_RV1106=y
 CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
 CONFIG_ROCKCHIP_FIT_IMAGE=y
@@ -38,13 +38,13 @@
 CONFIG_ANDROID_BOOTLOADER=y
 CONFIG_ANDROID_BOOT_IMAGE_HASH=y
 # CONFIG_SKIP_RELOCATE_UBOOT is not set
+CONFIG_SPL_ADC_SUPPORT=y
 CONFIG_SPL_BOARD_INIT=y
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
 CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_MTD_BLK_U_BOOT_OFFS=0x200
-CONFIG_SPL_OPTEE=y
 CONFIG_SPL_KERNEL_BOOT=y
 CONFIG_HUSH_PARSER=y
 # CONFIG_CMD_BDI is not set
@@ -81,8 +81,8 @@
 CONFIG_SPL_REGMAP=y
 CONFIG_SYSCON=y
 CONFIG_SPL_SYSCON=y
-# CONFIG_ADC is not set
 # CONFIG_SARADC_ROCKCHIP is not set
+CONFIG_SARADC_ROCKCHIP_V2=y
 CONFIG_SPL_BLK_READ_PREPARE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
@@ -90,6 +90,10 @@
 CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y
 CONFIG_ROCKCHIP_GPIO=y
 # CONFIG_DM_I2C is not set
+CONFIG_SPL_INPUT=y
+CONFIG_DM_KEY=y
+CONFIG_ADC_KEY=y
+CONFIG_SPL_ADC_KEY=y
 CONFIG_SPL_MISC=y
 CONFIG_SPL_MISC_DECOMPRESS=y
 CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS=y
@@ -104,6 +108,7 @@
 CONFIG_SPI_FLASH_GIGADEVICE=y
 CONFIG_SPI_FLASH_MACRONIX=y
 CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_XMC=y
 CONFIG_SPI_FLASH_MTD=y
 CONFIG_PINCTRL=y
 # CONFIG_DM_REGULATOR is not set
diff --git a/u-boot/configs/rv1106-spi-nor_defconfig b/u-boot/configs/rv1106-spi-nor_defconfig
index 47e94ac..d269443 100644
--- a/u-boot/configs/rv1106-spi-nor_defconfig
+++ b/u-boot/configs/rv1106-spi-nor_defconfig
@@ -3,7 +3,7 @@
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x80000
-CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh"
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh"
 CONFIG_ROCKCHIP_RV1106=y
 CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
 # CONFIG_ROCKCHIP_RESOURCE_IMAGE is not set
@@ -30,7 +30,7 @@
 CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y
 CONFIG_SPL_FIT_HW_CRYPTO=y
 # CONFIG_SPL_SYS_DCACHE_OFF is not set
-CONFIG_SPL_FIT_IMAGE_KB=128
+CONFIG_SPL_FIT_IMAGE_KB=192
 CONFIG_SPL_FIT_IMAGE_MULTIPLE=1
 CONFIG_BOOTDELAY=0
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
@@ -40,9 +40,7 @@
 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
 # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
-CONFIG_SPL_MMC_WRITE=y
 CONFIG_SPL_MTD_SUPPORT=y
-CONFIG_SPL_OPTEE=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_CONSOLE is not set
 CONFIG_CMD_BOOTZ=y
@@ -63,12 +61,11 @@
 CONFIG_RANDOM_UUID=y
 # CONFIG_CMD_LOADB is not set
 # CONFIG_CMD_LOADS is not set
-CONFIG_CMD_PART=y
+CONFIG_CMD_MTD=y
 # CONFIG_CMD_ITEST is not set
 CONFIG_CMD_SCRIPT_UPDATE=y
 # CONFIG_CMD_SOURCE is not set
 # CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTP_BOOTM=y
 CONFIG_CMD_TFTP_FLASH=y
 CONFIG_CMD_DHCP=y
 # CONFIG_CMD_NFS is not set
@@ -154,5 +151,4 @@
 CONFIG_RSA_E_SIZE=0x10
 CONFIG_RSA_C_SIZE=0x20
 CONFIG_SPL_LZMA=y
-CONFIG_SPL_GZIP=y
 # CONFIG_EFI_LOADER is not set
diff --git a/u-boot/configs/rv1106-usb.config b/u-boot/configs/rv1106-usb.config
new file mode 100644
index 0000000..dc589f0
--- /dev/null
+++ b/u-boot/configs/rv1106-usb.config
@@ -0,0 +1,17 @@
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_CMD_USB=y
+CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_GENERIC=y
+CONFIG_USB_STORAGE=y
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+# CONFIG_FASTBOOT is not set
+CONFIG_USB_DWC3_GADGET=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
+CONFIG_USB_GADGET_PRODUCT_NUM=0x110c
+CONFIG_USB_GADGET_VENDOR_NUM=0x2207
diff --git a/u-boot/configs/rv1106_defconfig b/u-boot/configs/rv1106_defconfig
index e797553..9b20bcf 100644
--- a/u-boot/configs/rv1106_defconfig
+++ b/u-boot/configs/rv1106_defconfig
@@ -4,7 +4,7 @@
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x80000
-CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh"
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh"
 CONFIG_ROCKCHIP_RV1106=y
 CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
 CONFIG_ROCKCHIP_FIT_IMAGE=y
@@ -41,7 +41,6 @@
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y
 CONFIG_SPL_MMC_WRITE=y
 CONFIG_SPL_MTD_SUPPORT=y
-CONFIG_SPL_OPTEE=y
 CONFIG_HUSH_PARSER=y
 # CONFIG_CMD_BDI is not set
 # CONFIG_CMD_CONSOLE is not set
diff --git a/u-boot/configs/rv1126-bat-spi-nor-tb.config b/u-boot/configs/rv1126-bat-spi-nor-tb.config
index 699d8d0..997a6c2 100644
--- a/u-boot/configs/rv1126-bat-spi-nor-tb.config
+++ b/u-boot/configs/rv1126-bat-spi-nor-tb.config
@@ -2,6 +2,6 @@
 # CONFIG_MMC is not set
 CONFIG_BASE_DEFCONFIG="rv1126-spi-nor-tb.config"
 CONFIG_DEFAULT_DEVICE_TREE="rv1126-bat-evb"
-CONFIG_LOADER_INI="RV1126MINIALL_LP4_EMMC_TB.ini"
+CONFIG_LOADER_INI="RV1126MINIALL_SPI_NOR_TB.ini"
 CONFIG_OF_LIST="rv1126-bat-evb"
 CONFIG_SPL_FIT_IMAGE_KB=320
diff --git a/u-boot/configs/rv1126-ipc.config b/u-boot/configs/rv1126-ipc.config
index 4ab7a51..d4457a0 100644
--- a/u-boot/configs/rv1126-ipc.config
+++ b/u-boot/configs/rv1126-ipc.config
@@ -4,9 +4,11 @@
 # CONFIG_EFI_PARTITION is not set
 CONFIG_ENVF_LIST="blkdevparts mtdparts sys_bootargs app reserved ipaddr serverip netmask gatewayip ethaddr"
 CONFIG_ENVF=y
+CONFIG_ENV_PARTITION=y
 CONFIG_LOADER_INI="RV1126MINIALL_IPC.ini"
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_ENVF=y
+CONFIG_SPL_ENV_PARTITION=y
 CONFIG_NETDEVICES=y
 CONFIG_GMAC_ROCKCHIP=y
 CONFIG_DWC_ETH_QOS=y
diff --git a/u-boot/configs/rv1126-spi-nor-tiny_defconfig b/u-boot/configs/rv1126-spi-nor-tiny_defconfig
index b34446d..eecc02a 100644
--- a/u-boot/configs/rv1126-spi-nor-tiny_defconfig
+++ b/u-boot/configs/rv1126-spi-nor-tiny_defconfig
@@ -126,6 +126,7 @@
 CONFIG_ROCKCHIP_SFC=y
 CONFIG_SYSRESET=y
 CONFIG_USE_TINY_PRINTF=y
+CONFIG_LIB_RAND=y
 CONFIG_SPL_TINY_MEMSET=y
 CONFIG_ERRNO_STR=y
 # CONFIG_EFI_LOADER is not set
diff --git a/u-boot/disk/Kconfig b/u-boot/disk/Kconfig
index cbc2514..cfc6ae8 100644
--- a/u-boot/disk/Kconfig
+++ b/u-boot/disk/Kconfig
@@ -137,15 +137,15 @@
 
 config ENV_PARTITION
 	bool "Enable ENV partition table support"
-	depends on PARTITIONS && ENVF
-	default y
+	depends on PARTITIONS
+	default y if ENVF
 	help
 	  Say Y here if you would like to use ENV partition table.
 
 config SPL_ENV_PARTITION
 	bool "Enable ENV partition table support in SPL"
-	depends on SPL && PARTITIONS && SPL_ENVF
-	default y
+	depends on SPL && PARTITIONS
+	default y if SPL_ENVF
 	help
 	  Say Y here if you would like to use ENV partition table in SPL.
 
diff --git a/u-boot/disk/part.c b/u-boot/disk/part.c
index 116a1ae..182c037 100644
--- a/u-boot/disk/part.c
+++ b/u-boot/disk/part.c
@@ -684,8 +684,9 @@
 					disk_partition_t *info,
 					bool strict)
 {
+	__maybe_unused char name_slot[32] = {0};
 	struct part_driver *part_drv;
-	char name_slot[32] = {0};
+	const char *full_name = name;
 	int none_slot_try = 1;
 	int ret, i;
 
@@ -695,37 +696,35 @@
 
 	if (strict) {
 		none_slot_try = 0;
-		strcpy(name_slot, name);
 		goto lookup;
 	}
 
+	/* 1. Query partition with A/B slot suffix */
 #if defined(CONFIG_ANDROID_AB) || defined(CONFIG_SPL_AB)
-	char *name_suffix = (char *)name + strlen(name) - 2;
+	char *slot = (char *)name + strlen(name) - 2;
 
-	/* Fix can not find partition with suffix "_a" & "_b". If with them, clear */
-	if (!memcmp(name_suffix, "_a", strlen("_a")) ||
-	    !memcmp(name_suffix, "_b", strlen("_b")))
-		memset(name_suffix, 0, 2);
+	if (!strcmp(slot, "_a") || !strcmp(slot, "_b"))
+		goto lookup;
 #endif
 #if defined(CONFIG_ANDROID_AB) && !defined(CONFIG_SPL_BUILD)
-	/* 1. Query partition with A/B slot suffix */
 	if (rk_avb_append_part_slot(name, name_slot))
 		return -1;
+	full_name = name_slot;
 #elif defined(CONFIG_SPL_AB) && defined(CONFIG_SPL_BUILD)
 	if (spl_ab_append_part_slot(dev_desc, name, name_slot))
 		return -1;
-#else
-	strcpy(name_slot, name);
+	full_name = name_slot;
 #endif
+
 lookup:
-	debug("## Query partition(%d): %s\n", none_slot_try, name_slot);
+	debug("## Query partition(%d): %s\n", none_slot_try, full_name);
 	for (i = 1; i < part_drv->max_entries; i++) {
 		ret = part_drv->get_info(dev_desc, i, info);
 		if (ret != 0) {
 			/* no more entries in table */
 			break;
 		}
-		if (strcmp(name_slot, (const char *)info->name) == 0) {
+		if (strcmp(full_name, (const char *)info->name) == 0) {
 			/* matched */
 			return i;
 		}
@@ -734,7 +733,7 @@
 	/* 2. Query partition without A/B slot suffix if above failed */
 	if (none_slot_try) {
 		none_slot_try = 0;
-		strcpy(name_slot, name);
+		full_name = name;
 		goto lookup;
 	}
 
diff --git a/u-boot/disk/part_efi.c b/u-boot/disk/part_efi.c
index 27f3e4d..d4d03de 100644
--- a/u-boot/disk/part_efi.c
+++ b/u-boot/disk/part_efi.c
@@ -368,7 +368,7 @@
 	if (gpt_pte[i - 1].ending_lba <= (dev_desc->lba - 0x22))
 		return;
 	/* The last partition size need align to 4KB, here align to 32KB. */
-	gpt_pte[i - 1].ending_lba = dev_desc->lba - 0x40;
+	gpt_pte[i - 1].ending_lba = dev_desc->lba - 0x41;
 	calc_crc32 = efi_crc32((const unsigned char *)gpt_pte,
 			       le32_to_cpu(gpt_head->num_partition_entries) *
 			       le32_to_cpu(gpt_head->sizeof_partition_entry));
@@ -963,7 +963,8 @@
 		       dev_desc->blksz);
 
 	if ((le64_to_cpu(gpt_h->alternate_lba) + 1)
-			!= cpu_to_le64(dev_desc->lba)) {
+			!= cpu_to_le64(dev_desc->lba) &&
+			le64_to_cpu(gpt_h->last_usable_lba) != FACTORY_UNKNOWN_LBA) {
 		printf("%s: failed checking '%s'\n", __func__,
 		       "invalid GPT Disk Size");
 		return -1;
diff --git a/u-boot/disk/part_env.c b/u-boot/disk/part_env.c
index cb4a903..53c8b39 100644
--- a/u-boot/disk/part_env.c
+++ b/u-boot/disk/part_env.c
@@ -82,14 +82,7 @@
 #if CONFIG_IS_ENABLED(ENVF)
 	parts_list = envf_get_part_table(dev_desc);
 #else
-	const char *parts_prefix[] = { "mtdparts", "blkdevparts", };
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(parts_prefix); i++) {
-		parts_list = env_get(parts_prefix[i]);
-		if (parts_list)
-			break;
-	}
+	parts_list = ENV_PARTITIONS;
 #endif
 	if (!parts_list)
 		return -EINVAL;
diff --git a/u-boot/drivers/Kconfig b/u-boot/drivers/Kconfig
index 21ed0cf..8926208 100644
--- a/u-boot/drivers/Kconfig
+++ b/u-boot/drivers/Kconfig
@@ -102,6 +102,8 @@
 
 source "drivers/usb/Kconfig"
 
+source "drivers/ufs/Kconfig"
+
 source "drivers/video/Kconfig"
 
 source "drivers/watchdog/Kconfig"
diff --git a/u-boot/drivers/Makefile b/u-boot/drivers/Makefile
index 3a9a55a..85c45f4 100644
--- a/u-boot/drivers/Makefile
+++ b/u-boot/drivers/Makefile
@@ -20,6 +20,7 @@
 obj-$(CONFIG_$(SPL_TPL_)SPI_SUPPORT) += spi/
 obj-$(CONFIG_$(SPL_TPL_)TIMER) += timer/
 obj-$(CONFIG_$(SPL_TPL_)IRQ) += irq/
+obj-$(CONFIG_$(SPL_TPL_)DM_VIDEO) += video/
 
 ifndef CONFIG_TPL_BUILD
 ifdef CONFIG_SPL_BUILD
@@ -101,7 +102,6 @@
 obj-y += spmi/
 obj-y += sysreset/
 obj-y += tpm/
-obj-y += video/
 obj-y += watchdog/
 obj-$(CONFIG_QE) += qe/
 obj-$(CONFIG_U_QE) += qe/
@@ -113,6 +113,7 @@
 obj-y += soc/
 obj-$(CONFIG_REMOTEPROC) += remoteproc/
 obj-y += thermal/
+obj-y += ufs/
 
 obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
 endif
diff --git a/u-boot/drivers/adc/rockchip-saradc-v2.c b/u-boot/drivers/adc/rockchip-saradc-v2.c
index c97142e..52fa2e4 100644
--- a/u-boot/drivers/adc/rockchip-saradc-v2.c
+++ b/u-boot/drivers/adc/rockchip-saradc-v2.c
@@ -181,6 +181,9 @@
 	if (IS_ERR_VALUE(ret))
 		return ret;
 
+	/* Wait until pll stable */
+	mdelay(5);
+
 	priv->active_channel = -1;
 
 	return 0;
@@ -220,9 +223,35 @@
 	.clk_rate = 1000000,
 };
 
+static const struct rockchip_saradc_data rk3562_saradc_data = {
+	.num_bits = 10,
+	.num_channels = 8,
+	.clk_rate = 1000000,
+};
+
+static const struct rockchip_saradc_data rk1106_saradc_data = {
+	.num_bits = 10,
+	.num_channels = 2,
+	.clk_rate = 1000000,
+};
+
 static const struct udevice_id rockchip_saradc_ids[] = {
-	{ .compatible = "rockchip,rk3588-saradc",
-	  .data = (ulong)&rk3588_saradc_data },
+	{
+		.compatible = "rockchip,rk3588-saradc",
+		.data = (ulong)&rk3588_saradc_data
+	},
+	{
+		.compatible = "rockchip,rk3528-saradc",
+		.data = (ulong)&rk3588_saradc_data
+	},
+	{
+		.compatible = "rockchip,rk3562-saradc",
+		.data = (ulong)&rk3562_saradc_data
+	},
+	{
+		.compatible = "rockchip,rv1106-saradc",
+		.data = (ulong)&rk1106_saradc_data
+	},
 	{ }
 };
 
diff --git a/u-boot/drivers/clk/clk-uclass.c b/u-boot/drivers/clk/clk-uclass.c
index a4938c1..0737c3d 100644
--- a/u-boot/drivers/clk/clk-uclass.c
+++ b/u-boot/drivers/clk/clk-uclass.c
@@ -237,10 +237,11 @@
 {
 	int ret;
 
+#ifndef CONFIG_SPL_BUILD
 	/* If this is running pre-reloc state, don't take any action. */
 	if (!(gd->flags & GD_FLG_RELOC))
 		return 0;
-
+#endif
 	debug("%s(%s)\n", __func__, dev_read_name(dev));
 
 	ret = clk_set_default_parents(dev);
diff --git a/u-boot/drivers/clk/rockchip/Makefile b/u-boot/drivers/clk/rockchip/Makefile
index 260b24e..80b20a2 100644
--- a/u-boot/drivers/clk/rockchip/Makefile
+++ b/u-boot/drivers/clk/rockchip/Makefile
@@ -17,6 +17,8 @@
 obj-$(CONFIG_ROCKCHIP_RK3328) += clk_rk3328.o
 obj-$(CONFIG_ROCKCHIP_RK3368) += clk_rk3368.o
 obj-$(CONFIG_ROCKCHIP_RK3399) += clk_rk3399.o
+obj-$(CONFIG_ROCKCHIP_RK3528) += clk_rk3528.o
+obj-$(CONFIG_ROCKCHIP_RK3562) += clk_rk3562.o
 obj-$(CONFIG_ROCKCHIP_RK3568) += clk_rk3568.o
 obj-$(CONFIG_ROCKCHIP_RK3588) += clk_rk3588.o
 obj-$(CONFIG_ROCKCHIP_RV1106) += clk_rv1106.o
diff --git a/u-boot/drivers/clk/rockchip/clk_pll.c b/u-boot/drivers/clk/rockchip/clk_pll.c
index 3c1ee9d..056ffaa 100644
--- a/u-boot/drivers/clk/rockchip/clk_pll.c
+++ b/u-boot/drivers/clk/rockchip/clk_pll.c
@@ -267,9 +267,11 @@
 	 * When power on or changing PLL setting,
 	 * we must force PLL into slow mode to ensure output stable clock.
 	 */
-	rk_clrsetreg(base + pll->mode_offset,
-		     pll->mode_mask << pll->mode_shift,
-		     RKCLK_PLL_MODE_SLOW << pll->mode_shift);
+	if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE)) {
+		rk_clrsetreg(base + pll->mode_offset,
+			     pll->mode_mask << pll->mode_shift,
+			     RKCLK_PLL_MODE_SLOW << pll->mode_shift);
+	}
 
 	/* Power down */
 	rk_setreg(base + pll->con_offset + 0x4,
@@ -308,8 +310,11 @@
 	if (!(readl(base + pll->con_offset + 0x4) & (1 << pll->lock_shift)))
 		printf("%s: wait pll lock timeout! pll_id=%ld\n", __func__, pll_id);
 
-	rk_clrsetreg(base + pll->mode_offset, pll->mode_mask << pll->mode_shift,
-		     RKCLK_PLL_MODE_NORMAL << pll->mode_shift);
+	if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE)) {
+		rk_clrsetreg(base + pll->mode_offset, pll->mode_mask << pll->mode_shift,
+			     RKCLK_PLL_MODE_NORMAL << pll->mode_shift);
+	}
+
 	debug("PLL at %p: con0=%x con1= %x con2= %x mode= %x\n",
 	      pll, readl(base + pll->con_offset),
 	      readl(base + pll->con_offset + 0x4),
@@ -325,12 +330,18 @@
 	u32 refdiv, fbdiv, postdiv1, postdiv2, dsmpd, frac;
 	u32 con = 0, shift, mask;
 	ulong rate;
+	int mode;
 
 	con = readl(base + pll->mode_offset);
 	shift = pll->mode_shift;
 	mask = pll->mode_mask << shift;
 
-	switch ((con & mask) >> shift) {
+	if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE))
+		mode = (con & mask) >> shift;
+	else
+		mode = RKCLK_PLL_MODE_NORMAL;
+
+	switch (mode) {
 	case RKCLK_PLL_MODE_SLOW:
 		return OSC_HZ;
 	case RKCLK_PLL_MODE_NORMAL:
diff --git a/u-boot/drivers/clk/rockchip/clk_rk3399.c b/u-boot/drivers/clk/rockchip/clk_rk3399.c
index cce0b48..7fecd68 100644
--- a/u-boot/drivers/clk/rockchip/clk_rk3399.c
+++ b/u-boot/drivers/clk/rockchip/clk_rk3399.c
@@ -773,6 +773,10 @@
 		     ACLK_VOP_PLL_SEL_MASK | ACLK_VOP_DIV_CON_MASK,
 		     ACLK_VOP_PLL_SEL_GPLL << ACLK_VOP_PLL_SEL_SHIFT |
 		     (div - 1) << ACLK_VOP_DIV_CON_SHIFT);
+	rk_clrsetreg(&cru->clksel_con[42],
+		     ACLK_VOP_PLL_SEL_MASK | ACLK_VOP_DIV_CON_MASK,
+		     ACLK_VOP_PLL_SEL_GPLL << ACLK_VOP_PLL_SEL_SHIFT |
+		     (div - 1) << ACLK_VOP_DIV_CON_SHIFT);
 
 	if (readl(dclkreg_addr) & DCLK_VOP_PLL_SEL_MASK) {
 		if (pll_para_config(hz, &cpll_config))
diff --git a/u-boot/drivers/clk/rockchip/clk_rk3528.c b/u-boot/drivers/clk/rockchip/clk_rk3528.c
new file mode 100644
index 0000000..ada7dd4
--- /dev/null
+++ b/u-boot/drivers/clk/rockchip/clk_rk3528.c
@@ -0,0 +1,2145 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2022 Fuzhou Rockchip Electronics Co., Ltd
+ * Author: Joseph Chen <chenjh@rock-chips.com>
+ */
+
+#include <common.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/cru_rk3528.h>
+#include <asm/arch/grf_rk3528.h>
+#include <asm/arch/hardware.h>
+#include <asm/io.h>
+#include <dm/lists.h>
+#include <dt-bindings/clock/rk3528-cru.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define DIV_TO_RATE(input_rate, div)    ((input_rate) / ((div) + 1))
+
+/*
+ *	PLL attention.
+ *
+ * [FRAC PLL]: GPLL, PPLL, DPLL
+ *   - frac mode: refdiv can be 1 or 2 only
+ *   - int mode:  refdiv has no special limit
+ *   - VCO range: [950, 3800] MHZ
+ *
+ * [INT PLL]:  CPLL, APLL
+ *   - int mode:  refdiv can be 1 or 2 only
+ *   - VCO range: [475, 1900] MHZ
+ *
+ * [PPLL]: normal mode only.
+ *
+ */
+static struct rockchip_pll_rate_table rk3528_pll_rates[] = {
+	/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
+	RK3036_PLL_RATE(1896000000, 1, 79, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1800000000, 1, 75, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1704000000, 1, 71, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0),		/* GPLL */
+	RK3036_PLL_RATE(1092000000, 2, 91, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1008000000, 1, 42, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1000000000, 1, 125, 3, 1, 1, 0), 	/* PPLL */
+	RK3036_PLL_RATE(996000000, 2, 83, 1, 1, 1, 0),		/* CPLL */
+	RK3036_PLL_RATE(960000000, 1, 40, 1, 1, 1, 0),
+	RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
+	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
+	RK3036_PLL_RATE(600000000, 1, 50, 2, 1, 1, 0),
+	RK3036_PLL_RATE(594000000, 2, 99, 2, 1, 1, 0),
+	RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
+	RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
+	RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
+	RK3036_PLL_RATE(96000000, 1, 24, 3, 2, 1, 0),
+	{ /* sentinel */ },
+};
+
+static struct rockchip_pll_clock rk3528_pll_clks[] = {
+	[APLL] = PLL(pll_rk3328, PLL_APLL, RK3528_PLL_CON(0),
+		     RK3528_MODE_CON, 0, 10, 0, rk3528_pll_rates),
+
+	[CPLL] = PLL(pll_rk3328, PLL_CPLL, RK3528_PLL_CON(8),
+		     RK3528_MODE_CON, 2, 10, 0, rk3528_pll_rates),
+
+	[GPLL] = PLL(pll_rk3328, PLL_GPLL, RK3528_PLL_CON(24),
+		     RK3528_MODE_CON, 4, 10, 0, rk3528_pll_rates),
+
+	[PPLL] = PLL(pll_rk3328, PLL_PPLL, RK3528_PCIE_PLL_CON(32),
+		     RK3528_MODE_CON, 6, 10, ROCKCHIP_PLL_FIXED_MODE, rk3528_pll_rates),
+
+	[DPLL] = PLL(pll_rk3328, PLL_DPLL, RK3528_DDRPHY_PLL_CON(16),
+		     RK3528_DDRPHY_MODE_CON, 0, 10, 0, rk3528_pll_rates),
+};
+
+#define RK3528_CPUCLK_RATE(_rate, _aclk_m_core, _pclk_dbg)	\
+{								\
+	.rate = _rate##U,					\
+	.aclk_div = (_aclk_m_core),				\
+	.pclk_div = (_pclk_dbg),				\
+}
+
+/* sign-off: _aclk_m_core: 550M, _pclk_dbg: 137.5M, */
+static struct rockchip_cpu_rate_table rk3528_cpu_rates[] = {
+	RK3528_CPUCLK_RATE(1896000000, 1, 13),
+	RK3528_CPUCLK_RATE(1800000000, 1, 12),
+	RK3528_CPUCLK_RATE(1704000000, 1, 11),
+	RK3528_CPUCLK_RATE(1608000000, 1, 11),
+	RK3528_CPUCLK_RATE(1512000000, 1, 11),
+	RK3528_CPUCLK_RATE(1416000000, 1, 9),
+	RK3528_CPUCLK_RATE(1296000000, 1, 8),
+	RK3528_CPUCLK_RATE(1200000000, 1, 8),
+	RK3528_CPUCLK_RATE(1188000000, 1, 8),
+	RK3528_CPUCLK_RATE(1092000000, 1, 7),
+	RK3528_CPUCLK_RATE(1008000000, 1, 6),
+	RK3528_CPUCLK_RATE(1000000000, 1, 6),
+	RK3528_CPUCLK_RATE(996000000, 1, 6),
+	RK3528_CPUCLK_RATE(960000000, 1, 6),
+	RK3528_CPUCLK_RATE(912000000, 1, 6),
+	RK3528_CPUCLK_RATE(816000000, 1, 5),
+	RK3528_CPUCLK_RATE(600000000, 1, 3),
+	RK3528_CPUCLK_RATE(594000000, 1, 3),
+	RK3528_CPUCLK_RATE(408000000, 1, 2),
+	RK3528_CPUCLK_RATE(312000000, 1, 2),
+	RK3528_CPUCLK_RATE(216000000, 1, 1),
+	RK3528_CPUCLK_RATE(96000000, 1, 0),
+};
+
+#ifndef CONFIG_SPL_BUILD
+#define RK3528_CLK_DUMP(_id, _name)		\
+{						\
+	.id = _id,				\
+	.name = _name,				\
+}
+
+static const struct rk3528_clk_info clks_dump[] = {
+	RK3528_CLK_DUMP(PLL_APLL, "apll"),
+	RK3528_CLK_DUMP(PLL_GPLL, "gpll"),
+	RK3528_CLK_DUMP(PLL_CPLL, "cpll"),
+	RK3528_CLK_DUMP(PLL_DPLL, "dpll"),
+	RK3528_CLK_DUMP(PLL_PPLL, "ppll"),
+	RK3528_CLK_DUMP(CLK_MATRIX_50M_SRC,   "clk_50m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_100M_SRC,  "clk_100m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_150M_SRC,  "clk_150m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_200M_SRC,  "clk_200m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_250M_SRC,  "clk_250m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_300M_SRC,  "clk_300m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_339M_SRC,  "clk_339m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_400M_SRC,  "clk_400m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_500M_SRC,  "clk_500m"),
+	RK3528_CLK_DUMP(CLK_MATRIX_600M_SRC,  "clk_600m"),
+	RK3528_CLK_DUMP(CLK_PPLL_50M_MATRIX,  "clk_ppll_50m"),
+	RK3528_CLK_DUMP(CLK_PPLL_100M_MATRIX, "clk_ppll_100m"),
+	RK3528_CLK_DUMP(CLK_PPLL_125M_MATRIX, "clk_ppll_125m"),
+};
+#endif
+
+/*
+ *
+ * rational_best_approximation(31415, 10000,
+ *		(1 << 8) - 1, (1 << 5) - 1, &n, &d);
+ *
+ * you may look at given_numerator as a fixed point number,
+ * with the fractional part size described in given_denominator.
+ *
+ * for theoretical background, see:
+ * http://en.wikipedia.org/wiki/Continued_fraction
+ */
+static void rational_best_approximation(unsigned long given_numerator,
+					unsigned long given_denominator,
+					unsigned long max_numerator,
+					unsigned long max_denominator,
+					unsigned long *best_numerator,
+					unsigned long *best_denominator)
+{
+	unsigned long n, d, n0, d0, n1, d1;
+
+	n = given_numerator;
+	d = given_denominator;
+	n0 = 0;
+	d1 = 0;
+	n1 = 1;
+	d0 = 1;
+	for (;;) {
+		unsigned long t, a;
+
+		if (n1 > max_numerator || d1 > max_denominator) {
+			n1 = n0;
+			d1 = d0;
+			break;
+		}
+		if (d == 0)
+			break;
+		t = d;
+		a = n / d;
+		d = n % d;
+		n = t;
+		t = n0 + a * n1;
+		n0 = n1;
+		n1 = t;
+		t = d0 + a * d1;
+		d0 = d1;
+		d1 = t;
+	}
+	*best_numerator = n1;
+	*best_denominator = d1;
+}
+
+static int rk3528_armclk_set_clk(struct rk3528_clk_priv *priv, ulong new_rate)
+{
+	const struct rockchip_cpu_rate_table *rate;
+	struct rk3528_cru *cru = priv->cru;
+	ulong old_rate;
+
+	rate = rockchip_get_cpu_settings(rk3528_cpu_rates, new_rate);
+	if (!rate) {
+		printf("%s unsupported rate\n", __func__);
+		return -EINVAL;
+	}
+
+	/*
+	 * set up dependent divisors for DBG and ACLK clocks.
+	 */
+	old_rate = rockchip_pll_get_rate(&rk3528_pll_clks[APLL], priv->cru, APLL);
+	if (old_rate > new_rate) {
+		if (rockchip_pll_set_rate(&rk3528_pll_clks[APLL],
+					  priv->cru, APLL, new_rate))
+			return -EINVAL;
+
+		rk_clrsetreg(&cru->clksel_con[40], RK3528_DIV_PCLK_DBG_MASK,
+			     rate->pclk_div << RK3528_DIV_PCLK_DBG_SHIFT);
+
+		rk_clrsetreg(&cru->clksel_con[39], RK3528_DIV_ACLK_M_CORE_MASK,
+			     rate->aclk_div << RK3528_DIV_ACLK_M_CORE_SHIFT);
+	} else if (old_rate < new_rate) {
+		rk_clrsetreg(&cru->clksel_con[40], RK3528_DIV_PCLK_DBG_MASK,
+			     rate->pclk_div << RK3528_DIV_PCLK_DBG_SHIFT);
+
+		rk_clrsetreg(&cru->clksel_con[39], RK3528_DIV_ACLK_M_CORE_MASK,
+			     rate->aclk_div << RK3528_DIV_ACLK_M_CORE_SHIFT);
+
+		if (rockchip_pll_set_rate(&rk3528_pll_clks[APLL],
+					  priv->cru, APLL, new_rate))
+			return -EINVAL;
+	}
+
+	return 0;
+}
+
+static ulong rk3528_ppll_matrix_get_rate(struct rk3528_clk_priv *priv,
+				      ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, mask, shift;
+	void *reg;
+
+	switch (clk_id) {
+	case CLK_PPLL_50M_MATRIX:
+	case CLK_GMAC1_RMII_VPU:
+		mask = PCIE_CLK_MATRIX_50M_SRC_DIV_MASK;
+		shift = PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT;
+		reg = &cru->pcieclksel_con[1];
+		break;
+
+	case CLK_PPLL_100M_MATRIX:
+		mask = PCIE_CLK_MATRIX_100M_SRC_DIV_MASK;
+		shift = PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT;
+		reg = &cru->pcieclksel_con[1];
+		break;
+
+	case CLK_PPLL_125M_MATRIX:
+	case CLK_GMAC1_SRC_VPU:
+		mask = CLK_MATRIX_125M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_125M_SRC_DIV_SHIFT;
+		reg = &cru->clksel_con[60];
+		break;
+
+	case CLK_GMAC1_VPU_25M:
+		mask = CLK_MATRIX_25M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_25M_SRC_DIV_SHIFT;
+		reg = &cru->clksel_con[60];
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	div = (readl(reg) & mask) >> shift;
+
+	return DIV_TO_RATE(priv->ppll_hz, div);
+}
+
+static ulong rk3528_ppll_matrix_set_rate(struct rk3528_clk_priv *priv,
+				      ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, div, mask, shift;
+	u8 is_pciecru = 0;
+
+	switch (clk_id) {
+	case CLK_PPLL_50M_MATRIX:
+		id = 1;
+		mask = PCIE_CLK_MATRIX_50M_SRC_DIV_MASK;
+		shift = PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT;
+		is_pciecru = 1;
+		break;
+
+	case CLK_PPLL_100M_MATRIX:
+		id = 1;
+		mask = PCIE_CLK_MATRIX_100M_SRC_DIV_MASK;
+		shift = PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT;
+		is_pciecru = 1;
+		break;
+
+	case CLK_PPLL_125M_MATRIX:
+		id = 60;
+		mask = CLK_MATRIX_125M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_125M_SRC_DIV_SHIFT;
+		break;
+	case CLK_GMAC1_VPU_25M:
+		id = 60;
+		mask = CLK_MATRIX_25M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_25M_SRC_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	div = DIV_ROUND_UP(priv->ppll_hz, rate);
+	if (is_pciecru)
+		rk_clrsetreg(&cru->pcieclksel_con[id], mask, (div - 1) << shift);
+	else
+		rk_clrsetreg(&cru->clksel_con[id], mask, (div - 1) << shift);
+
+	return rk3528_ppll_matrix_get_rate(priv, clk_id);
+}
+
+static ulong rk3528_cgpll_matrix_get_rate(struct rk3528_clk_priv *priv,
+				      ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 sel, div, mask, shift, con;
+	u32 sel_mask = 0, sel_shift;
+	u8 is_gpll_parent = 1;
+	u8 is_halfdiv = 0;
+	ulong prate;
+
+	switch (clk_id) {
+	case CLK_MATRIX_50M_SRC:
+		con = 0;
+		mask = CLK_MATRIX_50M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_50M_SRC_DIV_SHIFT;
+		is_gpll_parent = 0;
+		break;
+
+	case CLK_MATRIX_100M_SRC:
+		con = 0;
+		mask = CLK_MATRIX_100M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_100M_SRC_DIV_SHIFT;
+		is_gpll_parent = 0;
+		break;
+
+	case CLK_MATRIX_150M_SRC:
+		con = 1;
+		mask = CLK_MATRIX_150M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_150M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_200M_SRC:
+		con = 1;
+		mask = CLK_MATRIX_200M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_200M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_250M_SRC:
+		con = 1;
+		mask = CLK_MATRIX_250M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_250M_SRC_DIV_SHIFT;
+		sel_mask = CLK_MATRIX_250M_SRC_SEL_MASK;
+		sel_shift = CLK_MATRIX_250M_SRC_SEL_SHIFT;
+		break;
+
+	case CLK_MATRIX_300M_SRC:
+		con = 2;
+		mask = CLK_MATRIX_300M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_300M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_339M_SRC:
+		con = 2;
+		mask = CLK_MATRIX_339M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_339M_SRC_DIV_SHIFT;
+		is_halfdiv = 1;
+		break;
+
+	case CLK_MATRIX_400M_SRC:
+		con = 2;
+		mask = CLK_MATRIX_400M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_400M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_500M_SRC:
+		con = 3;
+		mask = CLK_MATRIX_500M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_500M_SRC_DIV_SHIFT;
+		sel_mask = CLK_MATRIX_500M_SRC_SEL_MASK;
+		sel_shift = CLK_MATRIX_500M_SRC_SEL_SHIFT;
+		break;
+
+	case CLK_MATRIX_600M_SRC:
+		con = 4;
+		mask = CLK_MATRIX_600M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_600M_SRC_DIV_SHIFT;
+		break;
+
+	case ACLK_BUS_VOPGL_ROOT:
+	case ACLK_BUS_VOPGL_BIU:
+		con = 43;
+		mask = ACLK_BUS_VOPGL_ROOT_DIV_MASK;
+		shift = ACLK_BUS_VOPGL_ROOT_DIV_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	if (sel_mask) {
+		sel = (readl(&cru->clksel_con[con]) & sel_mask) >> sel_shift;
+		if (sel == CLK_MATRIX_250M_SRC_SEL_CLK_GPLL_MUX) // TODO
+			prate = priv->gpll_hz;
+		else
+			prate = priv->cpll_hz;
+	} else {
+		if (is_gpll_parent)
+			prate = priv->gpll_hz;
+		else
+			prate = priv->cpll_hz;
+	}
+
+	div = (readl(&cru->clksel_con[con]) & mask) >> shift;
+
+	/* NOTE: '-1' to balance the DIV_TO_RATE() 'div+1' */
+	return is_halfdiv ? DIV_TO_RATE(prate * 2, (3 + 2 * div) - 1) : DIV_TO_RATE(prate, div);
+}
+
+static ulong rk3528_cgpll_matrix_set_rate(struct rk3528_clk_priv *priv,
+				      ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 sel, div, mask, shift, con;
+	u32 sel_mask = 0, sel_shift;
+	u8 is_gpll_parent = 1;
+	u8 is_halfdiv = 0;
+	ulong prate = 0;
+
+	switch (clk_id) {
+	case CLK_MATRIX_50M_SRC:
+		con = 0;
+		mask = CLK_MATRIX_50M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_50M_SRC_DIV_SHIFT;
+		is_gpll_parent = 0;
+		break;
+
+	case CLK_MATRIX_100M_SRC:
+		con = 0;
+		mask = CLK_MATRIX_100M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_100M_SRC_DIV_SHIFT;
+		is_gpll_parent = 0;
+		break;
+
+	case CLK_MATRIX_150M_SRC:
+		con = 1;
+		mask = CLK_MATRIX_150M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_150M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_200M_SRC:
+		con = 1;
+		mask = CLK_MATRIX_200M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_200M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_250M_SRC:
+		con = 1;
+		mask = CLK_MATRIX_250M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_250M_SRC_DIV_SHIFT;
+		sel_mask = CLK_MATRIX_250M_SRC_SEL_MASK;
+		sel_shift = CLK_MATRIX_250M_SRC_SEL_SHIFT;
+		break;
+
+	case CLK_MATRIX_300M_SRC:
+		con = 2;
+		mask = CLK_MATRIX_300M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_300M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_339M_SRC:
+		con = 2;
+		mask = CLK_MATRIX_339M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_339M_SRC_DIV_SHIFT;
+		is_halfdiv = 1;
+		break;
+
+	case CLK_MATRIX_400M_SRC:
+		con = 2;
+		mask = CLK_MATRIX_400M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_400M_SRC_DIV_SHIFT;
+		break;
+
+	case CLK_MATRIX_500M_SRC:
+		con = 3;
+		mask = CLK_MATRIX_500M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_500M_SRC_DIV_SHIFT;
+		sel_mask = CLK_MATRIX_500M_SRC_SEL_MASK;
+		sel_shift = CLK_MATRIX_500M_SRC_SEL_SHIFT;
+		break;
+
+	case CLK_MATRIX_600M_SRC:
+		con = 4;
+		mask = CLK_MATRIX_600M_SRC_DIV_MASK;
+		shift = CLK_MATRIX_600M_SRC_DIV_SHIFT;
+		break;
+
+	case ACLK_BUS_VOPGL_ROOT:
+	case ACLK_BUS_VOPGL_BIU:
+		con = 43;
+		mask = ACLK_BUS_VOPGL_ROOT_DIV_MASK;
+		shift = ACLK_BUS_VOPGL_ROOT_DIV_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	if (sel_mask) {
+		if (priv->gpll_hz % rate == 0) {
+			sel = CLK_MATRIX_250M_SRC_SEL_CLK_GPLL_MUX; // TODO
+			prate = priv->gpll_hz;
+		} else {
+			sel = CLK_MATRIX_250M_SRC_SEL_CLK_CPLL_MUX;
+			prate = priv->cpll_hz;
+		}
+	} else {
+		if (is_gpll_parent)
+			prate = priv->gpll_hz;
+		else
+			prate = priv->cpll_hz;
+	}
+
+	if (is_halfdiv)
+		/* NOTE: '+1' to balance the following rk_clrsetreg() 'div-1' */
+		div = DIV_ROUND_UP((prate * 2) - (3 * rate), 2 * rate) + 1;
+	else
+		div = DIV_ROUND_UP(prate, rate);
+
+	rk_clrsetreg(&cru->clksel_con[con], mask, (div - 1) << shift);
+	if (sel_mask)
+		rk_clrsetreg(&cru->clksel_con[con], sel_mask, sel << sel_shift);
+
+	return rk3528_cgpll_matrix_get_rate(priv, clk_id);
+}
+
+static ulong rk3528_i2c_get_clk(struct rk3528_clk_priv *priv, ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, con, mask, shift;
+	u8 is_pmucru = 0;
+	ulong rate;
+	
+	switch (clk_id) {
+	case CLK_I2C0:
+		id = 79;
+		mask = CLK_I2C0_SEL_MASK;
+		shift = CLK_I2C0_SEL_SHIFT;
+		break;
+
+	case CLK_I2C1:
+		id = 79;
+		mask = CLK_I2C1_SEL_MASK;
+		shift = CLK_I2C1_SEL_SHIFT;
+		break;
+
+	case CLK_I2C2:
+		id = 0;
+		mask = CLK_I2C2_SEL_MASK;
+		shift = CLK_I2C2_SEL_SHIFT;
+		is_pmucru = 1;
+		break;
+
+	case CLK_I2C3:
+		id = 63;
+		mask = CLK_I2C3_SEL_MASK;
+		shift = CLK_I2C3_SEL_SHIFT;
+		break;
+
+	case CLK_I2C4:
+		id = 85;
+		mask = CLK_I2C4_SEL_MASK;
+		shift = CLK_I2C4_SEL_SHIFT;
+		break;
+
+	case CLK_I2C5:
+		id = 63;
+		mask = CLK_I2C5_SEL_MASK;
+		shift = CLK_I2C5_SEL_SHIFT;
+		break;
+
+	case CLK_I2C6:
+		id = 64;
+		mask = CLK_I2C6_SEL_MASK;
+		shift = CLK_I2C6_SEL_SHIFT;
+		break;
+
+	case CLK_I2C7:
+		id = 86;
+		mask = CLK_I2C7_SEL_MASK;
+		shift = CLK_I2C7_SEL_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	if (is_pmucru)
+		con = readl(&cru->pmuclksel_con[id]);
+	else
+		con = readl(&cru->clksel_con[id]);
+	sel = (con & mask) >> shift;
+	if (sel == CLK_I2C3_SEL_CLK_MATRIX_200M_SRC)
+		rate = 200 * MHz;
+	else if (sel == CLK_I2C3_SEL_CLK_MATRIX_100M_SRC)
+		rate = 100 * MHz;
+	else if (sel == CLK_I2C3_SEL_CLK_MATRIX_50M_SRC)
+		rate = 50 * MHz;
+	else
+		rate = OSC_HZ;
+
+	return rate;
+}
+
+static ulong rk3528_i2c_set_clk(struct rk3528_clk_priv *priv, ulong clk_id,
+				ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, mask, shift;
+	u8 is_pmucru = 0;
+
+	if (rate == 200 * MHz)
+		sel = CLK_I2C3_SEL_CLK_MATRIX_200M_SRC;
+	else if (rate == 100 * MHz)
+		sel = CLK_I2C3_SEL_CLK_MATRIX_100M_SRC;
+	else if (rate == 50 * MHz)
+		sel = CLK_I2C3_SEL_CLK_MATRIX_50M_SRC;
+	else
+		sel = CLK_I2C3_SEL_XIN_OSC0_FUNC;
+
+	switch (clk_id) {
+	case CLK_I2C0:
+		id = 79;
+		mask = CLK_I2C0_SEL_MASK;
+		shift = CLK_I2C0_SEL_SHIFT;
+		break;
+
+	case CLK_I2C1:
+		id = 79;
+		mask = CLK_I2C1_SEL_MASK;
+		shift = CLK_I2C1_SEL_SHIFT;
+		break;
+
+	case CLK_I2C2:
+		id = 0;
+		mask = CLK_I2C2_SEL_MASK;
+		shift = CLK_I2C2_SEL_SHIFT;
+		is_pmucru = 1;
+		break;
+
+	case CLK_I2C3:
+		id = 63;
+		mask = CLK_I2C3_SEL_MASK;
+		shift = CLK_I2C3_SEL_SHIFT;
+		break;
+
+	case CLK_I2C4:
+		id = 85;
+		mask = CLK_I2C4_SEL_MASK;
+		shift = CLK_I2C4_SEL_SHIFT;
+		break;
+
+	case CLK_I2C5:
+		id = 63;
+		mask = CLK_I2C5_SEL_MASK;
+		shift = CLK_I2C5_SEL_SHIFT;
+
+	case CLK_I2C6:
+		id = 64;
+		mask = CLK_I2C6_SEL_MASK;
+		shift = CLK_I2C6_SEL_SHIFT;
+		break;
+
+	case CLK_I2C7:
+		id = 86;
+		mask = CLK_I2C7_SEL_MASK;
+		shift = CLK_I2C7_SEL_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	if (is_pmucru)
+		rk_clrsetreg(&cru->pmuclksel_con[id], mask, sel << shift);
+	else
+		rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift);
+
+	return rk3528_i2c_get_clk(priv, clk_id);
+}
+
+static ulong rk3528_spi_get_clk(struct rk3528_clk_priv *priv, ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, con, mask, shift;
+	ulong rate;
+
+	switch (clk_id) {
+	case CLK_SPI0:
+		id = 79;
+		mask = CLK_SPI0_SEL_MASK;
+		shift = CLK_SPI0_SEL_SHIFT;
+		break;
+
+	case CLK_SPI1:
+		id = 63;
+		mask = CLK_SPI1_SEL_MASK;
+		shift = CLK_SPI1_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	con = readl(&cru->clksel_con[id]);
+	sel = (con & mask) >> shift;
+	if (sel == CLK_SPI1_SEL_CLK_MATRIX_200M_SRC)
+		rate = 200 * MHz;
+	else if (sel == CLK_SPI1_SEL_CLK_MATRIX_100M_SRC)
+		rate = 100 * MHz;
+	else if (sel == CLK_SPI1_SEL_CLK_MATRIX_50M_SRC)
+		rate = 50 * MHz;
+	else
+		rate = OSC_HZ;
+
+	return rate;
+}
+
+static ulong rk3528_spi_set_clk(struct rk3528_clk_priv *priv,
+				ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, mask, shift;
+
+	if (rate == 200 * MHz)
+		sel = CLK_SPI1_SEL_CLK_MATRIX_200M_SRC;
+	else if (rate == 100 * MHz)
+		sel = CLK_SPI1_SEL_CLK_MATRIX_100M_SRC;
+	else if (rate == 50 * MHz)
+		sel = CLK_SPI1_SEL_CLK_MATRIX_50M_SRC;
+	else
+		sel = CLK_SPI1_SEL_XIN_OSC0_FUNC;
+
+	switch (clk_id) {
+	case CLK_SPI0:
+		id = 79;
+		mask = CLK_SPI0_SEL_MASK;
+		shift = CLK_SPI0_SEL_SHIFT;
+		break;
+
+	case CLK_SPI1:
+		id = 63;
+		mask = CLK_SPI1_SEL_MASK;
+		shift = CLK_SPI1_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift);
+
+	return rk3528_spi_get_clk(priv, clk_id);
+}
+
+static ulong rk3528_pwm_get_clk(struct rk3528_clk_priv *priv, ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, con, mask, shift;
+	ulong rate;
+
+	switch (clk_id) {
+	case CLK_PWM0:
+		id = 44;
+		mask = CLK_PWM0_SEL_MASK;
+		shift = CLK_PWM0_SEL_SHIFT;
+		break;
+
+	case CLK_PWM1:
+		id = 44;
+		mask = CLK_PWM1_SEL_MASK;
+		shift = CLK_PWM1_SEL_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	con = readl(&cru->clksel_con[id]);
+	sel = (con & mask) >> shift;
+	if (sel == CLK_PWM0_SEL_CLK_MATRIX_100M_SRC)
+		rate = 100 * MHz;
+	if (sel == CLK_PWM0_SEL_CLK_MATRIX_50M_SRC)
+		rate = 50 * MHz;
+	else
+		rate = OSC_HZ;
+
+	return rate;
+}
+
+static ulong rk3528_pwm_set_clk(struct rk3528_clk_priv *priv,
+				ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, mask, shift;
+
+	if (rate == 100 * MHz)
+		sel = CLK_PWM0_SEL_CLK_MATRIX_100M_SRC;
+	else if (rate == 50 * MHz)
+		sel = CLK_PWM0_SEL_CLK_MATRIX_50M_SRC;
+	else
+		sel = CLK_PWM0_SEL_XIN_OSC0_FUNC;
+
+	switch (clk_id) {
+	case CLK_PWM0:
+		id = 44;
+		mask = CLK_PWM0_SEL_MASK;
+		shift = CLK_PWM0_SEL_SHIFT;
+		break;
+
+	case CLK_PWM1:
+		id = 44;
+		mask = CLK_PWM1_SEL_MASK;
+		shift = CLK_PWM1_SEL_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift);
+
+	return rk3528_pwm_get_clk(priv, clk_id);
+}
+
+static ulong rk3528_adc_get_clk(struct rk3528_clk_priv *priv, ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, con;
+
+	con = readl(&cru->clksel_con[74]);
+	switch (clk_id) {
+	case CLK_SARADC:
+		div = (con & CLK_SARADC_DIV_MASK) >>
+			CLK_SARADC_DIV_SHIFT;
+		break;
+
+	case CLK_TSADC_TSEN:
+		div = (con & CLK_TSADC_TSEN_DIV_MASK) >>
+			CLK_TSADC_TSEN_DIV_SHIFT;
+		break;
+
+	case CLK_TSADC:
+		div = (con & CLK_TSADC_DIV_MASK) >>
+			CLK_TSADC_DIV_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(OSC_HZ, div);
+}
+
+static ulong rk3528_adc_set_clk(struct rk3528_clk_priv *priv,
+				ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, mask, shift;
+
+	switch (clk_id) {
+	case CLK_SARADC:
+		mask = CLK_SARADC_DIV_MASK;
+		shift =	CLK_SARADC_DIV_SHIFT;
+		break;
+
+	case CLK_TSADC_TSEN:
+		mask = CLK_TSADC_TSEN_DIV_MASK;
+		shift =	CLK_TSADC_TSEN_DIV_SHIFT;
+		break;
+
+	case CLK_TSADC:
+		mask = CLK_TSADC_DIV_MASK;
+		shift =	CLK_TSADC_DIV_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	div = DIV_ROUND_UP(OSC_HZ, rate);
+	rk_clrsetreg(&cru->clksel_con[74], mask, (div - 1) << shift);
+
+	return rk3528_adc_get_clk(priv, clk_id);
+}
+
+static ulong rk3528_sdmmc_get_clk(struct rk3528_clk_priv *priv, ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, sel, con;
+	ulong prate;
+
+	con = readl(&cru->clksel_con[85]);
+	div = (con & CCLK_SRC_SDMMC0_DIV_MASK) >>
+		CCLK_SRC_SDMMC0_DIV_SHIFT;
+	sel = (con & CCLK_SRC_SDMMC0_SEL_MASK) >>
+		CCLK_SRC_SDMMC0_SEL_SHIFT;
+
+	if (sel == CCLK_SRC_SDMMC0_SEL_CLK_GPLL_MUX)
+		prate = priv->gpll_hz;
+	else if (sel == CCLK_SRC_SDMMC0_SEL_CLK_CPLL_MUX)
+		prate = priv->cpll_hz;
+	else
+		prate = OSC_HZ;
+
+	return DIV_TO_RATE(prate, div);
+}
+
+static ulong rk3528_sdmmc_set_clk(struct rk3528_clk_priv *priv,
+				  ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, sel;
+
+	if (OSC_HZ % rate == 0) {
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+		sel = CCLK_SRC_SDMMC0_SEL_XIN_OSC0_FUNC;
+	} else if ((priv->cpll_hz % rate) == 0) {
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+		sel = CCLK_SRC_SDMMC0_SEL_CLK_CPLL_MUX;
+	} else {
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+		sel = CCLK_SRC_SDMMC0_SEL_CLK_GPLL_MUX;
+	}
+
+	assert(div - 1 <= 31);
+	rk_clrsetreg(&cru->clksel_con[85],
+		     CCLK_SRC_SDMMC0_SEL_MASK |
+		     CCLK_SRC_SDMMC0_DIV_MASK,
+		     sel << CCLK_SRC_SDMMC0_SEL_SHIFT |
+		     (div - 1) << CCLK_SRC_SDMMC0_DIV_SHIFT);
+
+	return rk3528_sdmmc_get_clk(priv, clk_id);
+}
+
+static ulong rk3528_sfc_get_clk(struct rk3528_clk_priv *priv)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, sel, con, parent;
+
+	con = readl(&cru->clksel_con[61]);
+	div = (con & SCLK_SFC_DIV_MASK) >>
+		SCLK_SFC_DIV_SHIFT;
+	sel = (con & SCLK_SFC_SEL_MASK) >>
+		SCLK_SFC_SEL_SHIFT;
+	if (sel == SCLK_SFC_SEL_CLK_GPLL_MUX)
+		parent = priv->gpll_hz;
+	else if (sel == SCLK_SFC_SEL_CLK_CPLL_MUX)
+		parent = priv->cpll_hz;
+	else
+		parent = OSC_HZ;
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3528_sfc_set_clk(struct rk3528_clk_priv *priv, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	int div, sel;
+
+	if (OSC_HZ % rate == 0) {
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+		sel = SCLK_SFC_SEL_XIN_OSC0_FUNC;
+	} else if ((priv->cpll_hz % rate) == 0) {
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+		sel = SCLK_SFC_SEL_CLK_CPLL_MUX;
+	} else {
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+		sel = SCLK_SFC_SEL_CLK_GPLL_MUX;
+	}
+
+	assert(div - 1 <= 63);
+	rk_clrsetreg(&cru->clksel_con[61],
+		     SCLK_SFC_SEL_MASK |
+		     SCLK_SFC_DIV_MASK,
+		     sel << SCLK_SFC_SEL_SHIFT |
+		     (div - 1) << SCLK_SFC_DIV_SHIFT);
+
+	return rk3528_sfc_get_clk(priv);
+}
+
+static ulong rk3528_emmc_get_clk(struct rk3528_clk_priv *priv)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, sel, con, parent;
+
+	con = readl(&cru->clksel_con[62]);
+	div = (con & CCLK_SRC_EMMC_DIV_MASK) >>
+		CCLK_SRC_EMMC_DIV_SHIFT;
+	sel = (con & CCLK_SRC_EMMC_SEL_MASK) >>
+		CCLK_SRC_EMMC_SEL_SHIFT;
+
+	if (sel == CCLK_SRC_EMMC_SEL_CLK_GPLL_MUX)
+		parent = priv->gpll_hz;
+	else if (sel == CCLK_SRC_EMMC_SEL_CLK_CPLL_MUX)
+		parent = priv->cpll_hz;
+	else
+		parent = OSC_HZ;
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3528_emmc_set_clk(struct rk3528_clk_priv *priv, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div, sel;
+
+	if (OSC_HZ % rate == 0) {
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+		sel = CCLK_SRC_EMMC_SEL_XIN_OSC0_FUNC;
+	} else if ((priv->cpll_hz % rate) == 0) {
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+		sel = CCLK_SRC_EMMC_SEL_CLK_CPLL_MUX;
+	} else {
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+		sel = CCLK_SRC_EMMC_SEL_CLK_GPLL_MUX;
+	}
+
+	assert(div - 1 <= 31);
+	rk_clrsetreg(&cru->clksel_con[62],
+		     CCLK_SRC_EMMC_SEL_MASK |
+		     CCLK_SRC_EMMC_DIV_MASK,
+		     sel << CCLK_SRC_EMMC_SEL_SHIFT |
+		     (div - 1) << CCLK_SRC_EMMC_DIV_SHIFT);
+
+	return rk3528_emmc_get_clk(priv);
+}
+
+static ulong rk3528_dclk_vop_get_clk(struct rk3528_clk_priv *priv, ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div_mask, div_shift;
+	u32 sel_mask, sel_shift;
+	u32 id, con, sel, div;
+	ulong prate;
+
+	switch (clk_id) {
+	case DCLK_VOP0:
+		id = 32;
+		sel_mask = DCLK_VOP_SRC0_SEL_MASK;
+		sel_shift = DCLK_VOP_SRC0_SEL_SHIFT;
+		/* FIXME if need src: clk_hdmiphy_pixel_io */
+		div_mask = DCLK_VOP_SRC0_DIV_MASK;
+		div_shift = DCLK_VOP_SRC0_DIV_SHIFT;
+		break;
+
+	case DCLK_VOP1:
+		id = 33;
+		sel_mask = DCLK_VOP_SRC1_SEL_MASK;
+		sel_shift = DCLK_VOP_SRC1_SEL_SHIFT;
+		div_mask = DCLK_VOP_SRC1_DIV_MASK;
+		div_shift = DCLK_VOP_SRC1_DIV_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	con = readl(&cru->clksel_con[id]);
+	div = (con & div_mask) >> div_shift;
+	sel = (con & sel_mask) >> sel_shift;
+	if (sel == DCLK_VOP_SRC_SEL_CLK_GPLL_MUX)
+		prate = priv->gpll_hz;
+	else
+		prate = priv->cpll_hz;
+
+	return DIV_TO_RATE(prate, div);
+}
+
+static ulong rk3528_dclk_vop_set_clk(struct rk3528_clk_priv *priv,
+				     ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 div_mask, div_shift;
+	u32 sel_mask, sel_shift;
+	u32 id, sel, div;
+	ulong prate;
+
+	switch (clk_id) {
+	case DCLK_VOP0:
+		id = 32;
+		sel_mask = DCLK_VOP_SRC0_SEL_MASK;
+		sel_shift = DCLK_VOP_SRC0_SEL_SHIFT;
+		/* FIXME if need src: clk_hdmiphy_pixel_io */
+		div_mask = DCLK_VOP_SRC0_DIV_MASK;
+		div_shift = DCLK_VOP_SRC0_DIV_SHIFT;
+		break;
+
+	case DCLK_VOP1:
+		id = 33;
+		sel_mask = DCLK_VOP_SRC1_SEL_MASK;
+		sel_shift = DCLK_VOP_SRC1_SEL_SHIFT;
+		div_mask = DCLK_VOP_SRC1_DIV_MASK;
+		div_shift = DCLK_VOP_SRC1_DIV_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	if ((priv->gpll_hz % rate) == 0) {
+		prate = priv->gpll_hz;
+		sel = (DCLK_VOP_SRC_SEL_CLK_GPLL_MUX << sel_shift) & sel_mask;
+	} else {
+		prate = priv->cpll_hz;
+		sel = (DCLK_VOP_SRC_SEL_CLK_CPLL_MUX << sel_shift) & sel_mask;
+	}
+
+	div = ((DIV_ROUND_UP(prate, rate) - 1) << div_shift) & div_mask;
+	rk_clrsetreg(&cru->clksel_con[id], sel, div);
+
+	return rk3528_dclk_vop_get_clk(priv, clk_id);
+}
+
+static ulong rk3528_uart_get_rate(struct rk3528_clk_priv *priv, ulong clk_id)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 sel_shift, sel_mask, div_shift, div_mask;
+	u32 sel, id, con, frac_div, div;
+	ulong m, n, rate;
+
+	switch (clk_id) {
+	case SCLK_UART0:
+		id = 6;
+		sel_shift = SCLK_UART0_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART0_SRC_SEL_MASK;
+		div_shift = CLK_UART0_SRC_DIV_SHIFT;
+		div_mask = CLK_UART0_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART1:
+		id = 8;
+		sel_shift = SCLK_UART1_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART1_SRC_SEL_MASK;
+		div_shift = CLK_UART1_SRC_DIV_SHIFT;
+		div_mask = CLK_UART1_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART2:
+		id = 10;
+		sel_shift = SCLK_UART2_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART2_SRC_SEL_MASK;
+		div_shift = CLK_UART2_SRC_DIV_SHIFT;
+		div_mask = CLK_UART2_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART3:
+		id = 12;
+		sel_shift = SCLK_UART3_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART3_SRC_SEL_MASK;
+		div_shift = CLK_UART3_SRC_DIV_SHIFT;
+		div_mask = CLK_UART3_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART4:
+		id = 14;
+		sel_shift = SCLK_UART4_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART4_SRC_SEL_MASK;
+		div_shift = CLK_UART4_SRC_DIV_SHIFT;
+		div_mask = CLK_UART4_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART5:
+		id = 16;
+		sel_shift = SCLK_UART5_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART5_SRC_SEL_MASK;
+		div_shift = CLK_UART5_SRC_DIV_SHIFT;
+		div_mask = CLK_UART5_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART6:
+		id = 18;
+		sel_shift = SCLK_UART6_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART6_SRC_SEL_MASK;
+		div_shift = CLK_UART6_SRC_DIV_SHIFT;
+		div_mask = CLK_UART6_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART7:
+		id = 20;
+		sel_shift = SCLK_UART7_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART7_SRC_SEL_MASK;
+		div_shift = CLK_UART7_SRC_DIV_SHIFT;
+		div_mask = CLK_UART7_SRC_DIV_MASK;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	con = readl(&cru->clksel_con[id - 2]);
+	div = (con & div_mask) >> div_shift;
+
+	con = readl(&cru->clksel_con[id]);
+	sel = (con & sel_mask) >> sel_shift;
+
+	if (sel == SCLK_UART0_SRC_SEL_CLK_UART0_SRC) {
+		rate = DIV_TO_RATE(priv->gpll_hz, div);
+	} else if (sel == SCLK_UART0_SRC_SEL_CLK_UART0_FRAC) {
+		frac_div = readl(&cru->clksel_con[id - 1]);
+		n = (frac_div & 0xffff0000) >> 16;
+		m = frac_div & 0x0000ffff;
+		rate = DIV_TO_RATE(priv->gpll_hz, div) * n / m;
+	} else {
+		rate = OSC_HZ;
+	}
+
+	return rate;
+}
+
+static ulong rk3528_uart_set_rate(struct rk3528_clk_priv *priv,
+				  ulong clk_id, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 sel_shift, sel_mask, div_shift, div_mask;
+	u32 sel, id, div;
+	ulong m = 0, n = 0, val;
+
+	if (rate == OSC_HZ) {
+		sel = SCLK_UART0_SRC_SEL_XIN_OSC0_FUNC;
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+	} else if (priv->gpll_hz % rate == 0) {
+		sel = SCLK_UART0_SRC_SEL_CLK_UART0_SRC;
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+	} else {
+		sel = SCLK_UART0_SRC_SEL_CLK_UART0_FRAC;
+		div = 2;
+		rational_best_approximation(rate, priv->gpll_hz / div,
+					    GENMASK(16 - 1, 0),
+					    GENMASK(16 - 1, 0),
+					    &n, &m);
+	}
+
+	switch (clk_id) {
+	case SCLK_UART0:
+		id = 6;
+		sel_shift = SCLK_UART0_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART0_SRC_SEL_MASK;
+		div_shift = CLK_UART0_SRC_DIV_SHIFT;
+		div_mask = CLK_UART0_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART1:
+		id = 8;
+		sel_shift = SCLK_UART1_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART1_SRC_SEL_MASK;
+		div_shift = CLK_UART1_SRC_DIV_SHIFT;
+		div_mask = CLK_UART1_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART2:
+		id = 10;
+		sel_shift = SCLK_UART2_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART2_SRC_SEL_MASK;
+		div_shift = CLK_UART2_SRC_DIV_SHIFT;
+		div_mask = CLK_UART2_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART3:
+		id = 12;
+		sel_shift = SCLK_UART3_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART3_SRC_SEL_MASK;
+		div_shift = CLK_UART3_SRC_DIV_SHIFT;
+		div_mask = CLK_UART3_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART4:
+		id = 14;
+		sel_shift = SCLK_UART4_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART4_SRC_SEL_MASK;
+		div_shift = CLK_UART4_SRC_DIV_SHIFT;
+		div_mask = CLK_UART4_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART5:
+		id = 16;
+		sel_shift = SCLK_UART5_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART5_SRC_SEL_MASK;
+		div_shift = CLK_UART5_SRC_DIV_SHIFT;
+		div_mask = CLK_UART5_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART6:
+		id = 18;
+		sel_shift = SCLK_UART6_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART6_SRC_SEL_MASK;
+		div_shift = CLK_UART6_SRC_DIV_SHIFT;
+		div_mask = CLK_UART6_SRC_DIV_MASK;
+		break;
+
+	case SCLK_UART7:
+		id = 20;
+		sel_shift = SCLK_UART7_SRC_SEL_SHIFT;
+		sel_mask = SCLK_UART7_SRC_SEL_MASK;
+		div_shift = CLK_UART7_SRC_DIV_SHIFT;
+		div_mask = CLK_UART7_SRC_DIV_MASK;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	rk_clrsetreg(&cru->clksel_con[id - 2], div_mask, (div - 1) << div_shift);
+	rk_clrsetreg(&cru->clksel_con[id], sel_mask, sel << sel_shift);
+	if (m && n) {
+		val = n << 16 | m;
+		writel(val, &cru->clksel_con[id - 1]);
+	}
+
+	return rk3528_uart_get_rate(priv, clk_id);
+}
+
+static ulong rk3528_clk_get_rate(struct clk *clk)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(clk->dev);
+	ulong rate = 0;
+
+	if (!priv->gpll_hz || !priv->cpll_hz) {
+		printf("%s: gpll=%lu, cpll=%ld\n",
+		       __func__, priv->gpll_hz, priv->cpll_hz);
+		return -ENOENT;
+	}
+
+	switch (clk->id) {
+	case PLL_APLL:
+	case ARMCLK:
+		rate = rockchip_pll_get_rate(&rk3528_pll_clks[APLL], priv->cru,
+					     APLL);
+		break;
+	case PLL_CPLL:
+		rate = rockchip_pll_get_rate(&rk3528_pll_clks[CPLL], priv->cru,
+					     CPLL);
+		break;
+	case PLL_GPLL:
+		rate = rockchip_pll_get_rate(&rk3528_pll_clks[GPLL], priv->cru,
+					     GPLL);
+		break;
+
+	case PLL_PPLL:
+		rate = rockchip_pll_get_rate(&rk3528_pll_clks[PPLL], priv->cru,
+					     PPLL);
+		break;
+	case PLL_DPLL:
+		rate = rockchip_pll_get_rate(&rk3528_pll_clks[DPLL], priv->cru,
+					     DPLL);
+		break;
+
+	case TCLK_WDT_NS:
+		rate = OSC_HZ;
+		break;
+	case CLK_I2C0:
+	case CLK_I2C1:
+	case CLK_I2C2:
+	case CLK_I2C3:
+	case CLK_I2C4:
+	case CLK_I2C5:
+	case CLK_I2C6:
+	case CLK_I2C7:
+		rate = rk3528_i2c_get_clk(priv, clk->id);
+		break;
+	case CLK_SPI0:
+	case CLK_SPI1:
+		rate = rk3528_spi_get_clk(priv, clk->id);
+		break;
+	case CLK_PWM0:
+	case CLK_PWM1:
+		rate = rk3528_pwm_get_clk(priv, clk->id);
+		break;
+	case CLK_SARADC:
+	case CLK_TSADC:
+	case CLK_TSADC_TSEN:
+		rate = rk3528_adc_get_clk(priv, clk->id);
+		break;
+	case CCLK_SRC_EMMC:
+		rate = rk3528_emmc_get_clk(priv);
+		break;
+	case HCLK_SDMMC0:
+	case CCLK_SRC_SDMMC0:
+		rate = rk3528_sdmmc_get_clk(priv, clk->id);
+		break;
+	case SCLK_SFC:
+		rate = rk3528_sfc_get_clk(priv);
+		break;
+	case DCLK_VOP0:
+	case DCLK_VOP1:
+		rate = rk3528_dclk_vop_get_clk(priv, clk->id);
+		break;
+	case DCLK_CVBS:
+		rate = rk3528_dclk_vop_get_clk(priv, DCLK_VOP1) / 4;
+		break;
+	case DCLK_4X_CVBS:
+		rate = rk3528_dclk_vop_get_clk(priv, DCLK_VOP1);
+		break;
+	case SCLK_UART0:
+	case SCLK_UART1:
+	case SCLK_UART2:
+	case SCLK_UART3:
+	case SCLK_UART4:
+	case SCLK_UART5:
+	case SCLK_UART6:
+	case SCLK_UART7:
+		rate = rk3528_uart_get_rate(priv, clk->id);
+		break;
+	case CLK_MATRIX_50M_SRC:
+	case CLK_MATRIX_100M_SRC:
+	case CLK_MATRIX_150M_SRC:
+	case CLK_MATRIX_200M_SRC:
+	case CLK_MATRIX_250M_SRC:
+	case CLK_MATRIX_300M_SRC:
+	case CLK_MATRIX_339M_SRC:
+	case CLK_MATRIX_400M_SRC:
+	case CLK_MATRIX_500M_SRC:
+	case CLK_MATRIX_600M_SRC:
+	case ACLK_BUS_VOPGL_BIU:
+		rate = rk3528_cgpll_matrix_get_rate(priv, clk->id);
+		break;
+	case CLK_PPLL_50M_MATRIX:
+	case CLK_PPLL_100M_MATRIX:
+	case CLK_PPLL_125M_MATRIX:
+	case CLK_GMAC1_VPU_25M:
+	case CLK_GMAC1_RMII_VPU:
+	case CLK_GMAC1_SRC_VPU:
+		rate = rk3528_ppll_matrix_get_rate(priv, clk->id);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rate;
+};
+
+static ulong rk3528_clk_set_rate(struct clk *clk, ulong rate)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(clk->dev);
+	ulong ret = 0;
+
+	if (!priv->gpll_hz) {
+		printf("%s gpll=%lu\n", __func__, priv->gpll_hz);
+		return -ENOENT;
+	}
+
+	switch (clk->id) {
+	case PLL_APLL:
+	case ARMCLK:
+		if (priv->armclk_hz)
+			rk3528_armclk_set_clk(priv, rate);
+		priv->armclk_hz = rate;
+		break;
+	case PLL_CPLL:
+		ret = rockchip_pll_set_rate(&rk3528_pll_clks[CPLL], priv->cru,
+					    CPLL, rate);
+		priv->cpll_hz = rockchip_pll_get_rate(&rk3528_pll_clks[CPLL],
+						      priv->cru, CPLL);
+		break;
+	case PLL_GPLL:
+		ret = rockchip_pll_set_rate(&rk3528_pll_clks[GPLL], priv->cru,
+					    GPLL, rate);
+		priv->gpll_hz = rockchip_pll_get_rate(&rk3528_pll_clks[GPLL],
+						      priv->cru, GPLL);
+		break;
+	case PLL_PPLL:
+		ret = rockchip_pll_set_rate(&rk3528_pll_clks[PPLL], priv->cru,
+					    PPLL, rate);
+		priv->ppll_hz = rockchip_pll_get_rate(&rk3528_pll_clks[PPLL],
+						      priv->cru, PPLL);
+		break;
+	case TCLK_WDT_NS:
+		return (rate == OSC_HZ) ? 0 : -EINVAL;
+	case CLK_I2C0:
+	case CLK_I2C1:
+	case CLK_I2C2:
+	case CLK_I2C3:
+	case CLK_I2C4:
+	case CLK_I2C5:
+	case CLK_I2C6:
+	case CLK_I2C7:
+		ret = rk3528_i2c_set_clk(priv, clk->id, rate);
+		break;
+	case CLK_SPI0:
+	case CLK_SPI1:
+		ret = rk3528_spi_set_clk(priv, clk->id, rate);
+		break;
+	case CLK_PWM0:
+	case CLK_PWM1:
+		ret = rk3528_pwm_set_clk(priv, clk->id, rate);
+		break;
+	case CLK_SARADC:
+	case CLK_TSADC:
+	case CLK_TSADC_TSEN:
+		ret = rk3528_adc_set_clk(priv, clk->id, rate);
+		break;
+	case HCLK_SDMMC0:
+	case CCLK_SRC_SDMMC0:
+		ret = rk3528_sdmmc_set_clk(priv, clk->id, rate);
+		break;
+	case SCLK_SFC:
+		ret = rk3528_sfc_set_clk(priv, rate);
+		break;
+	case CCLK_SRC_EMMC:
+		ret = rk3528_emmc_set_clk(priv, rate);
+		break;
+	case DCLK_VOP0:
+	case DCLK_VOP1:
+		ret = rk3528_dclk_vop_set_clk(priv, clk->id, rate);
+		break;
+	case SCLK_UART0:
+	case SCLK_UART1:
+	case SCLK_UART2:
+	case SCLK_UART3:
+	case SCLK_UART4:
+	case SCLK_UART5:
+	case SCLK_UART6:
+	case SCLK_UART7:
+		ret = rk3528_uart_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_MATRIX_50M_SRC:
+	case CLK_MATRIX_100M_SRC:
+	case CLK_MATRIX_150M_SRC:
+	case CLK_MATRIX_200M_SRC:
+	case CLK_MATRIX_250M_SRC:
+	case CLK_MATRIX_300M_SRC:
+	case CLK_MATRIX_339M_SRC:
+	case CLK_MATRIX_400M_SRC:
+	case CLK_MATRIX_500M_SRC:
+	case CLK_MATRIX_600M_SRC:
+	case ACLK_BUS_VOPGL_BIU:
+		ret = rk3528_cgpll_matrix_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_PPLL_50M_MATRIX:
+	case CLK_PPLL_100M_MATRIX:
+	case CLK_PPLL_125M_MATRIX:
+	case CLK_GMAC1_VPU_25M:
+		ret = rk3528_ppll_matrix_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_GMAC1_RMII_VPU:
+	case CLK_GMAC1_SRC_VPU:
+		/* dummy set */
+		ret = rk3528_ppll_matrix_get_rate(priv, clk->id);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return ret;
+};
+
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+static int rk3528_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(clk->dev);
+	const char *clock_dev_name = parent->dev->name;
+
+	switch (clk->id) {
+	case DCLK_VOP0:
+		if (!strcmp(clock_dev_name, "inno_hdmi_pll_clk"))
+			/* clk_hdmiphy_pixel_io */
+			rk_clrsetreg(&priv->cru->clksel_con[84], 0x1, 1);
+		else
+			rk_clrsetreg(&priv->cru->clksel_con[84], 0x1, 0);
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	return 0;
+}
+#endif
+
+static struct clk_ops rk3528_clk_ops = {
+	.get_rate = rk3528_clk_get_rate,
+	.set_rate = rk3528_clk_set_rate,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.set_parent = rk3528_clk_set_parent,
+#endif
+};
+
+static ulong rk3528_grfclk_get_rate(struct clk *clk)
+{
+	struct rk3528_clk_priv *priv;
+	struct udevice *cru_dev;
+	ulong rate = 0;
+	int ret;
+
+	ret = uclass_get_device_by_driver(UCLASS_CLK,
+					  DM_GET_DRIVER(rockchip_rk3528_cru),
+					  &cru_dev);
+	if (ret) {
+		printf("%s: could not find cru device\n", __func__);
+		return ret;
+	}
+	priv = dev_get_priv(cru_dev);
+
+	switch (clk->id) {
+	case SCLK_SDMMC_SAMPLE:
+		rate = rk3528_sdmmc_get_clk(priv, CCLK_SRC_SDMMC0) / 2;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rate;
+};
+
+#define ROCKCHIP_MMC_DELAY_SEL		BIT(11)
+#define ROCKCHIP_MMC_DEGREE_MASK	0x3
+#define ROCKCHIP_MMC_DELAYNUM_OFFSET	3
+#define ROCKCHIP_MMC_DELAYNUM_MASK	(0xff << ROCKCHIP_MMC_DELAYNUM_OFFSET)
+#define PSECS_PER_SEC 1000000000000LL
+/*
+ * Each fine delay is between 44ps-77ps. Assume each fine delay is 60ps to
+ * simplify calculations. So 45degs could be anywhere between 33deg and 57.8deg.
+ */
+#define ROCKCHIP_MMC_DELAY_ELEMENT_PSEC 60
+
+int rk3528_mmc_get_phase(struct clk *clk)
+{
+	struct rk3528_grf_clk_priv *priv = dev_get_priv(clk->dev);
+	u32 raw_value = 0, delay_num;
+	u16 degrees = 0;
+	ulong rate;
+
+	rate = rk3528_grfclk_get_rate(clk);
+	if (rate < 0)
+		return rate;
+
+	if (clk->id == SCLK_SDMMC_SAMPLE)
+		raw_value = readl(&priv->grf->sdmmc_con1);
+	else
+		return -ENONET;
+
+	raw_value >>= 1;
+	degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90;
+
+	if (raw_value & ROCKCHIP_MMC_DELAY_SEL) {
+		/* degrees/delaynum * 10000 */
+		unsigned long factor = (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10) *
+					36 * (rate / 1000000);
+
+		delay_num = (raw_value & ROCKCHIP_MMC_DELAYNUM_MASK);
+		delay_num >>= ROCKCHIP_MMC_DELAYNUM_OFFSET;
+		degrees += DIV_ROUND_CLOSEST(delay_num * factor, 10000);
+	}
+
+	return degrees % 360;
+}
+
+int rk3528_mmc_set_phase(struct clk *clk, u32 degrees)
+{
+	struct rk3528_grf_clk_priv *priv = dev_get_priv(clk->dev);
+	u8 nineties, remainder, delay_num;
+	u32 raw_value, delay;
+	ulong rate;
+
+	rate = rk3528_grfclk_get_rate(clk);
+	if (rate < 0)
+		return rate;
+
+	nineties = degrees / 90;
+	remainder = (degrees % 90);
+
+	/*
+	 * Convert to delay; do a little extra work to make sure we
+	 * don't overflow 32-bit / 64-bit numbers.
+	 */
+	delay = 10000000; /* PSECS_PER_SEC / 10000 / 10 */
+	delay *= remainder;
+	delay = DIV_ROUND_CLOSEST(delay, (rate / 1000) * 36 *
+				  (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10));
+
+	delay_num = (u8)min_t(u32, delay, 255);
+
+	raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0;
+	raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_OFFSET;
+	raw_value |= nineties;
+
+	raw_value <<= 1;
+	if (clk->id == SCLK_SDMMC_SAMPLE)
+		writel(raw_value | 0xffff0000, &priv->grf->sdmmc_con1);
+	else
+		return -ENONET;
+
+	debug("mmc set_phase(%d) delay_nums=%u reg=%#x actual_degrees=%d\n",
+	      degrees, delay_num, raw_value, rk3528_mmc_get_phase(clk));
+
+	return 0;
+}
+
+static int rk3528_grfclk_get_phase(struct clk *clk)
+{
+	int ret;
+
+	debug("%s %ld\n", __func__, clk->id);
+	switch (clk->id) {
+	case SCLK_SDMMC_SAMPLE:
+		ret = rk3528_mmc_get_phase(clk);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return ret;
+}
+
+static int rk3528_grfclk_set_phase(struct clk *clk, int degrees)
+{
+	int ret;
+
+	debug("%s %ld\n", __func__, clk->id);
+	switch (clk->id) {
+	case SCLK_SDMMC_SAMPLE:
+		ret = rk3528_mmc_set_phase(clk, degrees);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return ret;
+}
+
+static struct clk_ops rk3528_grfclk_ops = {
+	.get_rate = rk3528_grfclk_get_rate,
+	.get_phase = rk3528_grfclk_get_phase,
+	.set_phase = rk3528_grfclk_set_phase,
+};
+
+#ifndef CONFIG_SPL_BUILD
+/**
+ * soc_clk_dump() - Print clock frequencies
+ * Returns zero on success
+ *
+ * Implementation for the clk dump command.
+ */
+int soc_clk_dump(void)
+{
+	const struct rk3528_clk_info *clk_dump;
+	struct rk3528_clk_priv *priv;
+	struct udevice *cru_dev;
+	struct clk clk;
+	ulong clk_count = ARRAY_SIZE(clks_dump);
+	ulong rate;
+	int i, ret;
+
+	ret = uclass_get_device_by_driver(UCLASS_CLK,
+					  DM_GET_DRIVER(rockchip_rk3528_cru),
+					  &cru_dev);
+	if (ret) {
+		printf("%s failed to get cru device\n", __func__);
+		return ret;
+	}
+
+	priv = dev_get_priv(cru_dev);
+	printf("CLK: (%s. arm: enter %lu KHz, init %lu KHz, kernel %lu%s)\n",
+	       priv->sync_kernel ? "sync kernel" : "uboot",
+	       priv->armclk_enter_hz / 1000,
+	       priv->armclk_init_hz / 1000,
+	       priv->set_armclk_rate ? priv->armclk_hz / 1000 : 0,
+	       priv->set_armclk_rate ? " KHz" : "N/A");
+	for (i = 0; i < clk_count; i++) {
+		clk_dump = &clks_dump[i];
+		if (clk_dump->name) {
+			clk.id = clk_dump->id;
+			ret = clk_request(cru_dev, &clk);
+			if (ret < 0)
+				return ret;
+
+			rate = clk_get_rate(&clk);
+			clk_free(&clk);
+			if (i == 0) {
+				if (rate < 0)
+					printf("  %s %s\n", clk_dump->name,
+					       "unknown");
+				else
+					printf("  %s %lu KHz\n", clk_dump->name,
+					       rate / 1000);
+			} else {
+				if (rate < 0)
+					printf("  %s %s\n", clk_dump->name,
+					       "unknown");
+				else
+					printf("  %s %lu KHz\n", clk_dump->name,
+					       rate / 1000);
+			}
+		}
+	}
+
+	return 0;
+}
+#endif
+
+static int rk3528_grfclk_probe(struct udevice *dev)
+{
+	struct rk3528_grf_clk_priv *priv = dev_get_priv(dev);
+
+	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+	if (IS_ERR(priv->grf))
+		return PTR_ERR(priv->grf);
+
+	return 0;
+}
+
+static const struct udevice_id rk3528_grf_cru_ids[] = {
+	{ .compatible = "rockchip,rk3528-grf-cru" },
+	{ }
+};
+
+U_BOOT_DRIVER(rockchip_rk3528_grf_cru) = {
+	.name		= "rockchip_rk3528_grf_cru",
+	.id		= UCLASS_CLK,
+	.of_match	= rk3528_grf_cru_ids,
+	.priv_auto_alloc_size = sizeof(struct rk3528_grf_clk_priv),
+	.ops		= &rk3528_grfclk_ops,
+	.probe		= rk3528_grfclk_probe,
+};
+
+static int rk3528_clk_init(struct rk3528_clk_priv *priv)
+{
+	int ret;
+
+	priv->sync_kernel = false;
+
+#ifdef CONFIG_SPL_BUILD
+	/*
+	 * BOOTROM:
+	 *	CPU 1902/2(postdiv1)=546M
+	 *	CPLL 996/2(postdiv1)=498M
+	 *	GPLL 1188/2(postdiv1)=594M
+	 *	   |-- clk_matrix_200m_src_div=1 => rate: 300M
+	 *	   |-- clk_matrix_300m_src_div=2 => rate: 200M
+	 *
+	 * Avoid overclocking when change GPLL rate:
+	 *	Change clk_matrix_200m_src_div to 5.
+	 *	Change clk_matrix_300m_src_div to 3.
+	 */
+	writel(0x01200120, &priv->cru->clksel_con[1]);
+	writel(0x00030003, &priv->cru->clksel_con[2]);
+
+	if (!priv->armclk_enter_hz) {
+		priv->armclk_enter_hz =
+			rockchip_pll_get_rate(&rk3528_pll_clks[APLL],
+					      priv->cru, APLL);
+		priv->armclk_init_hz = priv->armclk_enter_hz;
+	}
+
+	if (priv->armclk_init_hz != APLL_HZ) {
+		ret = rk3528_armclk_set_clk(priv, APLL_HZ);
+		if (!ret)
+			priv->armclk_init_hz = APLL_HZ;
+	}
+#else
+	if (!priv->armclk_enter_hz) {
+		struct clk clk;
+
+		ret = rockchip_get_scmi_clk(&clk.dev);
+		if (ret) {
+			printf("Failed to get scmi clk dev\n");
+			return ret;
+		}
+
+		clk.id = SCMI_CLK_CPU;
+		ret = clk_set_rate(&clk, CPU_PVTPLL_HZ);
+		if (ret < 0) {
+			printf("Failed to set scmi cpu %dhz\n", CPU_PVTPLL_HZ);
+			return ret;
+		} else {
+			priv->armclk_enter_hz =
+				rockchip_pll_get_rate(&rk3528_pll_clks[APLL],
+						      priv->cru, APLL);
+			priv->armclk_init_hz = CPU_PVTPLL_HZ;
+		}
+	}
+#endif
+	if (priv->cpll_hz != CPLL_HZ) {
+		ret = rockchip_pll_set_rate(&rk3528_pll_clks[CPLL], priv->cru,
+					    CPLL, CPLL_HZ);
+		if (!ret)
+			priv->cpll_hz = CPLL_HZ;
+	}
+
+	if (priv->gpll_hz != GPLL_HZ) {
+		ret = rockchip_pll_set_rate(&rk3528_pll_clks[GPLL], priv->cru,
+					    GPLL, GPLL_HZ);
+		if (!ret)
+			priv->gpll_hz = GPLL_HZ;
+	}
+
+	if (priv->ppll_hz != PPLL_HZ) {
+		ret = rockchip_pll_set_rate(&rk3528_pll_clks[PPLL], priv->cru,
+					    PPLL, PPLL_HZ);
+		if (!ret)
+			priv->ppll_hz = PPLL_HZ;
+	}
+
+#ifdef CONFIG_SPL_BUILD
+	/* Init to override bootrom config */
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_50M_SRC,   50000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_100M_SRC, 100000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_150M_SRC, 150000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_200M_SRC, 200000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_250M_SRC, 250000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_300M_SRC, 300000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_339M_SRC, 340000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_400M_SRC, 400000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_500M_SRC, 500000000);
+	rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_600M_SRC, 600000000);
+	rk3528_cgpll_matrix_set_rate(priv, ACLK_BUS_VOPGL_BIU,  500000000);
+
+	/* The default rate is 100Mhz, it's not friendly for remote IR module */
+	rk3528_pwm_set_clk(priv, CLK_PWM0, 24000000);
+	rk3528_pwm_set_clk(priv, CLK_PWM1, 24000000);
+#endif
+	return 0;
+}
+
+static int rk3528_clk_probe(struct udevice *dev)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+	if (IS_ERR(priv->grf))
+		return PTR_ERR(priv->grf);
+
+	ret = rk3528_clk_init(priv);
+	if (ret)
+		return ret;
+
+	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
+	ret = clk_set_defaults(dev);
+	if (ret)
+		debug("%s clk_set_defaults failed %d\n", __func__, ret);
+	else
+		priv->sync_kernel = true;
+
+	return 0;
+}
+
+static int rk3528_clk_ofdata_to_platdata(struct udevice *dev)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(dev);
+
+	priv->cru = dev_read_addr_ptr(dev);
+
+	return 0;
+}
+
+static int rk3528_clk_bind(struct udevice *dev)
+{
+	struct udevice *sys_child, *sf_child;
+	struct softreset_reg *sf_priv;
+	struct sysreset_reg *priv;
+	int ret;
+
+	/* The reset driver does not have a device node, so bind it here */
+	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
+				 &sys_child);
+	if (ret) {
+		debug("Warning: No sysreset driver: ret=%d\n", ret);
+	} else {
+		priv = malloc(sizeof(struct sysreset_reg));
+		priv->glb_srst_fst_value = offsetof(struct rk3528_cru,
+						    glb_srst_fst);
+		priv->glb_srst_snd_value = offsetof(struct rk3528_cru,
+						    glb_srst_snd);
+		sys_child->priv = priv;
+	}
+
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3528_cru,
+						    softrst_con[0]);
+		sf_priv->sf_reset_num = 47;
+		sf_child->priv = sf_priv;
+	}
+
+	return 0;
+}
+
+static const struct udevice_id rk3528_clk_ids[] = {
+	{ .compatible = "rockchip,rk3528-cru" },
+	{ }
+};
+
+U_BOOT_DRIVER(rockchip_rk3528_cru) = {
+	.name		= "rockchip_rk3528_cru",
+	.id		= UCLASS_CLK,
+	.of_match	= rk3528_clk_ids,
+	.priv_auto_alloc_size = sizeof(struct rk3528_clk_priv),
+	.ofdata_to_platdata = rk3528_clk_ofdata_to_platdata,
+	.ops		= &rk3528_clk_ops,
+	.bind		= rk3528_clk_bind,
+	.probe		= rk3528_clk_probe,
+};
+
+/* spl scmi clk */
+#ifdef CONFIG_SPL_BUILD
+
+static ulong rk3528_crypto_get_rate(struct rk3528_clk_priv *priv, struct clk *clk)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, con, mask, shift;
+	ulong rate;
+
+	switch (clk->id) {
+	case SCMI_CORE_CRYPTO:
+		id = 43;
+		mask = CLK_CORE_CRYPTO_SEL_MASK;
+		shift = CLK_CORE_CRYPTO_SEL_SHIFT;
+		break;
+
+	case SCMI_PKA_CRYPTO:
+		id = 44;
+		mask = CLK_PKA_CRYPTO_SEL_MASK;
+		shift = CLK_PKA_CRYPTO_SEL_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	con = readl(&cru->clksel_con[id]);
+	sel = (con & mask) >> shift;
+	if (sel == CLK_CORE_CRYPTO_SEL_CLK_MATRIX_300M_SRC)
+		rate = 300 * MHz;
+	else if (sel == CLK_CORE_CRYPTO_SEL_CLK_MATRIX_200M_SRC)
+		rate = 200 * MHz;
+	else if (sel == CLK_CORE_CRYPTO_SEL_CLK_MATRIX_100M_SRC)
+		rate = 100 * MHz;
+	else
+		rate = OSC_HZ;
+
+	return rate;
+}
+
+static ulong rk3528_crypto_set_rate(struct rk3528_clk_priv *priv,
+				    struct clk *clk, ulong rate)
+{
+	struct rk3528_cru *cru = priv->cru;
+	u32 id, sel, mask, shift;
+
+	if (rate == 300 * MHz)
+		sel = CLK_CORE_CRYPTO_SEL_CLK_MATRIX_300M_SRC;
+	else if (rate == 200 * MHz)
+		sel = CLK_CORE_CRYPTO_SEL_CLK_MATRIX_200M_SRC;
+	else if (rate == 100 * MHz)
+		sel = CLK_CORE_CRYPTO_SEL_CLK_MATRIX_100M_SRC;
+	else
+		sel = CLK_CORE_CRYPTO_SEL_XIN_OSC0_FUNC;
+
+	switch (clk->id) {
+	case SCMI_CORE_CRYPTO:
+		id = 43;
+		mask = CLK_CORE_CRYPTO_SEL_MASK;
+		shift = CLK_CORE_CRYPTO_SEL_SHIFT;
+		break;
+
+	case SCMI_PKA_CRYPTO:
+		id = 44;
+		mask = CLK_PKA_CRYPTO_SEL_MASK;
+		shift = CLK_PKA_CRYPTO_SEL_SHIFT;
+		break;
+
+	default:
+		return -ENOENT;
+	}
+
+	rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift);
+
+	return rk3528_crypto_get_rate(priv, clk);
+}
+
+static ulong rk3528_clk_scmi_get_rate(struct clk *clk)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(clk->dev);
+
+	switch (clk->id) {
+	case SCMI_CORE_CRYPTO:
+	case SCMI_PKA_CRYPTO:
+		return rk3528_crypto_get_rate(priv, clk);
+	default:
+		return -ENOENT;
+	}
+};
+
+static ulong rk3528_clk_scmi_set_rate(struct clk *clk, ulong rate)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(clk->dev);
+
+	switch (clk->id) {
+	case SCMI_CORE_CRYPTO:
+	case SCMI_PKA_CRYPTO:
+		return rk3528_crypto_set_rate(priv, clk, rate);
+	default:
+		return -ENOENT;
+	}
+
+	return 0;
+};
+
+static int rk3528_scmi_clk_ofdata_to_platdata(struct udevice *dev)
+{
+	struct rk3528_clk_priv *priv = dev_get_priv(dev);
+
+	priv->cru = (struct rk3528_cru *)0xff4a0000;
+
+	return 0;
+}
+
+/* A fake scmi driver for SPL/TPL where smccc agent is not available. */
+static const struct clk_ops scmi_clk_ops = {
+	.get_rate = rk3528_clk_scmi_get_rate,
+	.set_rate = rk3528_clk_scmi_set_rate,
+};
+
+U_BOOT_DRIVER(scmi_clock) = {
+	.name = "scmi_clk",
+	.id = UCLASS_CLK,
+	.ops = &scmi_clk_ops,
+	.priv_auto_alloc_size = sizeof(struct rk3528_clk_priv),
+	.ofdata_to_platdata = rk3528_scmi_clk_ofdata_to_platdata,
+};
+#endif
diff --git a/u-boot/drivers/clk/rockchip/clk_rk3562.c b/u-boot/drivers/clk/rockchip/clk_rk3562.c
new file mode 100644
index 0000000..36d8c44
--- /dev/null
+++ b/u-boot/drivers/clk/rockchip/clk_rk3562.c
@@ -0,0 +1,2046 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd
+ * Author: Finley Xiao <finley.xiao@rock-chips.com>
+ */
+
+#include <common.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <syscon.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/cru_rk3562.h>
+#include <asm/arch/hardware.h>
+#include <asm/io.h>
+#include <dm/lists.h>
+#include <dt-bindings/clock/rk3562-cru.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define DIV_TO_RATE(input_rate, div)    ((input_rate) / ((div) + 1))
+
+static struct rockchip_pll_rate_table rk3562_pll_rates[] = {
+	/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
+	RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
+	RK3036_PLL_RATE(1416000000, 1, 118, 2, 1, 1, 0),
+	RK3036_PLL_RATE(1296000000, 1, 108, 2, 1, 1, 0),
+	RK3036_PLL_RATE(1200000000, 1, 100, 2, 1, 1, 0),
+	RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0),
+	RK3036_PLL_RATE(1104000000, 1, 92, 2, 1, 1, 0),
+	RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0),
+	RK3036_PLL_RATE(1000000000, 3, 250, 2, 1, 1, 0),
+	RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
+	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
+	RK3036_PLL_RATE(600000000, 1, 100, 4, 1, 1, 0),
+	RK3036_PLL_RATE(594000000, 1, 99, 4, 1, 1, 0),
+	RK3036_PLL_RATE(500000000, 1, 125, 6, 1, 1, 0),
+	RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
+	RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
+	RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
+	RK3036_PLL_RATE(96000000, 1, 96, 6, 4, 1, 0),
+	{ /* sentinel */ },
+};
+
+static struct rockchip_pll_clock rk3562_pll_clks[] = {
+	[APLL] = PLL(pll_rk3328, PLL_APLL, RK3562_PLL_CON(0),
+		     RK3562_MODE_CON, 0, 10, 0, rk3562_pll_rates),
+	[GPLL] = PLL(pll_rk3328, PLL_GPLL, RK3562_PLL_CON(24),
+		     RK3562_MODE_CON, 2, 10, 0, rk3562_pll_rates),
+	[VPLL] = PLL(pll_rk3328, PLL_VPLL, RK3562_PLL_CON(32),
+		     RK3562_MODE_CON, 6, 10, 0, rk3562_pll_rates),
+	[HPLL] = PLL(pll_rk3328, PLL_HPLL, RK3562_PLL_CON(40),
+		     RK3562_MODE_CON, 8, 10, 0, rk3562_pll_rates),
+	[CPLL] = PLL(pll_rk3328, PLL_CPLL, RK3562_PMU1_PLL_CON(0),
+		     RK3562_PMU1_MODE_CON, 0, 10, 0, rk3562_pll_rates),
+	[DPLL] = PLL(pll_rk3328, PLL_DPLL, RK3562_SUBDDR_PLL_CON(0),
+		     RK3562_SUBDDR_MODE_CON, 0, 10, 0, NULL),
+};
+
+#define RK3562_CPUCLK_RATE(_rate, _aclk_m_core, _pclk_dbg)	\
+{								\
+	.rate = _rate##U,					\
+	.aclk_div = _aclk_m_core,				\
+	.pclk_div = _pclk_dbg,					\
+}
+
+static struct rockchip_cpu_rate_table rk3562_cpu_rates[] = {
+	RK3562_CPUCLK_RATE(1416000000, 1, 8),
+	RK3562_CPUCLK_RATE(1296000000, 1, 8),
+	RK3562_CPUCLK_RATE(1200000000, 1, 8),
+	RK3562_CPUCLK_RATE(1104000000, 1, 8),
+	RK3562_CPUCLK_RATE(1008000000, 1, 8),
+	RK3562_CPUCLK_RATE(912000000, 1, 6),
+	RK3562_CPUCLK_RATE(816000000, 1, 6),
+	RK3562_CPUCLK_RATE(600000000, 1, 6),
+	RK3562_CPUCLK_RATE(408000000, 1, 4),
+	{ /* sentinel */ },
+};
+
+#ifndef CONFIG_SPL_BUILD
+#define RK3562_CLK_DUMP(_id, _name)		\
+{						\
+	.id = _id,				\
+	.name = _name,				\
+}
+
+static const struct rk3562_clk_info clks_dump[] = {
+	RK3562_CLK_DUMP(PLL_APLL, "apll"),
+	RK3562_CLK_DUMP(PLL_GPLL, "gpll"),
+	RK3562_CLK_DUMP(PLL_VPLL, "vpll"),
+	RK3562_CLK_DUMP(PLL_HPLL, "hpll"),
+	RK3562_CLK_DUMP(PLL_CPLL, "cpll"),
+	RK3562_CLK_DUMP(PLL_DPLL, "dpll"),
+	RK3562_CLK_DUMP(ACLK_BUS, "aclk_bus"),
+	RK3562_CLK_DUMP(HCLK_BUS, "hclk_bus"),
+	RK3562_CLK_DUMP(PCLK_BUS, "pclk_bus"),
+	RK3562_CLK_DUMP(ACLK_PERI, "aclk_peri"),
+	RK3562_CLK_DUMP(HCLK_PERI, "hclk_peri"),
+	RK3562_CLK_DUMP(PCLK_PERI, "pclk_peri"),
+};
+#endif
+
+/*
+ *
+ * rational_best_approximation(31415, 10000,
+ *		(1 << 8) - 1, (1 << 5) - 1, &n, &d);
+ *
+ * you may look at given_numerator as a fixed point number,
+ * with the fractional part size described in given_denominator.
+ *
+ * for theoretical background, see:
+ * http://en.wikipedia.org/wiki/Continued_fraction
+ */
+static void rational_best_approximation(unsigned long given_numerator,
+					unsigned long given_denominator,
+					unsigned long max_numerator,
+					unsigned long max_denominator,
+					unsigned long *best_numerator,
+					unsigned long *best_denominator)
+{
+	unsigned long n, d, n0, d0, n1, d1;
+
+	n = given_numerator;
+	d = given_denominator;
+	n0 = 0;
+	d1 = 0;
+	n1 = 1;
+	d0 = 1;
+	for (;;) {
+		unsigned long t, a;
+
+		if (n1 > max_numerator || d1 > max_denominator) {
+			n1 = n0;
+			d1 = d0;
+			break;
+		}
+		if (d == 0)
+			break;
+		t = d;
+		a = n / d;
+		d = n % d;
+		n = t;
+		t = n0 + a * n1;
+		n0 = n1;
+		n1 = t;
+		t = d0 + a * d1;
+		d0 = d1;
+		d1 = t;
+	}
+	*best_numerator = n1;
+	*best_denominator = d1;
+}
+
+static int rk3562_armclk_set_rate(struct rk3562_clk_priv *priv, ulong new_rate)
+{
+	const struct rockchip_cpu_rate_table *rate;
+	struct rk3562_cru *cru = priv->cru;
+	ulong old_rate;
+
+	rate = rockchip_get_cpu_settings(rk3562_cpu_rates, new_rate);
+	if (!rate) {
+		printf("%s unsupported rate\n", __func__);
+		return -EINVAL;
+	}
+
+	/*
+	 * set up dependent divisors for DBG and ACLK clocks.
+	 */
+	old_rate = rockchip_pll_get_rate(&rk3562_pll_clks[APLL], priv->cru,
+					 APLL);
+	if (old_rate == new_rate) {
+		rk_clrsetreg(&cru->clksel_con[11], ACLK_CORE_PRE_DIV_MASK,
+			     rate->aclk_div << ACLK_CORE_PRE_DIV_SHIFT);
+		rk_clrsetreg(&cru->clksel_con[12], PCLK_DBG_PRE_DIV_MASK,
+			     rate->pclk_div << PCLK_DBG_PRE_DIV_SHIFT);
+		rk_clrsetreg(&cru->clksel_con[10], CLK_CORE_PRE_DIV_MASK, 0);
+	} else if (old_rate > new_rate) {
+		if (rockchip_pll_set_rate(&rk3562_pll_clks[APLL],
+					  priv->cru, APLL, new_rate))
+			return -EINVAL;
+		rk_clrsetreg(&cru->clksel_con[11], ACLK_CORE_PRE_DIV_MASK,
+			     rate->aclk_div << ACLK_CORE_PRE_DIV_SHIFT);
+		rk_clrsetreg(&cru->clksel_con[12], PCLK_DBG_PRE_DIV_MASK,
+			     rate->pclk_div << PCLK_DBG_PRE_DIV_SHIFT);
+		rk_clrsetreg(&cru->clksel_con[10], CLK_CORE_PRE_DIV_MASK, 0);
+	} else if (old_rate < new_rate) {
+		rk_clrsetreg(&cru->clksel_con[11], ACLK_CORE_PRE_DIV_MASK,
+			     rate->aclk_div << ACLK_CORE_PRE_DIV_SHIFT);
+		rk_clrsetreg(&cru->clksel_con[12], PCLK_DBG_PRE_DIV_MASK,
+			     rate->pclk_div << PCLK_DBG_PRE_DIV_SHIFT);
+		rk_clrsetreg(&cru->clksel_con[10], CLK_CORE_PRE_DIV_MASK, 0);
+
+		if (rockchip_pll_set_rate(&rk3562_pll_clks[APLL],
+					  priv->cru, APLL, new_rate))
+			return -EINVAL;
+	}
+
+	return 0;
+}
+
+static ulong rk3562_bus_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, con, div;
+	ulong rate;
+
+	switch (clk_id) {
+	case ACLK_BUS:
+		con = readl(&cru->clksel_con[40]);
+		sel = (con & ACLK_BUS_SEL_MASK) >> ACLK_BUS_SEL_SHIFT;
+		div = (con & ACLK_BUS_DIV_MASK) >> ACLK_BUS_DIV_SHIFT;
+		break;
+	case HCLK_BUS:
+		con = readl(&cru->clksel_con[40]);
+		sel = (con & HCLK_BUS_SEL_MASK) >> HCLK_BUS_SEL_SHIFT;
+		div = (con & HCLK_BUS_DIV_MASK) >> HCLK_BUS_DIV_SHIFT;
+		break;
+	case PCLK_BUS:
+		con = readl(&cru->clksel_con[41]);
+		sel = (con & PCLK_BUS_SEL_MASK) >> PCLK_BUS_SEL_SHIFT;
+		div = (con & PCLK_BUS_DIV_MASK) >> PCLK_BUS_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	if (sel == ACLK_BUS_SEL_CPLL)
+		rate = priv->cpll_hz;
+	else
+		rate = priv->gpll_hz;
+
+	return DIV_TO_RATE(rate, div);
+}
+
+static ulong rk3562_bus_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				 ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, div;
+
+	if (priv->cpll_hz % rate == 0) {
+		sel = ACLK_BUS_SEL_CPLL;
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+	} else {
+		sel= ACLK_BUS_SEL_GPLL;
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+	}
+
+	switch (clk_id) {
+	case ACLK_BUS:
+		rk_clrsetreg(&cru->clksel_con[40],
+			     ACLK_BUS_SEL_MASK | ACLK_BUS_DIV_MASK,
+			     (sel << ACLK_BUS_SEL_SHIFT) |
+			     ((div - 1) << ACLK_BUS_DIV_SHIFT));
+		break;
+	case HCLK_BUS:
+		rk_clrsetreg(&cru->clksel_con[40],
+			     HCLK_BUS_SEL_MASK | HCLK_BUS_DIV_MASK,
+			     (sel << HCLK_BUS_SEL_SHIFT) |
+			     ((div - 1) << HCLK_BUS_DIV_SHIFT));
+		break;
+	case PCLK_BUS:
+		rk_clrsetreg(&cru->clksel_con[41],
+			     PCLK_BUS_SEL_MASK | PCLK_BUS_DIV_MASK,
+			     (sel << PCLK_BUS_SEL_SHIFT) |
+			     ((div - 1) << PCLK_BUS_DIV_SHIFT));
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rk3562_bus_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_peri_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, con, div;
+	ulong rate;
+
+	switch (clk_id) {
+	case ACLK_PERI:
+		con = readl(&cru->periclksel_con[0]);
+		sel = (con & ACLK_PERI_SEL_MASK) >> ACLK_PERI_SEL_SHIFT;
+		div = (con & ACLK_PERI_DIV_MASK) >> ACLK_PERI_DIV_SHIFT;
+		break;
+	case HCLK_PERI:
+		con = readl(&cru->periclksel_con[0]);
+		sel = (con & HCLK_PERI_SEL_MASK) >> HCLK_PERI_SEL_SHIFT;
+		div = (con & HCLK_PERI_DIV_MASK) >> HCLK_PERI_DIV_SHIFT;
+		break;
+	case PCLK_PERI:
+		con = readl(&cru->periclksel_con[1]);
+		sel = (con & PCLK_PERI_SEL_MASK) >> PCLK_PERI_SEL_SHIFT;
+		div = (con & PCLK_PERI_DIV_MASK) >> PCLK_PERI_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	if (sel == ACLK_PERI_SEL_CPLL)
+		rate = priv->cpll_hz;
+	else
+		rate = priv->gpll_hz;
+
+	return DIV_TO_RATE(rate, div);
+}
+
+static ulong rk3562_peri_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				  ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, div;
+
+	if (priv->cpll_hz % rate == 0) {
+		sel = ACLK_PERI_SEL_CPLL;
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+	} else {
+		sel= ACLK_PERI_SEL_GPLL;
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+	}
+
+	switch (clk_id) {
+	case ACLK_PERI:
+		rk_clrsetreg(&cru->periclksel_con[0],
+			     ACLK_PERI_SEL_MASK | ACLK_PERI_DIV_MASK,
+			     (sel << ACLK_PERI_SEL_SHIFT) |
+			     ((div - 1) << ACLK_PERI_DIV_SHIFT));
+		break;
+	case HCLK_PERI:
+		rk_clrsetreg(&cru->periclksel_con[0],
+			     HCLK_PERI_SEL_MASK | HCLK_PERI_DIV_MASK,
+			     (sel << HCLK_PERI_SEL_SHIFT) |
+			     ((div - 1) << HCLK_PERI_DIV_SHIFT));
+		break;
+	case PCLK_PERI:
+		rk_clrsetreg(&cru->periclksel_con[1],
+			     PCLK_PERI_SEL_MASK | PCLK_PERI_DIV_MASK,
+			     (sel << PCLK_PERI_SEL_SHIFT) |
+			     ((div - 1) << PCLK_PERI_DIV_SHIFT));
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rk3562_peri_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_i2c_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, con, div;
+	ulong rate;
+
+	switch (clk_id) {
+	case CLK_PMU0_I2C0:
+		con = readl(&cru->pmu0clksel_con[3]);
+		sel = (con & CLK_PMU0_I2C0_SEL_MASK) >> CLK_PMU0_I2C0_SEL_SHIFT;
+		if (sel == CLK_PMU0_I2C0_SEL_200M)
+			rate = 200 * MHz;
+		else if (sel == CLK_PMU0_I2C0_SEL_24M)
+			rate = OSC_HZ;
+		else
+			rate = 32768;
+		div = (con & CLK_PMU0_I2C0_DIV_MASK) >> CLK_PMU0_I2C0_DIV_SHIFT;
+
+		return DIV_TO_RATE(rate, div);
+	case CLK_I2C:
+	case CLK_I2C1:
+	case CLK_I2C2:
+	case CLK_I2C3:
+	case CLK_I2C4:
+	case CLK_I2C5:
+		con = readl(&cru->clksel_con[41]);
+		sel = (con & CLK_I2C_SEL_MASK) >> CLK_I2C_SEL_SHIFT;
+		if (sel == CLK_I2C_SEL_200M)
+			rate = 200 * MHz;
+		else if (sel == CLK_I2C_SEL_100M)
+			rate = 100 * MHz;
+		else if (sel == CLK_I2C_SEL_50M)
+			rate = 50 * MHz;
+		else
+			rate = OSC_HZ;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rate;
+}
+
+static ulong rk3562_i2c_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				 ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, div;
+
+	switch (clk_id) {
+	case CLK_PMU0_I2C0:
+		if (rate == 200 * MHz) {
+			sel = CLK_PMU0_I2C0_SEL_200M;
+			div = 1;
+		} else if (rate == OSC_HZ) {
+			sel = CLK_PMU0_I2C0_SEL_24M;
+			div = 1;
+		} else if (rate == 32768) {
+			sel = CLK_PMU0_I2C0_SEL_32K;
+			div = 1;
+		} else {
+			sel = CLK_PMU0_I2C0_SEL_200M;
+			div = DIV_ROUND_UP(200 * MHz, rate);
+			assert(div - 1 <= 31);
+		}
+		rk_clrsetreg(&cru->pmu0clksel_con[3], CLK_PMU0_I2C0_DIV_MASK,
+			     (div - 1) << CLK_PMU0_I2C0_DIV_SHIFT);
+		rk_clrsetreg(&cru->pmu0clksel_con[3], CLK_PMU0_I2C0_SEL_MASK,
+			     sel << CLK_PMU0_I2C0_SEL_SHIFT);
+		break;
+	case CLK_I2C:
+	case CLK_I2C2:
+	case CLK_I2C3:
+	case CLK_I2C4:
+	case CLK_I2C5:
+		if (rate == 200 * MHz)
+			sel = CLK_I2C_SEL_200M;
+		else if (rate == 100 * MHz)
+			sel = CLK_I2C_SEL_100M;
+		else if (rate == 50 * MHz)
+			sel = CLK_I2C_SEL_50M;
+		else
+			sel = CLK_I2C_SEL_24M;
+		rk_clrsetreg(&cru->clksel_con[41], CLK_I2C_SEL_MASK,
+			     sel << CLK_I2C_SEL_SHIFT);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+
+	return rk3562_i2c_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_uart_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 reg, con, fracdiv, div, src, p_src, p_rate;
+	unsigned long m, n;
+
+	switch (clk_id) {
+	case SCLK_PMU1_UART0:
+		con = readl(&cru->pmu1clksel_con[2]);
+		src = (con & CLK_PMU1_UART0_SEL_MASK) >>
+		       CLK_PMU1_UART0_SEL_SHIFT;
+		div = (con & CLK_PMU1_UART0_SRC_DIV_MASK) >>
+		       CLK_PMU1_UART0_SRC_DIV_SHIFT;
+		if (src == CLK_UART_SEL_SRC) {
+			return DIV_TO_RATE(priv->cpll_hz, div);
+		} else if (src == CLK_UART_SEL_FRAC) {
+			fracdiv = readl(&cru->pmu1clksel_con[3]);
+			n = fracdiv & CLK_UART_FRAC_NUMERATOR_MASK;
+			n >>= CLK_UART_FRAC_NUMERATOR_SHIFT;
+			m = fracdiv & CLK_UART_FRAC_DENOMINATOR_MASK;
+			m >>= CLK_UART_FRAC_DENOMINATOR_SHIFT;
+			return DIV_TO_RATE(priv->cpll_hz, div) * n / m;
+		} else {
+			return OSC_HZ;
+		}
+	case SCLK_UART1:
+		reg = 21;
+		break;
+	case SCLK_UART2:
+		reg = 23;
+		break;
+	case SCLK_UART3:
+		reg = 25;
+		break;
+	case SCLK_UART4:
+		reg = 27;
+		break;
+	case SCLK_UART5:
+		reg = 29;
+		break;
+	case SCLK_UART6:
+		reg = 31;
+		break;
+	case SCLK_UART7:
+		reg = 33;
+		break;
+	case SCLK_UART8:
+		reg = 35;
+		break;
+	case SCLK_UART9:
+		reg = 37;
+		break;
+	default:
+		return -ENOENT;
+	}
+	con = readl(&cru->periclksel_con[reg]);
+	src = (con & CLK_UART_SEL_MASK) >> CLK_UART_SEL_SHIFT;
+	div = (con & CLK_UART_SRC_DIV_MASK) >> CLK_UART_SRC_DIV_SHIFT;
+	p_src = (con & CLK_UART_SRC_SEL_MASK) >> CLK_UART_SRC_SEL_SHIFT;
+	if (p_src == CLK_UART_SRC_SEL_GPLL)
+		p_rate = priv->gpll_hz;
+	else
+		p_rate = priv->cpll_hz;
+	if (src == CLK_UART_SEL_SRC) {
+		return DIV_TO_RATE(p_rate, div);
+	} else if (src == CLK_UART_SEL_FRAC) {
+		fracdiv = readl(&cru->periclksel_con[reg + 1]);
+		n = fracdiv & CLK_UART_FRAC_NUMERATOR_MASK;
+		n >>= CLK_UART_FRAC_NUMERATOR_SHIFT;
+		m = fracdiv & CLK_UART_FRAC_DENOMINATOR_MASK;
+		m >>= CLK_UART_FRAC_DENOMINATOR_SHIFT;
+		return DIV_TO_RATE(p_rate, div) * n / m;
+	} else {
+		return OSC_HZ;
+	}
+}
+
+static ulong rk3562_uart_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				  ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 reg, clk_src, uart_src, div;
+	unsigned long m = 0, n = 0, val;
+
+	switch (clk_id) {
+	case SCLK_PMU1_UART0:
+		if (priv->cpll_hz % rate == 0) {
+			uart_src = CLK_UART_SEL_SRC;
+			div = DIV_ROUND_UP(priv->cpll_hz, rate);
+		} else if (rate == OSC_HZ) {
+			uart_src = CLK_UART_SEL_XIN24M;
+			div = 2;
+		} else {
+			uart_src = CLK_UART_SEL_FRAC;
+			div = 2;
+			rational_best_approximation(rate, priv->cpll_hz / div,
+						    GENMASK(16 - 1, 0),
+						    GENMASK(16 - 1, 0),
+						    &n, &m);
+		}
+
+		rk_clrsetreg(&cru->pmu1clksel_con[2],
+			     CLK_PMU1_UART0_SEL_MASK |
+			     CLK_PMU1_UART0_SRC_DIV_MASK,
+			     (uart_src << CLK_PMU1_UART0_SEL_SHIFT) |
+			     ((div - 1) << CLK_PMU1_UART0_SRC_DIV_SHIFT));
+		if (m && n) {
+			val = n << CLK_UART_FRAC_NUMERATOR_SHIFT | m;
+			writel(val, &cru->pmu1clksel_con[3]);
+		}
+
+		return rk3562_uart_get_rate(priv, clk_id);
+	case SCLK_UART1:
+		reg = 21;
+		break;
+	case SCLK_UART2:
+		reg = 23;
+		break;
+	case SCLK_UART3:
+		reg = 25;
+		break;
+	case SCLK_UART4:
+		reg = 27;
+		break;
+	case SCLK_UART5:
+		reg = 29;
+		break;
+	case SCLK_UART6:
+		reg = 31;
+		break;
+	case SCLK_UART7:
+		reg = 33;
+		break;
+	case SCLK_UART8:
+		reg = 35;
+		break;
+	case SCLK_UART9:
+		reg = 37;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	if (priv->gpll_hz % rate == 0) {
+		clk_src = CLK_UART_SRC_SEL_GPLL;
+		uart_src = CLK_UART_SEL_SRC;
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+	} else if (priv->cpll_hz % rate == 0) {
+		clk_src = CLK_UART_SRC_SEL_CPLL;
+		uart_src = CLK_UART_SEL_SRC;
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+	} else if (rate == OSC_HZ) {
+		clk_src = CLK_UART_SRC_SEL_GPLL;
+		uart_src = CLK_UART_SEL_XIN24M;
+		div = 2;
+	} else {
+		clk_src = CLK_UART_SRC_SEL_GPLL;
+		uart_src = CLK_UART_SEL_FRAC;
+		div = 2;
+		rational_best_approximation(rate, priv->gpll_hz / div,
+					    GENMASK(16 - 1, 0),
+					    GENMASK(16 - 1, 0),
+					    &n, &m);
+	}
+
+	rk_clrsetreg(&cru->periclksel_con[reg],
+		     CLK_UART_SEL_MASK | CLK_UART_SRC_SEL_MASK |
+		     CLK_UART_SRC_DIV_MASK,
+		     (clk_src << CLK_UART_SRC_SEL_SHIFT) |
+		     (uart_src << CLK_UART_SEL_SHIFT) |
+		     ((div - 1) << CLK_UART_SRC_DIV_SHIFT));
+	if (m && n) {
+		val = n << CLK_UART_FRAC_NUMERATOR_SHIFT | m;
+		writel(val, &cru->periclksel_con[reg + 1]);
+	}
+
+	return rk3562_uart_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_pwm_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, con, div, mask, shift;
+	ulong rate;
+
+	switch (clk_id) {
+	case CLK_PMU1_PWM0:
+		con = readl(&cru->pmu1clksel_con[4]);
+		sel = (con & CLK_PMU1_PWM0_SEL_MASK) >> CLK_PMU1_PWM0_SEL_SHIFT;
+		if (sel == CLK_PMU1_PWM0_SEL_200M)
+			rate = 200 * MHz;
+		else if (sel == CLK_PMU1_PWM0_SEL_24M)
+			rate = OSC_HZ;
+		else
+			rate = 32768;
+		div = (con & CLK_PMU1_PWM0_DIV_MASK) >> CLK_PMU1_PWM0_DIV_SHIFT;
+
+		return DIV_TO_RATE(rate, div);
+	case CLK_PWM1_PERI:
+		mask = CLK_PWM1_PERI_SEL_MASK;
+		shift = CLK_PWM1_PERI_SEL_SHIFT;
+		break;
+	case CLK_PWM2_PERI:
+		mask = CLK_PWM2_PERI_SEL_MASK;
+		shift = CLK_PWM2_PERI_SEL_SHIFT;
+		break;
+	case CLK_PWM3_PERI:
+		mask = CLK_PWM3_PERI_SEL_MASK;
+		shift = CLK_PWM3_PERI_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	con = readl(&cru->periclksel_con[40]);
+	sel = (con & mask) >> shift;
+	if (sel == CLK_PWM_SEL_100M)
+		rate = 100 * MHz;
+	else if (sel == CLK_PWM_SEL_50M)
+		rate = 50 * MHz;
+	else
+		rate = OSC_HZ;
+
+	return rate;
+}
+
+static ulong rk3562_pwm_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				 ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, div, mask, shift;
+
+	switch (clk_id) {
+	case CLK_PMU1_PWM0:
+		if (rate == 200 * MHz) {
+			sel = CLK_PMU1_PWM0_SEL_200M;
+			div = 1;
+		} else if (rate == OSC_HZ) {
+			sel = CLK_PMU1_PWM0_SEL_24M;
+			div = 1;
+		} else if (rate == 32768) {
+			sel = CLK_PMU1_PWM0_SEL_32K;
+			div = 1;
+		} else {
+			sel = CLK_PMU1_PWM0_SEL_200M;
+			div = DIV_ROUND_UP(200 * MHz, rate);
+			assert(div - 1 <= 3);
+		}
+		rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_PWM0_DIV_MASK,
+			     (div - 1) << CLK_PMU1_PWM0_DIV_SHIFT);
+		rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_PWM0_SEL_MASK,
+			     sel << CLK_PMU1_PWM0_SEL_SHIFT);
+
+		return rk3562_pwm_get_rate(priv, clk_id);
+	case CLK_PWM1_PERI:
+		mask = CLK_PWM1_PERI_SEL_MASK;
+		shift = CLK_PWM1_PERI_SEL_SHIFT;
+		break;
+	case CLK_PWM2_PERI:
+		mask = CLK_PWM2_PERI_SEL_MASK;
+		shift = CLK_PWM2_PERI_SEL_SHIFT;
+		break;
+	case CLK_PWM3_PERI:
+		mask = CLK_PWM3_PERI_SEL_MASK;
+		shift = CLK_PWM3_PERI_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	if (rate == 100 * MHz)
+		sel = CLK_PWM_SEL_100M;
+	else if (rate == 50 * MHz)
+		sel = CLK_PWM_SEL_50M;
+	else
+		sel = CLK_PWM_SEL_24M;
+	rk_clrsetreg(&cru->periclksel_con[40], mask, sel << shift);
+
+	return rk3562_pwm_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_spi_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, con, div, mask, shift;
+	ulong rate;
+
+	switch (clk_id) {
+	case CLK_PMU1_SPI0:
+		con = readl(&cru->pmu1clksel_con[4]);
+		sel = (con & CLK_PMU1_SPI0_SEL_MASK) >> CLK_PMU1_SPI0_SEL_SHIFT;
+		if (sel == CLK_PMU1_SPI0_SEL_200M)
+			rate = 200 * MHz;
+		else if (sel == CLK_PMU1_SPI0_SEL_24M)
+			rate = OSC_HZ;
+		else
+			rate = 32768;
+		div = (con & CLK_PMU1_SPI0_DIV_MASK) >> CLK_PMU1_SPI0_DIV_SHIFT;
+
+		return DIV_TO_RATE(rate, div);
+	case CLK_SPI1:
+		mask = CLK_SPI1_SEL_MASK;
+		shift = CLK_SPI1_SEL_SHIFT;
+		break;
+	case CLK_SPI2:
+		mask = CLK_SPI2_SEL_MASK;
+		shift = CLK_SPI2_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	con = readl(&cru->periclksel_con[20]);
+	sel = (con & mask) >> shift;
+	if (sel == CLK_SPI_SEL_200M)
+		rate = 200 * MHz;
+	else if (sel == CLK_SPI_SEL_100M)
+		rate = 100 * MHz;
+	else if (sel == CLK_SPI_SEL_50M)
+		rate = 50 * MHz;
+	else
+		rate = OSC_HZ;
+
+	return rate;
+}
+
+static ulong rk3562_spi_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				 ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, div, mask, shift;
+
+	switch (clk_id) {
+	case CLK_PMU1_SPI0:
+		if (rate == 200 * MHz) {
+			sel = CLK_PMU1_SPI0_SEL_200M;
+			div = 1;
+		} else if (rate == OSC_HZ) {
+			sel = CLK_PMU1_SPI0_SEL_24M;
+			div = 1;
+		} else if (rate == 32768) {
+			sel = CLK_PMU1_SPI0_SEL_32K;
+			div = 1;
+		} else {
+			sel = CLK_PMU1_SPI0_SEL_200M;
+			div = DIV_ROUND_UP(200 * MHz, rate);
+			assert(div - 1 <= 3);
+		}
+		rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_SPI0_DIV_MASK,
+			     (div - 1) << CLK_PMU1_SPI0_DIV_SHIFT);
+		rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_SPI0_SEL_MASK,
+			     sel << CLK_PMU1_SPI0_SEL_SHIFT);
+
+		return rk3562_spi_get_rate(priv, clk_id);
+	case CLK_SPI1:
+		mask = CLK_SPI1_SEL_MASK;
+		shift = CLK_SPI1_SEL_SHIFT;
+		break;
+	case CLK_SPI2:
+		mask = CLK_SPI2_SEL_MASK;
+		shift = CLK_SPI2_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	if (rate == 200 * MHz)
+		sel = CLK_SPI_SEL_200M;
+	else if (rate == 100 * MHz)
+		sel = CLK_SPI_SEL_100M;
+	else if (rate == 50 * MHz)
+		sel = CLK_SPI_SEL_50M;
+	else
+		sel = CLK_SPI_SEL_24M;
+	rk_clrsetreg(&cru->periclksel_con[20], mask, sel << shift);
+
+	return rk3562_spi_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_tsadc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div, con;
+
+	con = readl(&cru->clksel_con[43]);
+	switch (clk_id) {
+	case CLK_TSADC_TSEN:
+		div = (con & CLK_TSADC_TSEN_DIV_MASK) >>
+		       CLK_TSADC_TSEN_DIV_SHIFT;
+		break;
+	case CLK_TSADC:
+		div = (con & CLK_TSADC_DIV_MASK) >> CLK_TSADC_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(OSC_HZ, div);
+}
+
+static ulong rk3562_tsadc_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				   ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div, mask, shift;
+
+	switch (clk_id) {
+	case CLK_TSADC_TSEN:
+		mask = CLK_TSADC_TSEN_DIV_MASK;
+		shift =	CLK_TSADC_TSEN_DIV_SHIFT;
+		break;
+	case CLK_TSADC:
+		mask = CLK_TSADC_DIV_MASK;
+		shift =	CLK_TSADC_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	div = DIV_ROUND_UP(OSC_HZ, rate);
+	rk_clrsetreg(&cru->clksel_con[43], mask, (div - 1) << shift);
+
+	return rk3562_tsadc_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_saradc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div, con;
+
+	switch (clk_id) {
+	case CLK_SARADC_VCCIO156:
+		con = readl(&cru->clksel_con[44]);
+		div = (con & CLK_SARADC_VCCIO156_DIV_MASK) >>
+		       CLK_SARADC_VCCIO156_DIV_SHIFT;
+		break;
+	case CLK_SARADC:
+		con = readl(&cru->periclksel_con[46]);
+		div = (con & CLK_SARADC_DIV_MASK) >> CLK_SARADC_DIV_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(OSC_HZ, div);
+}
+
+static ulong rk3562_saradc_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				    ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div;
+
+	switch (clk_id) {
+	case CLK_SARADC_VCCIO156:
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+		rk_clrsetreg(&cru->clksel_con[44], CLK_SARADC_VCCIO156_DIV_MASK,
+			     (div - 1) << CLK_SARADC_VCCIO156_DIV_SHIFT);
+		break;
+	case CLK_SARADC:
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+		rk_clrsetreg(&cru->periclksel_con[46], CLK_SARADC_DIV_MASK,
+			     (div - 1) << CLK_SARADC_DIV_SHIFT);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rk3562_saradc_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_sfc_get_rate(struct rk3562_clk_priv *priv)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div, sel, con, parent;
+
+	con = readl(&cru->periclksel_con[20]);
+	div = (con & SCLK_SFC_DIV_MASK) >> SCLK_SFC_DIV_SHIFT;
+	sel = (con & SCLK_SFC_SEL_MASK) >> SCLK_SFC_SEL_SHIFT;
+	if (sel == SCLK_SFC_SRC_SEL_GPLL)
+		parent = priv->gpll_hz;
+	else if (sel == SCLK_SFC_SRC_SEL_CPLL)
+		parent = priv->cpll_hz;
+	else
+		parent = OSC_HZ;
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3562_sfc_set_rate(struct rk3562_clk_priv *priv, ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	int div, sel;
+
+	if (OSC_HZ % rate == 0) {
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+		sel = SCLK_SFC_SRC_SEL_24M;
+	} else if ((priv->cpll_hz % rate) == 0) {
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+		sel = SCLK_SFC_SRC_SEL_CPLL;
+	} else {
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+		sel = SCLK_SFC_SRC_SEL_GPLL;
+	}
+
+	assert(div - 1 <= 255);
+	rk_clrsetreg(&cru->periclksel_con[20],
+		     SCLK_SFC_SEL_MASK | SCLK_SFC_DIV_MASK,
+		     sel << SCLK_SFC_SEL_SHIFT |
+		     (div - 1) << SCLK_SFC_DIV_SHIFT);
+
+	return rk3562_sfc_get_rate(priv);
+}
+
+static ulong rk3562_emmc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div, sel, con, parent;
+
+	switch (clk_id) {
+	case CCLK_EMMC:
+		con = readl(&cru->periclksel_con[18]);
+		div = (con & CCLK_EMMC_DIV_MASK) >> CCLK_EMMC_DIV_SHIFT;
+		sel = (con & CCLK_EMMC_SEL_MASK) >> CCLK_EMMC_SEL_SHIFT;
+		if (sel == CCLK_EMMC_SEL_GPLL)
+			parent = priv->gpll_hz;
+		else if (sel == CCLK_EMMC_SEL_CPLL)
+			parent = priv->cpll_hz;
+		else if (sel == CCLK_EMMC_SEL_HPLL)
+			parent = priv->hpll_hz;
+		else
+			parent = OSC_HZ;
+		break;
+	case BCLK_EMMC:
+		con = readl(&cru->periclksel_con[19]);
+		div = (con & BCLK_EMMC_DIV_MASK) >> BCLK_EMMC_DIV_SHIFT;
+		sel = (con & BCLK_EMMC_SEL_MASK) >> BCLK_EMMC_SEL_SHIFT;
+		if (sel == BCLK_EMMC_SEL_GPLL)
+			parent = priv->gpll_hz;
+		else
+			parent = priv->cpll_hz;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(parent, div);
+}
+
+static ulong rk3562_emmc_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				  ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	int div, sel;
+
+	switch (clk_id) {
+	case CCLK_EMMC:
+		if (OSC_HZ % rate == 0) {
+			div = DIV_ROUND_UP(OSC_HZ, rate);
+			sel = CCLK_EMMC_SEL_24M;
+		} else if ((priv->cpll_hz % rate) == 0) {
+			div = DIV_ROUND_UP(priv->cpll_hz, rate);
+			sel = CCLK_EMMC_SEL_CPLL;
+		} else if ((priv->hpll_hz % rate) == 0) {
+			div = DIV_ROUND_UP(priv->hpll_hz, rate);
+			sel = CCLK_EMMC_SEL_HPLL;
+		} else {
+			div = DIV_ROUND_UP(priv->gpll_hz, rate);
+			sel = CCLK_EMMC_SEL_GPLL;
+		}
+		rk_clrsetreg(&cru->periclksel_con[18],
+			     CCLK_EMMC_SEL_MASK | CCLK_EMMC_DIV_MASK,
+			     sel << CCLK_EMMC_SEL_SHIFT |
+			     (div - 1) << CCLK_EMMC_DIV_SHIFT);
+		break;
+	case BCLK_EMMC:
+		if ((priv->cpll_hz % rate) == 0) {
+			div = DIV_ROUND_UP(priv->cpll_hz, rate);
+			sel = BCLK_EMMC_SEL_CPLL;
+		} else {
+			div = DIV_ROUND_UP(priv->gpll_hz, rate);
+			sel = BCLK_EMMC_SEL_GPLL;
+		}
+		rk_clrsetreg(&cru->periclksel_con[19],
+			     BCLK_EMMC_SEL_MASK | BCLK_EMMC_DIV_MASK,
+			     sel << BCLK_EMMC_SEL_SHIFT |
+			     (div - 1) << BCLK_EMMC_DIV_SHIFT);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rk3562_emmc_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_sdmmc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div, sel, con;
+	ulong prate;
+
+	switch (clk_id) {
+	case HCLK_SDMMC0:
+	case CCLK_SDMMC0:
+	case SCLK_SDMMC0_SAMPLE:
+		con = readl(&cru->periclksel_con[16]);
+		div = (con & CCLK_SDMMC0_DIV_MASK) >> CCLK_SDMMC0_DIV_SHIFT;
+		sel = (con & CCLK_SDMMC0_SEL_MASK) >> CCLK_SDMMC0_SEL_SHIFT;
+		break;
+	case HCLK_SDMMC1:
+	case CCLK_SDMMC1:
+	case SCLK_SDMMC1_SAMPLE:
+		con = readl(&cru->periclksel_con[17]);
+		div = (con & CCLK_SDMMC1_DIV_MASK) >> CCLK_SDMMC1_DIV_SHIFT;
+		sel = (con & CCLK_SDMMC1_SEL_MASK) >> CCLK_SDMMC1_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	if (sel == CCLK_SDMMC_SEL_GPLL)
+		prate = priv->gpll_hz;
+	else if (sel == CCLK_SDMMC_SEL_CPLL)
+		prate = priv->cpll_hz;
+	else if (sel == CCLK_SDMMC_SEL_HPLL)
+		prate = priv->hpll_hz;
+	else
+		prate = OSC_HZ;
+
+	return DIV_TO_RATE(prate, div);
+}
+
+static ulong rk3562_sdmmc_set_rate(struct rk3562_clk_priv *priv,
+				   ulong clk_id, ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 div, sel;
+
+	if (OSC_HZ % rate == 0) {
+		div = DIV_ROUND_UP(OSC_HZ, rate);
+		sel = CCLK_SDMMC_SEL_24M;
+	} else if ((priv->cpll_hz % rate) == 0) {
+		div = DIV_ROUND_UP(priv->cpll_hz, rate);
+		sel = CCLK_SDMMC_SEL_CPLL;
+	} else if ((priv->hpll_hz % rate) == 0) {
+		div = DIV_ROUND_UP(priv->hpll_hz, rate);
+		sel = CCLK_SDMMC_SEL_HPLL;
+	} else {
+		div = DIV_ROUND_UP(priv->gpll_hz, rate);
+		sel = CCLK_SDMMC_SEL_CPLL;
+	}
+
+	switch (clk_id) {
+	case HCLK_SDMMC0:
+	case CCLK_SDMMC0:
+		rk_clrsetreg(&cru->periclksel_con[16],
+			     CCLK_SDMMC0_SEL_MASK | CCLK_SDMMC0_DIV_MASK,
+			     sel << CCLK_SDMMC0_SEL_SHIFT |
+			     (div - 1) << CCLK_SDMMC0_DIV_SHIFT);
+		break;
+	case HCLK_SDMMC1:
+	case CCLK_SDMMC1:
+		rk_clrsetreg(&cru->periclksel_con[17],
+			     CCLK_SDMMC1_SEL_MASK | CCLK_SDMMC1_DIV_MASK,
+			     sel << CCLK_SDMMC1_SEL_SHIFT |
+			     (div - 1) << CCLK_SDMMC1_DIV_SHIFT);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rk3562_sdmmc_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_vop_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 con, sel, div;
+	ulong prate;
+
+	switch (clk_id) {
+	case ACLK_VOP:
+		con = readl(&cru->clksel_con[28]);
+		div = (con & ACLK_VOP_DIV_MASK) >> ACLK_VOP_DIV_SHIFT;
+		sel = (con & ACLK_VOP_SEL_MASK) >> ACLK_VOP_SEL_SHIFT;
+		if (sel == ACLK_VOP_SEL_GPLL)
+			prate = priv->gpll_hz;
+		else if (sel == ACLK_VOP_SEL_CPLL)
+			prate = priv->cpll_hz;
+		else if (sel == ACLK_VOP_SEL_HPLL)
+			prate = priv->hpll_hz;
+		else if (sel == ACLK_VOP_SEL_VPLL)
+			prate = priv->vpll_hz;
+		else
+			return -ENOENT;
+
+		return DIV_TO_RATE(prate, div);
+	case DCLK_VOP:
+		con = readl(&cru->clksel_con[30]);
+		div = (con & DCLK_VOP_DIV_MASK) >> DCLK_VOP_DIV_SHIFT;
+		sel = (con & DCLK_VOP_SEL_MASK) >> DCLK_VOP_SEL_SHIFT;
+		if (sel == DCLK_VOP_SEL_VPLL)
+			priv->vpll_hz =
+				rockchip_pll_get_rate(&rk3562_pll_clks[VPLL],
+						      priv->cru, VPLL);
+		break;
+	case DCLK_VOP1:
+		con = readl(&cru->clksel_con[31]);
+		div = (con & DCLK_VOP1_DIV_MASK) >> DCLK_VOP1_DIV_SHIFT;
+		sel = (con & DCLK_VOP1_SEL_MASK) >> DCLK_VOP1_SEL_SHIFT;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	if (sel == DCLK_VOP_SEL_GPLL)
+		prate = priv->gpll_hz;
+	else if (sel == DCLK_VOP_SEL_HPLL)
+		prate = priv->hpll_hz;
+	else if (sel == DCLK_VOP_SEL_VPLL)
+		prate = priv->vpll_hz;
+	else
+		return -ENOENT;
+
+	return DIV_TO_RATE(prate, div);
+}
+
+#define RK3562_VOP_PLL_LIMIT_FREQ 600000000
+
+static ulong rk3562_vop_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				 ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 i, div, sel, best_div = 0, best_sel = 0;
+	ulong pll_rate, now, best_rate = 0;
+
+	switch (clk_id) {
+	case ACLK_VOP:
+		if ((priv->cpll_hz % rate) == 0) {
+			div = DIV_ROUND_UP(priv->cpll_hz, rate);
+			sel = ACLK_VOP_SEL_CPLL;
+		} else if ((priv->hpll_hz % rate) == 0) {
+			div = DIV_ROUND_UP(priv->hpll_hz, rate);
+			sel = ACLK_VOP_SEL_HPLL;
+		} else if ((priv->vpll_hz % rate) == 0) {
+			div = DIV_ROUND_UP(priv->vpll_hz, rate);
+			sel = ACLK_VOP_SEL_VPLL;
+		} else {
+			div = DIV_ROUND_UP(priv->gpll_hz, rate);
+			sel = ACLK_VOP_SEL_GPLL;
+		}
+		rk_clrsetreg(&cru->clksel_con[28],
+			     ACLK_VOP_SEL_MASK | ACLK_VOP_DIV_MASK,
+			     sel << ACLK_VOP_SEL_SHIFT |
+			     ((div - 1) << ACLK_VOP_DIV_SHIFT));
+
+		return rk3562_vop_get_rate(priv, clk_id);
+	case DCLK_VOP:
+		div = DIV_ROUND_UP(RK3562_VOP_PLL_LIMIT_FREQ, rate);
+		rk_clrsetreg(&cru->clksel_con[30],
+			     DCLK_VOP_SEL_MASK | DCLK_VOP_DIV_MASK,
+			     DCLK_VOP_SEL_VPLL << DCLK_VOP_SEL_SHIFT |
+			     ((div - 1) << DCLK_VOP_DIV_SHIFT));
+		rockchip_pll_set_rate(&rk3562_pll_clks[VPLL], priv->cru,
+				      VPLL, div * rate);
+		break;
+	case DCLK_VOP1:
+		for (i = 0; i <= DCLK_VOP_SEL_APLL; i++) {
+			switch (i) {
+			case DCLK_VOP_SEL_GPLL:
+				pll_rate = priv->gpll_hz;
+				break;
+			case DCLK_VOP_SEL_HPLL:
+				pll_rate = priv->hpll_hz;
+				break;
+			case DCLK_VOP_SEL_VPLL:
+			case DCLK_VOP_SEL_APLL:
+				continue;
+			default:
+				printf("do not support this vop pll sel\n");
+				return -EINVAL;
+			}
+
+			div = DIV_ROUND_UP(pll_rate, rate);
+			if (div > 255)
+				continue;
+			now = pll_rate / div;
+			if (abs(rate - now) < abs(rate - best_rate)) {
+				best_rate = now;
+				best_div = div;
+				best_sel = i;
+			}
+			debug("p_rate=%lu, best_rate=%lu, div=%u, sel=%u\n",
+			      pll_rate, best_rate, best_div, best_sel);
+		}
+		if (best_rate) {
+			rk_clrsetreg(&cru->clksel_con[31],
+				     DCLK_VOP1_SEL_MASK | DCLK_VOP1_DIV_MASK,
+				     best_sel << DCLK_VOP1_SEL_SHIFT |
+				     (best_div - 1) << DCLK_VOP1_DIV_SHIFT);
+		} else {
+			printf("do not support this vop freq %lu\n", rate);
+			return -EINVAL;
+		}
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rk3562_vop_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_gmac_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 con, sel, div;
+	ulong prate;
+
+	switch (clk_id) {
+	case CLK_GMAC_125M_CRU_I:
+		con = readl(&cru->clksel_con[45]);
+		sel = (con & CLK_GMAC_125M_SEL_MASK) >> CLK_GMAC_125M_SEL_SHIFT;
+		if (sel == CLK_GMAC_125M)
+			return 125000000;
+		else
+			return OSC_HZ;
+	case CLK_GMAC_50M_CRU_I:
+		con = readl(&cru->clksel_con[45]);
+		sel = (con & CLK_GMAC_50M_SEL_MASK) >> CLK_GMAC_50M_SEL_SHIFT;
+		if (sel == CLK_GMAC_50M)
+			return 50000000;
+		else
+			return OSC_HZ;
+	case CLK_MAC100_50M_MATRIX:
+		con = readl(&cru->clksel_con[47]);
+		sel = (con & CLK_GMAC_50M_SEL_MASK) >> CLK_GMAC_50M_SEL_SHIFT;
+		if (sel == CLK_GMAC_50M)
+			return 50000000;
+		else
+			return OSC_HZ;
+	case CLK_GMAC_ETH_OUT2IO:
+		con = readl(&cru->clksel_con[46]);
+		sel = (con & CLK_GMAC_ETH_OUT2IO_SEL_MASK) >> CLK_GMAC_ETH_OUT2IO_SEL_SHIFT;
+		div = (con & CLK_GMAC_ETH_OUT2IO_DIV_MASK) >> CLK_GMAC_ETH_OUT2IO_DIV_SHIFT;
+		if (sel == CLK_GMAC_ETH_OUT2IO_GPLL)
+			prate = priv->gpll_hz;
+		else
+			prate = priv->cpll_hz;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return DIV_TO_RATE(prate, div);
+}
+
+static ulong rk3562_gmac_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				  ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, div;
+
+	switch (clk_id) {
+	case CLK_GMAC_125M_CRU_I:
+		if (rate == 125000000)
+			sel = CLK_GMAC_125M;
+		else
+			sel = CLK_GMAC_24M;
+		rk_clrsetreg(&cru->clksel_con[45], CLK_GMAC_125M_SEL_MASK,
+			     sel << CLK_GMAC_125M_SEL_SHIFT);
+		break;
+	case CLK_GMAC_50M_CRU_I:
+		if (rate == 50000000)
+			sel = CLK_GMAC_50M;
+		else
+			sel = CLK_GMAC_24M;
+		rk_clrsetreg(&cru->clksel_con[45], CLK_GMAC_50M_SEL_MASK,
+			     sel << CLK_GMAC_50M_SEL_SHIFT);
+		break;
+	case CLK_MAC100_50M_MATRIX:
+		if (rate == 50000000)
+			sel = CLK_GMAC_50M;
+		else
+			sel = CLK_GMAC_24M;
+		rk_clrsetreg(&cru->clksel_con[47], CLK_GMAC_50M_SEL_MASK,
+			     sel << CLK_GMAC_50M_SEL_SHIFT);
+		break;
+	case CLK_GMAC_ETH_OUT2IO:
+		if ((priv->cpll_hz % rate) == 0) {
+			div = DIV_ROUND_UP(priv->cpll_hz, rate);
+			sel = CLK_GMAC_ETH_OUT2IO_CPLL;
+		} else {
+			div = DIV_ROUND_UP(priv->gpll_hz, rate);
+			sel = CLK_GMAC_ETH_OUT2IO_GPLL;
+		}
+		rk_clrsetreg(&cru->clksel_con[46],
+			     CLK_GMAC_ETH_OUT2IO_SEL_MASK | CLK_GMAC_ETH_OUT2IO_DIV_MASK,
+			     sel << CLK_GMAC_ETH_OUT2IO_SEL_SHIFT |
+			     (div - 1) << CLK_GMAC_ETH_OUT2IO_DIV_SHIFT);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rk3562_gmac_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_clk_get_rate(struct clk *clk)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(clk->dev);
+	ulong rate = 0;
+
+	if (!priv->gpll_hz || !priv->cpll_hz || !priv->hpll_hz) {
+		printf("%s: gpll=%lu, cpll=%lu, hpll=%lu\n",
+		       __func__, priv->gpll_hz, priv->cpll_hz, priv->hpll_hz);
+		return -ENOENT;
+	}
+
+	switch (clk->id) {
+	case PLL_APLL:
+	case ARMCLK:
+		rate = rockchip_pll_get_rate(&rk3562_pll_clks[APLL], priv->cru,
+					     APLL);
+		break;
+	case PLL_GPLL:
+		rate = rockchip_pll_get_rate(&rk3562_pll_clks[GPLL], priv->cru,
+					     GPLL);
+		break;
+
+	case PLL_VPLL:
+		rate = rockchip_pll_get_rate(&rk3562_pll_clks[VPLL], priv->cru,
+					     VPLL);
+		break;
+	case PLL_HPLL:
+		rate = rockchip_pll_get_rate(&rk3562_pll_clks[HPLL], priv->cru,
+					     HPLL);
+		break;
+	case PLL_CPLL:
+		rate = rockchip_pll_get_rate(&rk3562_pll_clks[CPLL], priv->cru,
+					     CPLL);
+		break;
+	case PLL_DPLL:
+		rate = rockchip_pll_get_rate(&rk3562_pll_clks[DPLL], priv->cru,
+					     DPLL);
+		break;
+	case ACLK_BUS:
+	case HCLK_BUS:
+	case PCLK_BUS:
+		rate = rk3562_bus_get_rate(priv, clk->id);
+		break;
+	case ACLK_PERI:
+	case HCLK_PERI:
+	case PCLK_PERI:
+		rate = rk3562_peri_get_rate(priv, clk->id);
+		break;
+	case CLK_PMU0_I2C0:
+	case CLK_I2C:
+	case CLK_I2C1:
+	case CLK_I2C2:
+	case CLK_I2C3:
+	case CLK_I2C4:
+	case CLK_I2C5:
+		rate = rk3562_i2c_get_rate(priv, clk->id);
+		break;
+	case SCLK_PMU1_UART0:
+	case SCLK_UART1:
+	case SCLK_UART2:
+	case SCLK_UART3:
+	case SCLK_UART4:
+	case SCLK_UART5:
+	case SCLK_UART6:
+	case SCLK_UART7:
+	case SCLK_UART8:
+	case SCLK_UART9:
+		rate = rk3562_uart_get_rate(priv, clk->id);
+		break;
+	case CLK_PMU1_PWM0:
+	case CLK_PWM1_PERI:
+	case CLK_PWM2_PERI:
+	case CLK_PWM3_PERI:
+		rate = rk3562_pwm_get_rate(priv, clk->id);
+		break;
+	case CLK_PMU1_SPI0:
+	case CLK_SPI1:
+	case CLK_SPI2:
+		rate = rk3562_spi_get_rate(priv, clk->id);
+		break;
+	case CLK_TSADC:
+	case CLK_TSADC_TSEN:
+		rate = rk3562_tsadc_get_rate(priv, clk->id);
+		break;
+	case CLK_SARADC:
+	case CLK_SARADC_VCCIO156:
+		rate = rk3562_saradc_get_rate(priv, clk->id);
+		break;
+	case SCLK_SFC:
+		rate = rk3562_sfc_get_rate(priv);
+		break;
+	case CCLK_EMMC:
+	case BCLK_EMMC:
+		rate = rk3562_emmc_get_rate(priv, clk->id);
+		break;
+	case HCLK_SDMMC0:
+	case HCLK_SDMMC1:
+	case CCLK_SDMMC0:
+	case CCLK_SDMMC1:
+	case SCLK_SDMMC0_SAMPLE:
+	case SCLK_SDMMC1_SAMPLE:
+		rate = rk3562_sdmmc_get_rate(priv, clk->id);
+		break;
+	case ACLK_VOP:
+	case DCLK_VOP:
+	case DCLK_VOP1:
+		rate = rk3562_vop_get_rate(priv, clk->id);
+		break;
+	case CLK_GMAC_125M_CRU_I:
+	case CLK_GMAC_50M_CRU_I:
+	case CLK_GMAC_ETH_OUT2IO:
+	case CLK_MAC100_50M_MATRIX:
+		rate = rk3562_gmac_get_rate(priv, clk->id);
+		break;
+	case CLK_WDTNS:
+		rate = OSC_HZ;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rate;
+};
+
+static ulong rk3562_clk_set_rate(struct clk *clk, ulong rate)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(clk->dev);
+	ulong ret = 0;
+
+	if (!priv->gpll_hz || !priv->cpll_hz || !priv->hpll_hz) {
+		printf("%s: gpll=%lu, cpll=%lu, hpll=%lu\n",
+		       __func__, priv->gpll_hz, priv->cpll_hz, priv->hpll_hz);
+		return -ENOENT;
+	}
+
+	debug("%s: id=%ld, rate=%ld\n", __func__, clk->id, rate);
+
+	switch (clk->id) {
+	case PLL_APLL:
+	case ARMCLK:
+		if (priv->armclk_hz)
+			rk3562_armclk_set_rate(priv, rate);
+		priv->armclk_hz = rate;
+		break;
+	case PLL_GPLL:
+		ret = rockchip_pll_set_rate(&rk3562_pll_clks[GPLL], priv->cru,
+					    GPLL, rate);
+		priv->gpll_hz = rockchip_pll_get_rate(&rk3562_pll_clks[GPLL],
+						      priv->cru, GPLL);
+		break;
+	case PLL_VPLL:
+		ret = rockchip_pll_set_rate(&rk3562_pll_clks[VPLL], priv->cru,
+					    VPLL, rate);
+		priv->vpll_hz = rockchip_pll_get_rate(&rk3562_pll_clks[VPLL],
+						      priv->cru, VPLL);
+		break;
+	case PLL_HPLL:
+		ret = rockchip_pll_set_rate(&rk3562_pll_clks[HPLL], priv->cru,
+					    HPLL, rate);
+		priv->hpll_hz = rockchip_pll_get_rate(&rk3562_pll_clks[HPLL],
+						      priv->cru, HPLL);
+		break;
+	case ACLK_BUS:
+	case HCLK_BUS:
+	case PCLK_BUS:
+		ret = rk3562_bus_set_rate(priv, clk->id, rate);
+		break;
+	case ACLK_PERI:
+	case HCLK_PERI:
+	case PCLK_PERI:
+		ret = rk3562_peri_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_PMU0_I2C0:
+	case CLK_I2C:
+	case CLK_I2C1:
+	case CLK_I2C2:
+	case CLK_I2C3:
+	case CLK_I2C4:
+	case CLK_I2C5:
+		ret = rk3562_i2c_set_rate(priv, clk->id, rate);
+		break;
+	case SCLK_PMU1_UART0:
+	case SCLK_UART1:
+	case SCLK_UART2:
+	case SCLK_UART3:
+	case SCLK_UART4:
+	case SCLK_UART5:
+	case SCLK_UART6:
+	case SCLK_UART7:
+	case SCLK_UART8:
+	case SCLK_UART9:
+		ret = rk3562_uart_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_PMU1_PWM0:
+	case CLK_PWM1_PERI:
+	case CLK_PWM2_PERI:
+	case CLK_PWM3_PERI:
+		ret = rk3562_pwm_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_PMU1_SPI0:
+	case CLK_SPI1:
+	case CLK_SPI2:
+		ret = rk3562_spi_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_TSADC:
+	case CLK_TSADC_TSEN:
+		ret = rk3562_tsadc_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_SARADC:
+	case CLK_SARADC_VCCIO156:
+		ret = rk3562_saradc_set_rate(priv, clk->id, rate);
+		break;
+	case SCLK_SFC:
+		ret = rk3562_sfc_set_rate(priv, rate);
+		break;
+	case CCLK_EMMC:
+	case BCLK_EMMC:
+		ret = rk3562_emmc_set_rate(priv, clk->id, rate);
+		break;
+	case HCLK_SDMMC0:
+	case HCLK_SDMMC1:
+	case CCLK_SDMMC0:
+	case CCLK_SDMMC1:
+		ret = rk3562_sdmmc_set_rate(priv, clk->id, rate);
+		break;
+	case ACLK_VOP:
+	case DCLK_VOP:
+	case DCLK_VOP1:
+		ret = rk3562_vop_set_rate(priv, clk->id, rate);
+		break;
+	case CLK_GMAC_125M_CRU_I:
+	case CLK_GMAC_50M_CRU_I:
+	case CLK_GMAC_ETH_OUT2IO:
+	case CLK_MAC100_50M_MATRIX:
+		ret = rk3562_gmac_set_rate(priv, clk->id, rate);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return ret;
+};
+
+#define ROCKCHIP_MMC_DELAY_SEL		BIT(11)
+#define ROCKCHIP_MMC_DEGREE_SHIFT	1
+#define ROCKCHIP_MMC_DEGREE_MASK	(0x3 << ROCKCHIP_MMC_DEGREE_SHIFT)
+#define ROCKCHIP_MMC_DELAYNUM_SHIFT	3
+#define ROCKCHIP_MMC_DELAYNUM_MASK	(0xff << ROCKCHIP_MMC_DELAYNUM_SHIFT)
+#define PSECS_PER_SEC 1000000000000LL
+
+/*
+ * Each fine delay is between 44ps-77ps. Assume each fine delay is 60ps to
+ * simplify calculations. So 45degs could be anywhere between 33deg and 57.8deg.
+ */
+#define ROCKCHIP_MMC_DELAY_ELEMENT_PSEC 60
+
+int rk3562_mmc_get_phase(struct clk *clk)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3562_cru *cru = priv->cru;
+	u32 raw_value, delay_num;
+	u16 degrees = 0;
+	ulong rate;
+
+	rate = rk3562_clk_get_rate(clk);
+	if (rate < 0)
+		return rate;
+
+	if (clk->id == SCLK_SDMMC0_SAMPLE)
+		raw_value = readl(&cru->sdmmc0_con[1]);
+	else if (clk->id == SCLK_SDMMC0_SAMPLE)
+		raw_value = readl(&cru->sdmmc1_con[1]);
+	else
+		return -ENONET;
+
+	raw_value &= ROCKCHIP_MMC_DEGREE_MASK;
+	degrees = (raw_value >>  ROCKCHIP_MMC_DEGREE_SHIFT) * 90;
+
+	if (raw_value & ROCKCHIP_MMC_DELAY_SEL) {
+		/* degrees/delaynum * 10000 */
+		unsigned long factor = (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10) *
+					36 * (rate / 1000000);
+
+		delay_num = (raw_value & ROCKCHIP_MMC_DELAYNUM_MASK);
+		delay_num >>= ROCKCHIP_MMC_DELAYNUM_SHIFT;
+		degrees += DIV_ROUND_CLOSEST(delay_num * factor, 10000);
+	}
+
+	return degrees % 360;
+}
+
+int rk3562_mmc_set_phase(struct clk *clk, u32 degrees)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(clk->dev);
+	struct rk3562_cru *cru = priv->cru;
+	u8 nineties, remainder, delay_num;
+	u32 raw_value, delay;
+	ulong rate;
+
+	rate = rk3562_clk_get_rate(clk);
+	if (rate < 0)
+		return rate;
+
+	nineties = degrees / 90;
+	remainder = (degrees % 90);
+
+	/*
+	 * Convert to delay; do a little extra work to make sure we
+	 * don't overflow 32-bit / 64-bit numbers.
+	 */
+	delay = 10000000; /* PSECS_PER_SEC / 10000 / 10 */
+	delay *= remainder;
+	delay = DIV_ROUND_CLOSEST(delay, (rate / 1000) * 36 *
+				(ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10));
+
+	delay_num = (u8)min_t(u32, delay, 255);
+
+	raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0;
+	raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_SHIFT;
+	raw_value |= nineties << ROCKCHIP_MMC_DEGREE_SHIFT;
+
+	if (clk->id == SCLK_SDMMC0_SAMPLE)
+		writel(raw_value | 0xffff0000, &cru->sdmmc0_con[1]);
+	else
+		writel(raw_value | 0xffff0000, &cru->sdmmc1_con[1]);
+
+	debug("mmc set_phase(%d) delay_nums=%u reg=%#x actual_degrees=%d\n",
+	      degrees, delay_num, raw_value, rk3562_mmc_get_phase(clk));
+
+	return 0;
+}
+
+static int rk3562_clk_get_phase(struct clk *clk)
+{
+	int ret;
+
+	switch (clk->id) {
+	case SCLK_SDMMC0_SAMPLE:
+	case SCLK_SDMMC1_SAMPLE:
+		ret = rk3562_mmc_get_phase(clk);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return ret;
+}
+
+static int rk3562_clk_set_phase(struct clk *clk, int degrees)
+{
+	int ret;
+
+	switch (clk->id) {
+	case SCLK_SDMMC0_SAMPLE:
+	case SCLK_SDMMC1_SAMPLE:
+		ret = rk3562_mmc_set_phase(clk, degrees);
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return ret;
+}
+
+static struct clk_ops rk3562_clk_ops = {
+	.get_rate = rk3562_clk_get_rate,
+	.set_rate = rk3562_clk_set_rate,
+	.get_phase = rk3562_clk_get_phase,
+	.set_phase = rk3562_clk_set_phase,
+};
+
+#ifndef CONFIG_SPL_BUILD
+/**
+ * soc_clk_dump() - Print clock frequencies
+ * Returns zero on success
+ *
+ * Implementation for the clk dump command.
+ */
+int soc_clk_dump(void)
+{
+	const struct rk3562_clk_info *clk_dump;
+	struct rk3562_clk_priv *priv;
+	struct udevice *cru_dev;
+	struct clk clk;
+	ulong clk_count = ARRAY_SIZE(clks_dump);
+	ulong rate;
+	int i, ret;
+
+	ret = uclass_get_device_by_driver(UCLASS_CLK,
+					  DM_GET_DRIVER(rockchip_rk3562_cru),
+					  &cru_dev);
+	if (ret) {
+		printf("%s failed to get cru device\n", __func__);
+		return ret;
+	}
+
+	priv = dev_get_priv(cru_dev);
+	printf("CLK: (%s. arm: enter %lu KHz, init %lu KHz, kernel %lu%s)\n",
+	       priv->sync_kernel ? "sync kernel" : "uboot",
+	       priv->armclk_enter_hz / 1000,
+	       priv->armclk_init_hz / 1000,
+	       priv->set_armclk_rate ? priv->armclk_hz / 1000 : 0,
+	       priv->set_armclk_rate ? " KHz" : "N/A");
+	for (i = 0; i < clk_count; i++) {
+		clk_dump = &clks_dump[i];
+		if (clk_dump->name) {
+			clk.id = clk_dump->id;
+			ret = clk_request(cru_dev, &clk);
+			if (ret < 0)
+				return ret;
+
+			rate = clk_get_rate(&clk);
+			clk_free(&clk);
+			if (i == 0) {
+				if (rate < 0)
+					printf("  %s %s\n", clk_dump->name,
+					       "unknown");
+				else
+					printf("  %s %lu KHz\n", clk_dump->name,
+					       rate / 1000);
+			} else {
+				if (rate < 0)
+					printf("  %s %s\n", clk_dump->name,
+					       "unknown");
+				else
+					printf("  %s %lu KHz\n", clk_dump->name,
+					       rate / 1000);
+			}
+		}
+	}
+
+	return 0;
+}
+#endif
+
+static void rk3562_clk_init(struct rk3562_clk_priv *priv)
+{
+	int ret;
+
+	priv->sync_kernel = false;
+	if (!priv->armclk_enter_hz)
+		priv->armclk_enter_hz =
+			rockchip_pll_get_rate(&rk3562_pll_clks[APLL],
+					      priv->cru, APLL);
+
+	if (!priv->armclk_init_hz) {
+#ifdef CONFIG_SPL_BUILD
+		ret = rk3562_armclk_set_rate(priv, APLL_HZ);
+		if (!ret)
+			priv->armclk_init_hz = APLL_HZ;
+
+#else
+		struct clk clk;
+
+		ret = rockchip_get_scmi_clk(&clk.dev);
+		if (ret) {
+			printf("Failed to get scmi clk dev\n");
+			return;
+		}
+
+		clk.id = ARMCLK;
+		ret = clk_set_rate(&clk, CPU_PVTPLL_HZ);
+		if (ret < 0) {
+			printf("Failed to set scmi cpu %dhz\n", CPU_PVTPLL_HZ);
+			return;
+		} else {
+			priv->armclk_init_hz = CPU_PVTPLL_HZ;
+		}
+#endif
+	}
+	if (priv->cpll_hz != CPLL_HZ) {
+		ret = rockchip_pll_set_rate(&rk3562_pll_clks[CPLL], priv->cru,
+					    CPLL, CPLL_HZ);
+		if (!ret)
+			priv->cpll_hz = CPLL_HZ;
+	}
+
+	if (priv->gpll_hz != GPLL_HZ) {
+		ret = rockchip_pll_set_rate(&rk3562_pll_clks[GPLL], priv->cru,
+					    GPLL, GPLL_HZ);
+		if (!ret)
+			priv->gpll_hz = GPLL_HZ;
+	}
+
+	if (priv->hpll_hz != HPLL_HZ) {
+		ret = rockchip_pll_set_rate(&rk3562_pll_clks[HPLL], priv->cru,
+					    HPLL, HPLL_HZ);
+		if (!ret)
+			priv->hpll_hz = HPLL_HZ;
+	}
+}
+
+static int rk3562_clk_probe(struct udevice *dev)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(dev);
+	int ret;
+
+	rk3562_clk_init(priv);
+
+	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
+	ret = clk_set_defaults(dev);
+	if (ret)
+		debug("%s clk_set_defaults failed %d\n", __func__, ret);
+	else
+		priv->sync_kernel = true;
+
+	return 0;
+}
+
+static int rk3562_clk_ofdata_to_platdata(struct udevice *dev)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(dev);
+
+	priv->cru = dev_read_addr_ptr(dev);
+
+	return 0;
+}
+
+static int rk3562_clk_bind(struct udevice *dev)
+{
+	struct udevice *sys_child, *sf_child;
+	struct softreset_reg *sf_priv;
+	struct sysreset_reg *priv;
+	int ret;
+
+	/* The reset driver does not have a device node, so bind it here */
+	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
+				 &sys_child);
+	if (ret) {
+		debug("Warning: No sysreset driver: ret=%d\n", ret);
+	} else {
+		priv = malloc(sizeof(struct sysreset_reg));
+		priv->glb_srst_fst_value = offsetof(struct rk3562_cru,
+						    glb_srst_fst);
+		priv->glb_srst_snd_value = offsetof(struct rk3562_cru,
+						    glb_srst_snd);
+		sys_child->priv = priv;
+	}
+
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3562_cru,
+						    softrst_con[0]);
+		/* (0x30444 - 0x400) / 4 + 1 = 49170 */
+		sf_priv->sf_reset_num = 49170;
+		sf_child->priv = sf_priv;
+	}
+
+	return 0;
+}
+
+static const struct udevice_id rk3562_clk_ids[] = {
+	{ .compatible = "rockchip,rk3562-cru" },
+	{ }
+};
+
+U_BOOT_DRIVER(rockchip_rk3562_cru) = {
+	.name		= "rockchip_rk3562_cru",
+	.id		= UCLASS_CLK,
+	.of_match	= rk3562_clk_ids,
+	.priv_auto_alloc_size = sizeof(struct rk3562_clk_priv),
+	.ofdata_to_platdata = rk3562_clk_ofdata_to_platdata,
+	.ops		= &rk3562_clk_ops,
+	.bind		= rk3562_clk_bind,
+	.probe		= rk3562_clk_probe,
+};
+
+/* spl scmi clk */
+#ifdef CONFIG_SPL_BUILD
+
+static ulong rk3562_crypto_get_rate(struct rk3562_clk_priv *priv, ulong clk_id)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 sel, con;
+	ulong rate;
+
+	con = readl(&cru->periclksel_con[43]);
+	switch (clk_id) {
+	case CLK_CORE_CRYPTO:
+		sel = (con & CLK_CORE_CRYPTO_SEL_MASK) >>
+		       CLK_CORE_CRYPTO_SEL_SHIFT;
+		if (sel == CLK_CORE_CRYPTO_SEL_200M)
+			rate = 200 * MHz;
+		else if (sel == CLK_CORE_CRYPTO_SEL_100M)
+			rate = 100 * MHz;
+		else
+			rate = OSC_HZ;
+		break;
+	case CLK_PKA_CRYPTO:
+		sel = (con & CLK_PKA_CRYPTO_SEL_MASK) >>
+		       CLK_PKA_CRYPTO_SEL_SHIFT;
+		if (sel == CLK_PKA_CRYPTO_SEL_300M)
+			rate = 300 * MHz;
+		else if (sel == CLK_PKA_CRYPTO_SEL_200M)
+			rate = 200 * MHz;
+		else if (sel == CLK_PKA_CRYPTO_SEL_100M)
+			rate = 100 * MHz;
+		else
+			rate = OSC_HZ;
+		break;
+	default:
+		return -ENOENT;
+	}
+
+	return rate;
+}
+
+static ulong rk3562_crypto_set_rate(struct rk3562_clk_priv *priv, ulong clk_id,
+				    ulong rate)
+{
+	struct rk3562_cru *cru = priv->cru;
+	u32 mask, shift, sel;
+
+	switch (clk_id) {
+	case CLK_CORE_CRYPTO:
+		mask = CLK_CORE_CRYPTO_SEL_MASK;
+		shift =	CLK_CORE_CRYPTO_SEL_SHIFT;
+		if (rate == 200 * MHz)
+			sel = CLK_CORE_CRYPTO_SEL_200M;
+		else if (rate == 100 * MHz)
+			sel = CLK_CORE_CRYPTO_SEL_100M;
+		else
+			sel = CLK_CORE_CRYPTO_SEL_24M;
+		break;
+	case CLK_PKA_CRYPTO:
+		mask = CLK_PKA_CRYPTO_SEL_MASK;
+		shift =	CLK_PKA_CRYPTO_SEL_SHIFT;
+		if (rate == 300 * MHz)
+			sel = CLK_PKA_CRYPTO_SEL_300M;
+		else if (rate == 200 * MHz)
+			sel = CLK_PKA_CRYPTO_SEL_200M;
+		else if (rate == 100 * MHz)
+			sel = CLK_PKA_CRYPTO_SEL_100M;
+		else
+			sel = CLK_PKA_CRYPTO_SEL_24M;
+		break;
+	default:
+		return -ENOENT;
+	}
+	rk_clrsetreg(&cru->periclksel_con[43], mask, sel << shift);
+
+	return rk3562_crypto_get_rate(priv, clk_id);
+}
+
+static ulong rk3562_clk_scmi_get_rate(struct clk *clk)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(clk->dev);
+
+	switch (clk->id) {
+	case CLK_CORE_CRYPTO:
+	case CLK_PKA_CRYPTO:
+		return rk3562_crypto_get_rate(priv, clk->id);
+	default:
+		return -ENOENT;
+	}
+};
+
+static ulong rk3562_clk_scmi_set_rate(struct clk *clk, ulong rate)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(clk->dev);
+
+	switch (clk->id) {
+	case CLK_CORE_CRYPTO:
+	case CLK_PKA_CRYPTO:
+		return rk3562_crypto_set_rate(priv, clk->id, rate);
+	default:
+		return -ENOENT;
+	}
+	return 0;
+};
+
+static int rk3562_scmi_clk_ofdata_to_platdata(struct udevice *dev)
+{
+	struct rk3562_clk_priv *priv = dev_get_priv(dev);
+
+	priv->cru = (struct rk3562_cru *)0xff100000;
+
+	return 0;
+}
+
+/* A fake scmi driver for SPL/TPL where smccc agent is not available. */
+static const struct clk_ops scmi_clk_ops = {
+	.get_rate = rk3562_clk_scmi_get_rate,
+	.set_rate = rk3562_clk_scmi_set_rate,
+};
+
+U_BOOT_DRIVER(scmi_clock) = {
+	.name = "scmi_clk",
+	.id = UCLASS_CLK,
+	.ops = &scmi_clk_ops,
+	.priv_auto_alloc_size = sizeof(struct rk3562_clk_priv),
+	.ofdata_to_platdata = rk3562_scmi_clk_ofdata_to_platdata,
+};
+#endif
diff --git a/u-boot/drivers/clk/rockchip/clk_rk3568.c b/u-boot/drivers/clk/rockchip/clk_rk3568.c
index 18b8e9d..f6a60d5 100644
--- a/u-boot/drivers/clk/rockchip/clk_rk3568.c
+++ b/u-boot/drivers/clk/rockchip/clk_rk3568.c
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd
- * Author: Elaine Zhang <zhangqing@rock-chips.com>
+ * Author: Joseph Chen <chenjh@rock-chips.com>
  */
 
 #include <common.h>
@@ -1160,7 +1160,7 @@
 
 	switch (clk_id) {
 	case CLK_PWM1:
-		sel = (con & CLK_PWM1_SEL_MASK) >> CLK_PWM3_SEL_SHIFT;
+		sel = (con & CLK_PWM1_SEL_MASK) >> CLK_PWM1_SEL_SHIFT;
 		break;
 	case CLK_PWM2:
 		sel = (con & CLK_PWM2_SEL_MASK) >> CLK_PWM2_SEL_SHIFT;
@@ -1850,7 +1850,7 @@
 		rockchip_pll_set_rate(&rk3568_pll_clks[VPLL],
 				      priv->cru, VPLL, div * rate);
 	} else {
-		for (i = 0; i <= DCLK_VOP_SEL_CPLL; i++) {
+		for (i = sel; i <= DCLK_VOP_SEL_CPLL; i++) {
 			switch (i) {
 			case DCLK_VOP_SEL_GPLL:
 				pll_rate = priv->gpll_hz;
@@ -3107,9 +3107,15 @@
 	if (parent->id == PLL_VPLL) {
 		rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK,
 			     DCLK_VOP_SEL_VPLL << DCLK0_VOP_SEL_SHIFT);
-	} else {
+	} else if (parent->id == PLL_HPLL) {
 		rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK,
 			     DCLK_VOP_SEL_HPLL << DCLK0_VOP_SEL_SHIFT);
+	} else if (parent->id == PLL_CPLL) {
+		rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK,
+			     DCLK_VOP_SEL_CPLL << DCLK0_VOP_SEL_SHIFT);
+	} else {
+		rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK,
+			     DCLK_VOP_SEL_GPLL << DCLK0_VOP_SEL_SHIFT);
 	}
 
 	return 0;
diff --git a/u-boot/drivers/clk/rockchip/clk_rk3588.c b/u-boot/drivers/clk/rockchip/clk_rk3588.c
index 598d744..715ea04 100644
--- a/u-boot/drivers/clk/rockchip/clk_rk3588.c
+++ b/u-boot/drivers/clk/rockchip/clk_rk3588.c
@@ -332,12 +332,18 @@
 
 	switch (clk_id) {
 	case ACLK_TOP_ROOT:
-		src_clk_div = DIV_ROUND_UP(priv->gpll_hz, rate);
+		if (!(priv->cpll_hz % rate)) {
+			src_clk = ACLK_TOP_ROOT_SRC_SEL_CPLL;
+			src_clk_div = DIV_ROUND_UP(priv->cpll_hz, rate);
+		} else {
+			src_clk = ACLK_TOP_ROOT_SRC_SEL_GPLL;
+			src_clk_div = DIV_ROUND_UP(priv->gpll_hz, rate);
+		}
 		assert(src_clk_div - 1 <= 31);
 		rk_clrsetreg(&cru->clksel_con[8],
 			     ACLK_TOP_ROOT_DIV_MASK |
 			     ACLK_TOP_ROOT_SRC_SEL_MASK,
-			     (ACLK_TOP_ROOT_SRC_SEL_GPLL <<
+			     (src_clk <<
 			      ACLK_TOP_ROOT_SRC_SEL_SHIFT) |
 			     (src_clk_div - 1) << ACLK_TOP_ROOT_DIV_SHIFT);
 		break;
@@ -1148,13 +1154,23 @@
 	}
 
 	if (sel == DCLK_VOP_SRC_SEL_V0PLL) {
-		div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate);
-		rk_clrsetreg(&cru->clksel_con[conid],
-			     mask,
-			     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
-			     ((div - 1) << div_shift));
-		rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL],
-				      priv->cru, V0PLL, div * rate);
+		pll_rate = rockchip_pll_get_rate(&rk3588_pll_clks[V0PLL],
+						 priv->cru, V0PLL);
+		if (pll_rate >= RK3588_VOP_PLL_LIMIT_FREQ && pll_rate % rate == 0) {
+			div = DIV_ROUND_UP(pll_rate, rate);
+			rk_clrsetreg(&cru->clksel_con[conid],
+				     mask,
+				     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
+				     ((div - 1) << div_shift));
+		} else {
+			div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate);
+			rk_clrsetreg(&cru->clksel_con[conid],
+				     mask,
+				     DCLK_VOP_SRC_SEL_V0PLL << sel_shift |
+				     ((div - 1) << div_shift));
+			rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL],
+					      priv->cru, V0PLL, div * rate);
+		}
 	} else {
 		for (i = 0; i <= DCLK_VOP_SRC_SEL_AUPLL; i++) {
 			switch (i) {
diff --git a/u-boot/drivers/core/device.c b/u-boot/drivers/core/device.c
index e0e9ca1..a8803ee 100644
--- a/u-boot/drivers/core/device.c
+++ b/u-boot/drivers/core/device.c
@@ -97,8 +97,6 @@
 					debug("%s do not delete uboot dev: %s\n",
 					      __func__, dev->name);
 					return 0;
-				} else if (drv->id == UCLASS_REGULATOR) {
-					/* stay in dm tree, in order to handle exclusion */
 				} else {
 					list_del_init(&dev->uclass_node);
 				}
diff --git a/u-boot/drivers/core/fdtaddr.c b/u-boot/drivers/core/fdtaddr.c
index 3847dd8..2b25c8d 100644
--- a/u-boot/drivers/core/fdtaddr.c
+++ b/u-boot/drivers/core/fdtaddr.c
@@ -127,6 +127,16 @@
 	return devfdt_get_addr_index(dev, 0);
 }
 
+void *devfdt_remap_addr_index(struct udevice *dev, int index)
+{
+       fdt_addr_t addr = devfdt_get_addr_index(dev, index);
+
+        if (addr == FDT_ADDR_T_NONE)
+                return NULL;
+
+        return map_physmem(addr, 0, MAP_NOCACHE);
+}
+
 void *devfdt_get_addr_ptr(struct udevice *dev)
 {
 	return (void *)(uintptr_t)devfdt_get_addr_index(dev, 0);
diff --git a/u-boot/drivers/core/read.c b/u-boot/drivers/core/read.c
index a7f77e9..a7ce6a4 100644
--- a/u-boot/drivers/core/read.c
+++ b/u-boot/drivers/core/read.c
@@ -8,6 +8,7 @@
 #include <common.h>
 #include <dm.h>
 #include <mapmem.h>
+#include <asm/io.h>
 #include <dm/of_access.h>
 
 int dev_read_u32_default(struct udevice *dev, const char *propname, int def)
@@ -63,6 +64,16 @@
 	return dev_read_addr_index(dev, 0);
 }
 
+void *dev_remap_addr_index(struct udevice *dev, int index)
+{
+        fdt_addr_t addr = dev_read_addr_index(dev, index);
+
+        if (addr == FDT_ADDR_T_NONE)
+                return NULL;
+
+        return map_physmem(addr, 0, MAP_NOCACHE);
+}
+
 void *dev_read_addr_ptr(struct udevice *dev)
 {
 	fdt_addr_t addr = dev_read_addr(dev);
diff --git a/u-boot/drivers/core/root.c b/u-boot/drivers/core/root.c
index c928256..0eb2fa9 100644
--- a/u-boot/drivers/core/root.c
+++ b/u-boot/drivers/core/root.c
@@ -224,12 +224,8 @@
 
 	for (np = node_parent->child; np; np = np->sibling) {
 		if (pre_reloc_only &&
-#ifdef CONFIG_USING_KERNEL_DTB
-		    (!of_find_property(np, "u-boot,dm-pre-reloc", NULL) &&
-		     !of_find_property(np, "u-boot,dm-spl", NULL)))
-#else
-		     !of_find_property(np, "u-boot,dm-pre-reloc", NULL))
-#endif
+		   (!of_find_property(np, "u-boot,dm-pre-reloc", NULL) &&
+		    !of_find_property(np, "u-boot,dm-spl", NULL)))
 			continue;
 		if (!of_device_is_available(np)) {
 			pr_debug("   - ignoring disabled device\n");
@@ -272,7 +268,6 @@
 			    int offset, bool pre_reloc_only)
 {
 	int ret = 0, err;
-	const char *name;
 
 	for (offset = fdt_first_subnode(blob, offset);
 	     offset > 0;
@@ -291,11 +286,15 @@
 			      ret);
 		}
 
+#if CONFIG_IS_ENABLED(SCMI_FIRMWARE)
+		const char *name;
+
 		/* There is no compatible in "/firmware", bind it by default. */
 		name = fdt_get_name(blob, offset, NULL);
 		if (name && !strcmp(name, "firmware"))
 			ret = device_bind_driver_to_node(parent, "firmware",
 					name, offset_to_ofnode(offset), NULL);
+#endif
 	}
 
 	if (ret)
diff --git a/u-boot/drivers/cpu/amp.its b/u-boot/drivers/cpu/amp.its
index 26ed969..e1d3ed0 100644
--- a/u-boot/drivers/cpu/amp.its
+++ b/u-boot/drivers/cpu/amp.its
@@ -1,20 +1,22 @@
 /*
  * Copyright (C) 2021 Fuzhou Rockchip Electronics Co., Ltd
+ *
  * SPDX-License-Identifier: GPL-2.0
  */
 
 /dts-v1/;
 / {
-	description = "FIT source file for rockchip AMP";
+	description = "Rockchip AMP FIT Image";
 	#address-cells = <1>;
 
 	images {
+		/* ARM cortex-A core */
 		amp1 {
 			description  = "bare-mental-core1";
 			data         = /incbin/("./amp1.bin");
-			type         = "firmware";
+			type         = "firmware";	// must be "firmware"
 			compression  = "none";
-			arch         = "arm";		// "arm64" or "arm"
+			arch         = "arm";		// "arm64" or "arm", the same as U-Boot state
 			cpu          = <0x100>;		// mpidr
 			thumb        = <0>;		// 0: arm or thumb2; 1: thumb
 			hyp          = <0>;		// 0: el1/svc; 1: el2/hyp
@@ -56,6 +58,20 @@
 				algo = "sha256";
 			};
 		};
+
+		/* Other core */
+		amp4 {
+			description  = "standalone-mcu1";
+			data         = /incbin/("./mcu1.bin");
+			type         = "standalone";	// must be "standalone"
+			compression  = "none";
+			arch         = "arm";		// "arm64" or "arm", the same as U-Boot state
+			load         = <0x06800000>;
+			udelay       = <1000000>;
+			hash {
+				algo = "sha256";
+			};
+		};
 	};
 
 	configurations {
@@ -63,7 +79,7 @@
 		conf {
 			description = "Rockchip AMP images";
 			rollback-index = <0x0>;
-			loadables = "amp1", "amp2", "amp3";
+			loadables = "amp1", "amp2", "amp3", "amp4";
 
 			signature {
 				algo = "sha256,rsa2048";
diff --git a/u-boot/drivers/cpu/rockchip_amp.c b/u-boot/drivers/cpu/rockchip_amp.c
index 6cf9c35..f17ddf5 100644
--- a/u-boot/drivers/cpu/rockchip_amp.c
+++ b/u-boot/drivers/cpu/rockchip_amp.c
@@ -134,7 +134,7 @@
 	flush_dcache_all();
 
 	/* fixup: ramdisk/fdt/entry depend on U-Boot */
-	*entry = env_get_ulong("kernel_addr_r", 16, 0);
+	*entry = (u32)images.ep;
 
 	return 0;
 }
@@ -206,6 +206,31 @@
 	return 0;
 }
 
+__weak int fit_standalone_release(char *id, uintptr_t entry_point)
+{
+	return 0;
+}
+
+static int standalone_handler(const char *id, u32 entry_point, int data_size)
+{
+	int ret;
+
+	if (!sysmem_alloc_base_by_name(id,
+			(phys_addr_t)entry_point, data_size))
+		return -ENXIO;
+
+	printf("Handle standalone: '%s' at 0x%08x ...", id, entry_point);
+
+	ret = fit_standalone_release((char *)id, entry_point);
+	if (ret) {
+		printf("failed, ret=%d\n", ret);
+		return ret;
+	}
+	printf("OK\n");
+
+	return 0;
+}
+
 static int brought_up_amp(void *fit, int noffset,
 			  boot_cpu_t *bootcpu, int is_linux)
 {
@@ -217,27 +242,38 @@
 	int boot_on;
 	int data_size;
 	int i, ret;
-	u8  arch = -ENODATA;
+	u8 type = -ENODATA;
+	u8 arch = -ENODATA;
 
 	desc = fdt_getprop(fit, noffset, "description", NULL);
 	cpu = fit_get_u32_default(fit, noffset, "cpu", -ENODATA);
 	hyp = fit_get_u32_default(fit, noffset, "hyp", 0);
 	thumb = fit_get_u32_default(fit, noffset, "thumb", 0);
-	load = fit_get_u32_default(fit, noffset, "load", -ENODATA);
+	entry = load = fit_get_u32_default(fit, noffset, "load", -ENODATA);
 	us = fit_get_u32_default(fit, noffset, "udelay", 0);
 	boot_on = fit_get_u32_default(fit, noffset, "boot-on", 1);
 	fit_image_get_arch(fit, noffset, &arch);
+	fit_image_get_type(fit, noffset, &type);
 	fit_image_get_data_size(fit, noffset, &data_size);
 	memset(&args, 0, sizeof(args));
 
-	if (!desc || cpu == -ENODATA || arch == -ENODATA ||
+	/* standalone is simple, just handle it and then exit. Allow failure */
+	if (type == IH_TYPE_STANDALONE) {
+		if (!desc || load == -ENODATA) {
+			AMP_E("standalone: \"desc\" or \"load\" property missing!\n");
+			goto exit;
+		}
+		standalone_handler(desc, load, data_size);
+		goto exit;
+	}
+
+	if (!desc || cpu == -ENODATA || arch == -ENODATA || type == -ENODATA ||
 	    (load == -ENODATA && !is_linux)) {
 		AMP_E("Property missing!\n");
 		return -EINVAL;
 	}
 	aarch64 = (arch == IH_ARCH_ARM) ? 0 : 1;
 	pe_state = PE_STATE(aarch64, hyp, thumb, 0);
-	entry = load;
 
 #ifdef DEBUG
 	AMP_I("       desc: %s\n", desc);
@@ -245,7 +281,7 @@
 	AMP_I("    aarch64: %d\n", aarch64);
 	AMP_I("        hyp: %d\n", hyp);
 	AMP_I("      thumb: %d\n", thumb);
-	AMP_I("      entry: 0x%08x\n", entry);
+	AMP_I("       load: 0x%08x\n", load);
 	AMP_I("   pe_state: 0x%08x\n", pe_state);
 	AMP_I("   linux-os: %d\n\n", is_linux);
 #endif
@@ -294,7 +330,7 @@
 	ret = smc_cpu_on(cpu, pe_state, entry, &args, is_linux);
 	if (ret)
 		return ret;
-
+exit:
 	if (us)
 		udelay(us);
 
@@ -336,7 +372,7 @@
 
 	/* === only boot cpu can reach here === */
 
-	if (!g_bootcpu.linux_os) {
+	if (!g_bootcpu.linux_os && g_bootcpu.entry) {
 		flush_dcache_all();
 		AMP_I("Brought up cpu[%x, self] with state 0x%x, entry 0x%08x ...",
 		      (u32)read_mpidr() & 0x0fff, g_bootcpu.state, g_bootcpu.entry);
diff --git a/u-boot/drivers/crypto/rockchip/crypto_v2.c b/u-boot/drivers/crypto/rockchip/crypto_v2.c
index 86226fe..e2135a7 100644
--- a/u-boot/drivers/crypto/rockchip/crypto_v2.c
+++ b/u-boot/drivers/crypto/rockchip/crypto_v2.c
@@ -8,6 +8,7 @@
 #include <crypto.h>
 #include <dm.h>
 #include <asm/io.h>
+#include <clk-uclass.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/clock.h>
 #include <rockchip/crypto_hash_cache.h>
@@ -54,6 +55,7 @@
 	char				*clocks;
 	u32				*frequencies;
 	u32				nclocks;
+	u32				freq_nclocks;
 	u32				length;
 	struct rk_hash_ctx		*hw_ctx;
 	struct rk_crypto_soc_data	*soc_data;
@@ -217,6 +219,43 @@
 
 	for (i = 0; i < tag_len / 4; i++, chn_base += 4)
 		word2byte_be(crypto_read(chn_base), tag + 4 * i);
+}
+
+static int rk_crypto_do_enable_clk(struct udevice *dev, int enable)
+{
+	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
+	struct clk clk;
+	int i, ret;
+
+	for (i = 0; i < priv->nclocks; i++) {
+		ret = clk_get_by_index(dev, i, &clk);
+		if (ret < 0) {
+			printf("Failed to get clk index %d, ret=%d\n", i, ret);
+			return ret;
+		}
+
+		if (enable)
+			ret = clk_enable(&clk);
+		else
+			ret = clk_disable(&clk);
+		if (ret < 0 && ret != -ENOSYS) {
+			printf("Failed to enable(%d) clk(%ld): ret=%d\n",
+			       enable, clk.id, ret);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
+static int rk_crypto_enable_clk(struct udevice *dev)
+{
+	return rk_crypto_do_enable_clk(dev, 1);
+}
+
+static int rk_crypto_disable_clk(struct udevice *dev)
+{
+	return rk_crypto_do_enable_clk(dev, 0);
 }
 
 static u32 crypto_v3_dynamic_cap(void)
@@ -397,7 +436,7 @@
 
 	if (!(*started_flag)) {
 		lli->user_define |=
-			(LLI_USER_STRING_START | LLI_USER_CPIHER_START);
+			(LLI_USER_STRING_START | LLI_USER_CIPHER_START);
 		crypto_write((u32)virt_to_phys(lli), CRYPTO_DMA_LLI_ADDR);
 		crypto_write((CRYPTO_HASH_ENABLE << CRYPTO_WRITE_MASK_SHIFT) |
 			     CRYPTO_HASH_ENABLE, CRYPTO_HASH_CTL);
@@ -520,6 +559,7 @@
 {
 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
 	struct rk_hash_ctx *hash_ctx = priv->hw_ctx;
+	int ret = 0;
 
 	if (!ctx)
 		return -EINVAL;
@@ -535,7 +575,12 @@
 	if (!hash_ctx->hash_cache)
 		return -EFAULT;
 
-	return rk_hash_init(hash_ctx, ctx->algo);
+	rk_crypto_enable_clk(dev);
+	ret = rk_hash_init(hash_ctx, ctx->algo);
+	if (ret)
+		rk_crypto_disable_clk(dev);
+
+	return ret;
 }
 
 static int rockchip_crypto_sha_update(struct udevice *dev,
@@ -545,8 +590,10 @@
 	int ret, i;
 	u8 *p;
 
-	if (!len)
-		return -EINVAL;
+	if (!len) {
+		ret = -EINVAL;
+		goto exit;
+	}
 
 	p = (u8 *)input;
 
@@ -560,6 +607,9 @@
 		ret = rk_hash_update(priv->hw_ctx, p, len % HASH_UPDATE_LIMIT);
 
 exit:
+	if (ret)
+		rk_crypto_disable_clk(dev);
+
 	return ret;
 }
 
@@ -583,6 +633,8 @@
 
 exit:
 	hw_hash_clean_ctx(priv->hw_ctx);
+	rk_crypto_disable_clk(dev);
+
 	return ret;
 }
 
@@ -614,6 +666,7 @@
 {
 	struct rockchip_crypto_priv *priv = dev_get_priv(dev);
 	struct rk_hash_ctx *hash_ctx = priv->hw_ctx;
+	int ret = 0;
 
 	if (!ctx)
 		return -EINVAL;
@@ -629,7 +682,12 @@
 	if (!hash_ctx->hash_cache)
 		return -EFAULT;
 
-	return rk_hmac_init(priv->hw_ctx, ctx->algo, key, key_len);
+	rk_crypto_enable_clk(dev);
+	ret = rk_hmac_init(priv->hw_ctx, ctx->algo, key, key_len);
+	if (ret)
+		rk_crypto_disable_clk(dev);
+
+	return ret;
 }
 
 static int rockchip_crypto_hmac_update(struct udevice *dev,
@@ -763,6 +821,11 @@
 {
 	u32 i;
 
+	if (aad_len == 0) {
+		*padding_size = 0;
+		return;
+	}
+
 	i = aad_len < (0x10000 - 0x100) ? 2 : 6;
 
 	if (i == 2) {
@@ -779,7 +842,7 @@
 	*padding_size = i;
 }
 
-static int ccm_compose_aad_iv(u8 *aad_iv, u32 data_len, u32 tag_size)
+static int ccm_compose_aad_iv(u8 *aad_iv, u32 data_len, u32 aad_len, u32 tag_size)
 {
 	aad_iv[0] |= ((u8)(((tag_size - 2) / 2) & 7) << 3);
 
@@ -788,7 +851,8 @@
 	aad_iv[14] = (u8)(data_len >> 8);
 	aad_iv[15] = (u8)data_len;
 
-	aad_iv[0] |= 0x40;	//set aad flag
+	if (aad_len)
+		aad_iv[0] |= 0x40;	//set aad flag
 
 	return 0;
 }
@@ -925,12 +989,14 @@
 		data_desc->dma_ctrl |= LLI_DMA_CTRL_DST_DONE;
 	}
 
+	data_desc->user_define = LLI_USER_CIPHER_START |
+				 LLI_USER_STRING_START |
+				 LLI_USER_STRING_LAST |
+				 (key_chn << 4);
+	crypto_write((u32)virt_to_phys(data_desc), CRYPTO_DMA_LLI_ADDR);
+
 	if (rk_mode == RK_MODE_CCM || rk_mode == RK_MODE_GCM) {
 		u32 aad_tmp_len = 0;
-
-		data_desc->user_define = LLI_USER_STRING_START |
-					 LLI_USER_STRING_LAST |
-					 (key_chn << 4);
 
 		aad_desc = align_malloc(sizeof(*aad_desc), LLI_ADDR_ALIGN_SIZE);
 		if (!aad_desc)
@@ -938,7 +1004,7 @@
 
 		memset(aad_desc, 0x00, sizeof(*aad_desc));
 		aad_desc->next_addr = (u32)virt_to_phys(data_desc);
-		aad_desc->user_define = LLI_USER_CPIHER_START |
+		aad_desc->user_define = LLI_USER_CIPHER_START |
 					 LLI_USER_STRING_START |
 					 LLI_USER_STRING_LAST |
 					 LLI_USER_STRING_AAD |
@@ -958,12 +1024,15 @@
 			if (!aad_tmp)
 				goto exit;
 
-			/* read iv data from reg */
-			get_iv_reg(key_chn, aad_tmp, AES_BLOCK_SIZE);
-			ccm_compose_aad_iv(aad_tmp, tmp_len, tag_len);
-			memcpy(aad_tmp + AES_BLOCK_SIZE, padding, padding_size);
+			/* clear last block */
 			memset(aad_tmp + aad_tmp_len - AES_BLOCK_SIZE,
 			       0x00, AES_BLOCK_SIZE);
+
+			/* read iv data from reg */
+			get_iv_reg(key_chn, aad_tmp, AES_BLOCK_SIZE);
+			ccm_compose_aad_iv(aad_tmp, tmp_len, aad_len, tag_len);
+			memcpy(aad_tmp + AES_BLOCK_SIZE, padding, padding_size);
+
 			memcpy(aad_tmp + AES_BLOCK_SIZE + padding_size,
 			       aad, aad_len);
 		} else {
@@ -985,15 +1054,15 @@
 
 		aad_desc->src_addr = (u32)virt_to_phys(aad_tmp);
 		aad_desc->src_len  = aad_tmp_len;
-		crypto_write((u32)virt_to_phys(aad_desc), CRYPTO_DMA_LLI_ADDR);
-		cache_op_inner(DCACHE_AREA_CLEAN, aad_tmp, aad_tmp_len);
-		cache_op_inner(DCACHE_AREA_CLEAN, aad_desc, sizeof(*aad_desc));
-	} else {
-		data_desc->user_define = LLI_USER_CPIHER_START |
-					 LLI_USER_STRING_START |
-					 LLI_USER_STRING_LAST |
-					 (key_chn << 4);
-		crypto_write((u32)virt_to_phys(data_desc), CRYPTO_DMA_LLI_ADDR);
+
+		if (aad_tmp_len) {
+			data_desc->user_define = LLI_USER_STRING_START |
+						 LLI_USER_STRING_LAST |
+						 (key_chn << 4);
+			crypto_write((u32)virt_to_phys(aad_desc), CRYPTO_DMA_LLI_ADDR);
+			cache_op_inner(DCACHE_AREA_CLEAN, aad_tmp, aad_tmp_len);
+			cache_op_inner(DCACHE_AREA_CLEAN, aad_desc, sizeof(*aad_desc));
+		}
 	}
 
 	cache_op_inner(DCACHE_AREA_CLEAN, data_desc, sizeof(*data_desc));
@@ -1175,21 +1244,29 @@
 int rockchip_crypto_cipher(struct udevice *dev, cipher_context *ctx,
 			   const u8 *in, u8 *out, u32 len, bool enc)
 {
+	int ret;
+
+	rk_crypto_enable_clk(dev);
+
 	switch (ctx->algo) {
 	case CRYPTO_DES:
-		return rk_crypto_des(dev, ctx->mode, ctx->key, ctx->key_len,
-				     ctx->iv, in, out, len, enc);
+		ret = rk_crypto_des(dev, ctx->mode, ctx->key, ctx->key_len,
+				    ctx->iv, in, out, len, enc);
 	case CRYPTO_AES:
-		return rk_crypto_aes(dev, ctx->mode,
-				     ctx->key, ctx->twk_key, ctx->key_len,
-				     ctx->iv, ctx->iv_len, in, out, len, enc);
+		ret = rk_crypto_aes(dev, ctx->mode,
+				    ctx->key, ctx->twk_key, ctx->key_len,
+				    ctx->iv, ctx->iv_len, in, out, len, enc);
 	case CRYPTO_SM4:
-		return rk_crypto_sm4(dev, ctx->mode,
-				     ctx->key, ctx->twk_key, ctx->key_len,
-				     ctx->iv, ctx->iv_len, in, out, len, enc);
+		ret = rk_crypto_sm4(dev, ctx->mode,
+				    ctx->key, ctx->twk_key, ctx->key_len,
+				    ctx->iv, ctx->iv_len, in, out, len, enc);
 	default:
-		return -EINVAL;
+		ret = -EINVAL;
 	}
+
+	rk_crypto_disable_clk(dev);
+
+	return ret;
 }
 
 int rk_crypto_mac(struct udevice *dev, u32 algo, u32 mode,
@@ -1223,8 +1300,16 @@
 int rockchip_crypto_mac(struct udevice *dev, cipher_context *ctx,
 			const u8 *in, u32 len, u8 *tag)
 {
-	return rk_crypto_mac(dev, ctx->algo, ctx->mode,
-			     ctx->key, ctx->key_len, in, len, tag);
+	int ret = 0;
+
+	rk_crypto_enable_clk(dev);
+
+	ret = rk_crypto_mac(dev, ctx->algo, ctx->mode,
+			    ctx->key, ctx->key_len, in, len, tag);
+
+	rk_crypto_disable_clk(dev);
+
+	return ret;
 }
 
 int rk_crypto_ae(struct udevice *dev, u32 algo, u32 mode,
@@ -1236,6 +1321,9 @@
 	int ret;
 
 	if (!IS_AE_MODE(rk_mode))
+		return -EINVAL;
+
+	if (len == 0)
 		return -EINVAL;
 
 	if (algo != CRYPTO_AES && algo != CRYPTO_SM4)
@@ -1261,9 +1349,17 @@
 		       u8 *out, u8 *tag)
 
 {
-	return rk_crypto_ae(dev, ctx->algo, ctx->mode, ctx->key, ctx->key_len,
-			    ctx->iv, ctx->iv_len, in, len,
-			    aad, aad_len, out, tag);
+	int ret = 0;
+
+	rk_crypto_enable_clk(dev);
+
+	ret = rk_crypto_ae(dev, ctx->algo, ctx->mode, ctx->key, ctx->key_len,
+			   ctx->iv, ctx->iv_len, in, len,
+			   aad, aad_len, out, tag);
+
+	rk_crypto_disable_clk(dev);
+
+	return ret;
 }
 
 #endif
@@ -1312,9 +1408,11 @@
 	if (ret)
 		goto exit;
 
+	rk_crypto_enable_clk(dev);
 	ret = rk_exptmod_np(mpa_m, mpa_e, mpa_n, mpa_c, mpa_result);
 	if (!ret)
 		memcpy(output, mpa_result->d, BITS2BYTE(n_bits));
+	rk_crypto_disable_clk(dev);
 
 exit:
 	rk_mpa_free(&mpa_m);
@@ -1378,7 +1476,7 @@
 	if (!priv->clocks)
 		return -ENOMEM;
 
-	priv->nclocks = len / sizeof(u32);
+	priv->nclocks = len / (2 * sizeof(u32));
 	if (dev_read_u32_array(dev, "clocks", (u32 *)priv->clocks,
 			       priv->nclocks)) {
 		printf("Can't read \"clocks\" property\n");
@@ -1386,24 +1484,19 @@
 		goto exit;
 	}
 
-	if (!dev_read_prop(dev, "clock-frequency", &len)) {
-		printf("Can't find \"clock-frequency\" property\n");
-		ret = -EINVAL;
-		goto exit;
-	}
-
-	priv->frequencies = malloc(len);
-	if (!priv->frequencies) {
-		ret = -ENOMEM;
-		goto exit;
-	}
-
-	priv->nclocks = len / sizeof(u32);
-	if (dev_read_u32_array(dev, "clock-frequency", priv->frequencies,
-			       priv->nclocks)) {
-		printf("Can't read \"clock-frequency\" property\n");
-		ret = -EINVAL;
-		goto exit;
+	if (dev_read_prop(dev, "clock-frequency", &len)) {
+		priv->frequencies = malloc(len);
+		if (!priv->frequencies) {
+			ret = -ENOMEM;
+			goto exit;
+		}
+		priv->freq_nclocks = len / sizeof(u32);
+		if (dev_read_u32_array(dev, "clock-frequency", priv->frequencies,
+				       priv->freq_nclocks)) {
+			printf("Can't read \"clock-frequency\" property\n");
+			ret = -EINVAL;
+			goto exit;
+		}
 	}
 
 	return 0;
@@ -1423,10 +1516,15 @@
 	struct clk clk;
 	int i, ret;
 
-	if (!priv->clocks && priv->nclocks == 0)
+	/* use standard "assigned-clock-rates" props */
+	if (dev_read_size(dev, "assigned-clock-rates") > 0)
+		return clk_set_defaults(dev);
+
+	/* use "clock-frequency" props */
+	if (priv->freq_nclocks == 0)
 		return 0;
 
-	for (i = 0; i < priv->nclocks; i++) {
+	for (i = 0; i < priv->freq_nclocks; i++) {
 		ret = clk_get_by_index(dev, i, &clk);
 		if (ret < 0) {
 			printf("Failed to get clk index %d, ret=%d\n", i, ret);
@@ -1465,7 +1563,11 @@
 	if (ret)
 		return ret;
 
+	rk_crypto_enable_clk(dev);
+
 	hw_crypto_reset();
+
+	rk_crypto_disable_clk(dev);
 
 	return 0;
 }
@@ -1557,6 +1659,10 @@
 		.compatible = "rockchip,crypto-v3",
 		.data = (ulong)&soc_data_cryptov3
 	},
+	{
+		.compatible = "rockchip,crypto-v4",
+		.data = (ulong)&soc_data_cryptov3 /* reuse crypto v3 config */
+	},
 	{ }
 };
 
diff --git a/u-boot/drivers/gpio/Kconfig b/u-boot/drivers/gpio/Kconfig
index f059ea7..412df72 100644
--- a/u-boot/drivers/gpio/Kconfig
+++ b/u-boot/drivers/gpio/Kconfig
@@ -24,6 +24,15 @@
 	  is a mechanism providing automatic GPIO request and config-
 	  uration as part of the gpio-controller's driver probe function.
 
+config GPIO_NO_UC_FLAG_SEQ_ALIAS
+	bool "Disable GPIO uclass sequence themselves with aliases"
+	depends on USING_KERNEL_DTB
+	default n
+	help
+	  Disable GPIO uclass sequence, this is a workaround when kernel
+	  dtb feature is enabled. Avoid gpio device probe failed when
+	  alloc req_seq both for gpio devices from U-Boot and kernel dtb.
+
 config ALTERA_PIO
 	bool "Altera PIO driver"
 	depends on DM_GPIO
@@ -211,12 +220,6 @@
 	  Support for the GPIO controller contained in NVIDIA Tegra186. This
 	  covers both the "main" and "AON" controller instances, even though
 	  they have slightly different register layout.
-
-config GPIO_MAX96752F
-	bool "Maxim MAX96752F GPIO"
-	depends on DM_GPIO && I2C_MUX_MAX96752F
-	help
-	  Say yes here to support Maxim MAX96752F GPIOs.
 
 config GPIO_UNIPHIER
 	bool "UniPhier GPIO"
diff --git a/u-boot/drivers/gpio/Makefile b/u-boot/drivers/gpio/Makefile
index 451032a..1396467 100644
--- a/u-boot/drivers/gpio/Makefile
+++ b/u-boot/drivers/gpio/Makefile
@@ -8,7 +8,6 @@
 ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_DWAPB_GPIO)	+= dwapb_gpio.o
 obj-$(CONFIG_AXP_GPIO)		+= axp_gpio.o
-obj-$(CONFIG_GPIO_MAX96752F)	+= gpio-max96752f.o
 endif
 obj-$(CONFIG_DM_GPIO)		+= gpio-uclass.o
 
diff --git a/u-boot/drivers/gpio/gpio-max96752f.c b/u-boot/drivers/gpio/gpio-max96752f.c
deleted file mode 100644
index 426b30e..0000000
--- a/u-boot/drivers/gpio/gpio-max96752f.c
+++ /dev/null
@@ -1,90 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2022 Rockchip Electronics Co., Ltd
- */
-
-#include <asm-generic/gpio.h>
-#include <common.h>
-#include <dm.h>
-#include <i2c.h>
-#include <max96752f.h>
-
-static int max96752f_gpio_direction_output(struct udevice *dev, unsigned offset,
-					   int value)
-{
-	int ret;
-
-	ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(offset),
-				GPIO_OUT_DIS | GPIO_OUT,
-				FIELD_PREP(GPIO_OUT_DIS, 0) |
-				FIELD_PREP(GPIO_OUT, value));
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-static int max96752f_gpio_get_value(struct udevice *dev, unsigned offset)
-{
-	int ret;
-
-	ret = dm_i2c_reg_read(dev->parent, GPIO_A_REG(offset));
-	if (ret < 0)
-		return ret;
-
-	return FIELD_GET(GPIO_OUT, ret);
-}
-
-static int max96752f_gpio_set_value(struct udevice *dev, unsigned offset,
-				    int value)
-{
-	int ret;
-
-	ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(offset), GPIO_OUT,
-				FIELD_PREP(GPIO_OUT, value));
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-static int max96752f_gpio_get_function(struct udevice *dev, unsigned offset)
-{
-	int ret;
-
-	ret = dm_i2c_reg_read(dev->parent, GPIO_A_REG(offset));
-	if (ret < 0)
-		return ret;
-
-	return FIELD_GET(GPIO_OUT_DIS, ret) ? GPIOF_INPUT : GPIOF_OUTPUT;
-}
-
-static const struct dm_gpio_ops max96752f_gpio_ops = {
-	.direction_output	= max96752f_gpio_direction_output,
-	.get_value		= max96752f_gpio_get_value,
-	.set_value		= max96752f_gpio_set_value,
-	.get_function		= max96752f_gpio_get_function,
-};
-
-static int max96752f_gpio_probe(struct udevice *dev)
-{
-	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
-
-	uc_priv->gpio_count = 16;
-	uc_priv->bank_name = of_node_full_name(dev_np(dev));
-
-	return 0;
-}
-
-static const struct udevice_id max96752f_gpio_match[] = {
-	{ .compatible = "maxim,max96752f-gpio" },
-	{ }
-};
-
-U_BOOT_DRIVER(max96752f_gpio) = {
-	.name = "max96752f_gpio",
-	.id = UCLASS_GPIO,
-	.of_match = max96752f_gpio_match,
-	.probe = max96752f_gpio_probe,
-	.ops = &max96752f_gpio_ops,
-};
diff --git a/u-boot/drivers/gpio/gpio-uclass.c b/u-boot/drivers/gpio/gpio-uclass.c
index 5868dd4..a8479b0 100644
--- a/u-boot/drivers/gpio/gpio-uclass.c
+++ b/u-boot/drivers/gpio/gpio-uclass.c
@@ -1058,7 +1058,9 @@
 UCLASS_DRIVER(gpio) = {
 	.id		= UCLASS_GPIO,
 	.name		= "gpio",
+#ifndef CONFIG_GPIO_NO_UC_FLAG_SEQ_ALIAS
 	.flags		= DM_UC_FLAG_SEQ_ALIAS,
+#endif
 	.post_probe	= gpio_post_probe,
 	.post_bind	= gpio_post_bind,
 	.pre_remove	= gpio_pre_remove,
diff --git a/u-boot/drivers/gpio/rk_gpio.c b/u-boot/drivers/gpio/rk_gpio.c
index 593701b..d1c7889 100644
--- a/u-boot/drivers/gpio/rk_gpio.c
+++ b/u-boot/drivers/gpio/rk_gpio.c
@@ -130,7 +130,6 @@
 	struct rockchip_pinctrl_priv *pctrl_priv;
 	struct rockchip_pin_bank *bank;
 	char *end = NULL;
-	static int gpio;
 	int id = -1, ret;
 
 	priv->regs = dev_read_addr_ptr(dev);
@@ -152,14 +151,12 @@
 	end = strrchr(dev->name, '@');
 	if (end)
 		id = trailing_strtoln(dev->name, end);
-	else
+	if (id < 0)
 		dev_read_alias_seq(dev, &id);
 
-	if (id < 0)
-		id = gpio++;
-
-	if (id >= pctrl_priv->ctrl->nr_banks) {
-		dev_err(dev, "bank id invalid\n");
+	if (id < 0 || id >= pctrl_priv->ctrl->nr_banks) {
+		dev_err(dev, "nr_banks=%d, bank id=%d invalid\n",
+			pctrl_priv->ctrl->nr_banks, id);
 		return -EINVAL;
 	}
 
diff --git a/u-boot/drivers/i2c/muxes/Kconfig b/u-boot/drivers/i2c/muxes/Kconfig
index d87dee7..a98c33c 100644
--- a/u-boot/drivers/i2c/muxes/Kconfig
+++ b/u-boot/drivers/i2c/muxes/Kconfig
@@ -51,13 +51,6 @@
 	  If you say yes here you get support for the Maxim MAX96745
 	  I2C multiplexer.
 
-config I2C_MUX_MAX96752F
-	tristate "Maxim MAX96752F I2C multiplexer"
-	depends on I2C_MUX
-	help
-	  If you say yes here you get support for the Maxim MAX96752F
-	  I2C multiplexer.
-
 config I2C_MUX_MAX96755F
         tristate "Maxim MAX96755F I2C multiplexer"
 	depends on I2C_MUX
diff --git a/u-boot/drivers/i2c/muxes/Makefile b/u-boot/drivers/i2c/muxes/Makefile
index d41ccb2..959fd9f 100644
--- a/u-boot/drivers/i2c/muxes/Makefile
+++ b/u-boot/drivers/i2c/muxes/Makefile
@@ -8,6 +8,5 @@
 obj-$(CONFIG_I2C_MUX_PCA954x) += pca954x.o
 obj-$(CONFIG_I2C_MUX_GPIO) += i2c-mux-gpio.o
 obj-$(CONFIG_I2C_MUX_MAX96745) += max96745.o
-obj-$(CONFIG_I2C_MUX_MAX96752F) += max96752f.o
 obj-$(CONFIG_I2C_MUX_MAX96755F) += max96755f.o
 
diff --git a/u-boot/drivers/i2c/muxes/max96745.c b/u-boot/drivers/i2c/muxes/max96745.c
index 1a76c3f..5c85cb5 100644
--- a/u-boot/drivers/i2c/muxes/max96745.c
+++ b/u-boot/drivers/i2c/muxes/max96745.c
@@ -13,11 +13,18 @@
 struct max96745_priv {
 	struct udevice *dev;
 	struct gpio_desc enable_gpio;
+	struct gpio_desc pwdnb_gpio;
+	bool idle_disc;
 };
 
 static int max96745_select(struct udevice *mux, struct udevice *bus,
 			   uint channel)
 {
+	struct max96745_priv *priv = dev_get_priv(mux);
+
+	if (!priv->idle_disc)
+		return 0;
+
 	if (channel == 1)
 		dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC,
 				  FIELD_PREP(DIS_REM_CC, 0));
@@ -31,6 +38,11 @@
 static int max96745_deselect(struct udevice *mux, struct udevice *bus,
 			     uint channel)
 {
+	struct max96745_priv *priv = dev_get_priv(mux);
+
+	if (!priv->idle_disc)
+		return 0;
+
 	if (channel == 1)
 		dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC,
 				  FIELD_PREP(DIS_REM_CC, 1));
@@ -55,15 +67,27 @@
 		mdelay(200);
 	}
 
-	ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC,
-				FIELD_PREP(DIS_REM_CC, 1));
+	if (dm_gpio_is_valid(&priv->pwdnb_gpio)) {
+		dm_gpio_set_value(&priv->pwdnb_gpio, 0);
+		mdelay(30);
+	}
+
+	/* Set for I2C Fast-mode speed */
+	ret = dm_i2c_reg_write(priv->dev, 0x0070, 0x16);
 	if (ret < 0)
 		return ret;
 
-	ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC,
-				FIELD_PREP(DIS_REM_CC, 1));
-	if (ret < 0)
-		return ret;
+	if (priv->idle_disc) {
+		ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC,
+					FIELD_PREP(DIS_REM_CC, 1));
+		if (ret < 0)
+			return ret;
+
+		ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC,
+					FIELD_PREP(DIS_REM_CC, 1));
+		if (ret < 0)
+			return ret;
+	}
 
 	return 0;
 }
@@ -78,6 +102,7 @@
 		return ret;
 
 	priv->dev = dev;
+	priv->idle_disc = dev_read_bool(dev, "i2c-mux-idle-disconnect");
 
 	ret = gpio_request_by_name(dev, "enable-gpios", 0,
 				   &priv->enable_gpio, GPIOD_IS_OUT);
@@ -86,6 +111,13 @@
 		return ret;
 	}
 
+	ret = gpio_request_by_name(dev, "pwdnb-gpios", 0,
+				   &priv->pwdnb_gpio, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		dev_err(dev, "%s: failed to get pwdnb GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+
 	max96745_power_on(priv);
 
 	return 0;
diff --git a/u-boot/drivers/i2c/muxes/max96752f.c b/u-boot/drivers/i2c/muxes/max96752f.c
deleted file mode 100644
index b979859..0000000
--- a/u-boot/drivers/i2c/muxes/max96752f.c
+++ /dev/null
@@ -1,100 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2022 Rockchip Electronics Co., Ltd
- */
-
-#include <common.h>
-#include <dm.h>
-#include <errno.h>
-#include <i2c.h>
-#include <max96752f.h>
-
-#include <asm-generic/gpio.h>
-
-static int max96752f_select(struct udevice *mux, struct udevice *bus,
-			    uint channel)
-{
-	return 0;
-}
-
-static int max96752f_deselect(struct udevice *mux, struct udevice *bus,
-			      uint channel)
-{
-	return 0;
-}
-
-static const struct i2c_mux_ops max96752f_ops = {
-	.select = max96752f_select,
-	.deselect = max96752f_deselect,
-};
-
-static uint addr_list[] = {
-	0x48, 0x68, 0x6a, 0x4a, 0x4c, 0x6c, 0x28, 0x2a
-};
-
-void max96752f_init(struct udevice *dev)
-{
-	struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
-	u32 stream_id = dev_read_u32_default(dev->parent, "reg", 0);
-	uint addr = chip->chip_addr;
-	int i, ret;
-
-	for (i = 0; i < ARRAY_SIZE(addr_list); i++) {
-		chip->chip_addr = addr_list[i];
-
-		ret = dm_i2c_reg_read(dev, 0x000d);
-		if (ret < 0)
-			continue;
-
-		if (ret == 0x82) {
-			dm_i2c_reg_write(dev, 0x0000, addr << 1);
-			break;
-		}
-	}
-
-	chip->chip_addr = addr;
-
-	dm_i2c_reg_clrset(dev, 0x0050, STR_SEL,
-			  FIELD_PREP(STR_SEL, stream_id));
-	dm_i2c_reg_clrset(dev, 0x0073, TX_SRC_ID,
-			  FIELD_PREP(TX_SRC_ID, stream_id));
-}
-
-static int max96752f_probe(struct udevice *dev)
-{
-	struct gpio_desc enable_gpio;
-	int ret;
-
-	ret = i2c_set_chip_offset_len(dev, 2);
-	if (ret)
-		return ret;
-
-	ret = gpio_request_by_name(dev, "enable-gpios", 0, &enable_gpio,
-				   GPIOD_IS_OUT);
-	if (ret && ret != -ENOENT) {
-		dev_err(dev, "%s: failed to get enable GPIO: %d\n",
-			__func__, ret);
-		return ret;
-	}
-
-	if (dm_gpio_is_valid(&enable_gpio)) {
-		dm_gpio_set_value(&enable_gpio, 1);
-		mdelay(200);
-	}
-
-	return 0;
-}
-
-static const struct udevice_id max96752f_of_match[] = {
-	{ .compatible = "maxim,max96752f" },
-	{}
-};
-
-U_BOOT_DRIVER(max96752f) = {
-	.name = "max96752f",
-	.id = UCLASS_I2C_MUX,
-	.of_match = max96752f_of_match,
-	.bind = dm_scan_fdt_dev,
-	.probe = max96752f_probe,
-	.ops = &max96752f_ops,
-};
diff --git a/u-boot/drivers/input/adc_key.c b/u-boot/drivers/input/adc_key.c
index 391e324..32e63d0 100644
--- a/u-boot/drivers/input/adc_key.c
+++ b/u-boot/drivers/input/adc_key.c
@@ -11,13 +11,10 @@
 static int adc_key_ofdata_to_platdata(struct udevice *dev)
 {
 	struct dm_key_uclass_platdata *uc_key;
-	u32 chn[2], mV;
-	int vref, ret;
-#ifdef CONFIG_SARADC_ROCKCHIP_V2
-	int range = 4096;	/* 12-bit adc */
-#else
-	int range = 1024;	/* 10-bit adc */
-#endif
+	int t, down_threshold = -1, up_threshold;
+	int ret, num = 0, volt_margin = 150000;	/* will be div 2 */
+	u32 voltage, chn[2];
+	ofnode node;
 
 	uc_key = dev_get_uclass_platdata(dev);
 	if (!uc_key)
@@ -33,29 +30,50 @@
 		return -EINVAL;
 	}
 
-	vref = dev_read_u32_default(dev_get_parent(dev),
+	up_threshold = dev_read_u32_default(dev_get_parent(dev),
 				    "keyup-threshold-microvolt", -ENODATA);
-	if (vref < 0) {
-		printf("%s: read 'keyup-threshold-microvolt' failed, ret=%d\n",
-		       uc_key->name, vref);
-		return -EINVAL;
-	}
+	if (up_threshold < 0)
+		return -ENODATA;
 
 	uc_key->code = dev_read_u32_default(dev, "linux,code", -ENODATA);
-	if (uc_key->code < 0) {
-		printf("%s: read 'linux,code' failed\n", uc_key->name);
-		return -EINVAL;
+	if (uc_key->code < 0)
+		return -ENODATA;
+
+	voltage = dev_read_u32_default(dev, "press-threshold-microvolt", -ENODATA);
+	if (voltage < 0)
+		return -ENODATA;
+
+	dev_for_each_subnode(node, dev->parent) {
+		ret = ofnode_read_s32(node, "press-threshold-microvolt", &t);
+		if (ret)
+			return ret;
+
+		if (t > voltage && t < up_threshold)
+			up_threshold = t;
+		else if (t < voltage && t > down_threshold)
+			down_threshold = t;
+		num++;
 	}
 
-	mV = dev_read_u32_default(dev, "press-threshold-microvolt", -ENODATA);
-	if (mV < 0) {
-		printf("%s: read 'press-threshold-microvolt' failed\n",
-		       uc_key->name);
-		return -EINVAL;
+	/* although one node only, it doesn't mean only one key on hardware */
+	if (num == 1) {
+		down_threshold = voltage - volt_margin;
+		up_threshold = voltage + volt_margin;
 	}
 
+	uc_key->in_volt = 1;
 	uc_key->channel = chn[1];
-	uc_key->adcval = mV / (vref / range);
+	uc_key->center = voltage;
+	/*
+	 * Define the voltage range such that the button is only pressed
+	 * when the voltage is closest to its own press-threshold-microvolt
+	 */
+	if (down_threshold < 0)
+		uc_key->min = 0;
+	else
+		uc_key->min = down_threshold + (voltage - down_threshold) / 2;
+
+	uc_key->max = voltage + (up_threshold - voltage) / 2;
 
 	return 0;
 }
diff --git a/u-boot/drivers/input/key-uclass.c b/u-boot/drivers/input/key-uclass.c
index f28869a..c4f85da 100644
--- a/u-boot/drivers/input/key-uclass.c
+++ b/u-boot/drivers/input/key-uclass.c
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <adc.h>
+#include <div64.h>
 #include <dm.h>
 #include <irq-generic.h>
 #include <key.h>
@@ -37,11 +38,42 @@
 	return (cntpct > base) ? (cntpct - base) : 0;
 }
 
-static int key_adc_event(struct dm_key_uclass_platdata *uc_key, int adcval)
+#ifdef CONFIG_ADC
+static int adc_raw_to_mV(struct udevice *dev, unsigned int raw, int *mV)
 {
-	return (adcval <= uc_key->max && adcval >= uc_key->min) ?
+	unsigned int data_mask;
+	int ret, vref = 1800000;
+	u64 raw64 = raw;
+
+	ret = adc_data_mask(dev, &data_mask);
+	if (ret)
+		return ret;
+
+	raw64 *= vref;
+	do_div(raw64, data_mask);
+	*mV = raw64;
+
+	return 0;
+}
+
+static int key_adc_event(struct udevice *dev,
+			 struct dm_key_uclass_platdata *uc_key, int adcval)
+{
+	int val = adcval;
+
+	if (uc_key->in_volt) {
+		if (adc_raw_to_mV(dev, adcval, &val))
+			return KEY_PRESS_NONE;
+	}
+
+	debug("[%s] <%d, %d, %d>: adcval=%d -> mV=%d\n",
+	      uc_key->name, uc_key->min, uc_key->center, uc_key->max,
+	      adcval, val);
+
+	return (val <= uc_key->max && val >= uc_key->min) ?
 		KEY_PRESS_DOWN : KEY_PRESS_NONE;
 }
+#endif
 
 static int key_gpio_event(struct dm_key_uclass_platdata *uc_key)
 {
@@ -108,16 +140,34 @@
 
 static int key_core_read(struct dm_key_uclass_platdata *uc_key)
 {
-	unsigned int adcval;
-
 	if (uc_key->type == ADC_KEY) {
-		if (adc_channel_single_shot("saradc",
-					    uc_key->channel, &adcval)) {
-			KEY_ERR("%s failed to read saradc\n", uc_key->name);
+#ifdef CONFIG_ADC
+		struct udevice *dev;
+		unsigned int adcval;
+		int ret;
+
+		ret = uclass_get_device_by_name(UCLASS_ADC, "saradc", &dev);
+		if (ret) {
+			KEY_ERR("%s: No saradc\n", uc_key->name);
 			return KEY_NOT_EXIST;
 		}
 
-		return key_adc_event(uc_key, adcval);
+		ret = adc_start_channel(dev, uc_key->channel);
+		if (ret) {
+			KEY_ERR("%s: Failed to start saradc\n", uc_key->name);
+			return KEY_NOT_EXIST;
+		}
+
+		ret = adc_channel_data(dev, uc_key->channel, &adcval);
+		if (ret) {
+			KEY_ERR("%s: Failed to read saradc, %d\n", uc_key->name, ret);
+			return KEY_NOT_EXIST;
+		}
+
+		return key_adc_event(dev, uc_key, adcval);
+#else
+		return KEY_NOT_EXIST;
+#endif
 	}
 
 	return (uc_key->code == KEY_POWER) ?
@@ -273,11 +323,7 @@
 {
 	struct dm_key_uclass_platdata *uc_key;
 	int ret;
-#ifdef CONFIG_SARADC_ROCKCHIP_V2
-	int margin = 120;
-#else
-	int margin = 30;
-#endif
+
 	uc_key = dev_get_uclass_platdata(dev);
 	if (!uc_key)
 		return -ENXIO;
@@ -286,11 +332,7 @@
 	uc_key->pre_reloc = dev_read_bool(dev, "u-boot,dm-pre-reloc") ||
 			    dev_read_bool(dev, "u-boot,dm-spl");
 
-	if (uc_key->type == ADC_KEY) {
-		uc_key->max = uc_key->adcval + margin;
-		uc_key->min = uc_key->adcval > margin ?
-					uc_key->adcval - margin : 0;
-	} else {
+	if (uc_key->type != ADC_KEY) {
 		if (uc_key->code == KEY_POWER) {
 #if CONFIG_IS_ENABLED(IRQ)
 			int irq;
@@ -337,8 +379,9 @@
 	       dev->parent->name);
 
 	if (uc_key->type == ADC_KEY) {
-		printf("    adcval: %d (%d, %d)\n", uc_key->adcval,
-		       uc_key->min, uc_key->max);
+		printf("      %s: %d (%d, %d)\n",
+		       uc_key->in_volt ? "volt" : " adc",
+		       uc_key->center, uc_key->min, uc_key->max);
 		printf("   channel: %d\n\n", uc_key->channel);
 	} else {
 		const char *gpio_name =
diff --git a/u-boot/drivers/input/rk_key.c b/u-boot/drivers/input/rk_key.c
index 2619a8e..4d275e9 100644
--- a/u-boot/drivers/input/rk_key.c
+++ b/u-boot/drivers/input/rk_key.c
@@ -27,9 +27,13 @@
 
 	if (dev_read_bool(dev, "rockchip,adc_value")) {
 		uc_key->type = ADC_KEY;
+		uc_key->in_volt = 0;
 		uc_key->channel = chn[1];
-		uc_key->adcval =
-			dev_read_u32_default(dev, "rockchip,adc_value", 0);
+		uc_key->center = dev_read_u32_default(dev, "rockchip,adc_value", 0);
+		uc_key->min = uc_key->center - 30;
+		if (uc_key->min < 0)
+			uc_key->min = 0;
+		uc_key->max = uc_key->center + 30;
 	} else {
 		uc_key->type = GPIO_KEY;
 		if (dev_read_u32_array(dev, "gpios",
diff --git a/u-boot/drivers/input/spl_adc_key.c b/u-boot/drivers/input/spl_adc_key.c
index 60e0394..8aceaef 100644
--- a/u-boot/drivers/input/spl_adc_key.c
+++ b/u-boot/drivers/input/spl_adc_key.c
@@ -6,28 +6,46 @@
 
 #include <common.h>
 #include <adc.h>
+#include <div64.h>
 #include <fdtdec.h>
+#include <dm/uclass.h>
 
 DECLARE_GLOBAL_DATA_PTR;
+
+static int adc_raw_to_mV(struct udevice *dev, unsigned int raw, int *mV)
+{
+	unsigned int data_mask;
+	int ret, vref = 1800000;
+	u64 raw64 = raw;
+
+	ret = adc_data_mask(dev, &data_mask);
+	if (ret)
+		return ret;
+
+	raw64 *= vref;
+	do_div(raw64, data_mask);
+	*mV = raw64;
+
+	return 0;
+}
 
 int key_read(int code)
 {
 	const void *fdt_blob = gd->fdt_blob;
+	struct udevice *dev;
 	int adc_node, offset;
-	int cd, channel, adc;
-	int ret, vref, mv;
+	int t, down_threshold = -1, up_threshold;
+	int ret, num = 0, volt_margin = 150000;	/* will be div 2 */
+	int mV, cd, voltage = -1;
 	int min, max;
-	int margin;
-	int range;
-	uint val;
-	u32 chn[2];
-#ifdef CONFIG_SARADC_ROCKCHIP_V2
-	range = 4096;	/* 12-bit adc */
-	margin = 120;
-#else
-	range = 1024;	/* 10-bit adc */
-	margin = 30;
-#endif
+	u32 chn[2], adc;
+
+	ret = uclass_get_device_by_name(UCLASS_ADC, "saradc", &dev);
+	if (ret) {
+		debug("No saradc device, ret=%d\n", ret);
+		return 0;
+	}
+
 	adc_node = fdt_node_offset_by_compatible(fdt_blob, 0, "adc-keys");
 	if (adc_node < 0) {
 		debug("No 'adc-keys' node, ret=%d\n", adc_node);
@@ -41,40 +59,87 @@
 		return 0;
 	}
 
-	vref = fdtdec_get_int(fdt_blob, adc_node,
-			      "keyup-threshold-microvolt", -1);
-	if (vref < 0) {
+	up_threshold = fdtdec_get_int(fdt_blob, adc_node,
+				      "keyup-threshold-microvolt", -ENODATA);
+	if (up_threshold < 0) {
 		debug("Can't read 'keyup-threshold-microvolt'\n");
 		return 0;
 	}
 
-	channel = chn[1];
+	/* find the expected key-code */
+	for (offset = fdt_first_subnode(fdt_blob, adc_node);
+	     offset >= 0;
+	     offset = fdt_next_subnode(fdt_blob, offset)) {
+		cd = fdtdec_get_int(fdt_blob, offset, "linux,code", -ENODATA);
+		if (cd < 0) {
+			debug("Can't read 'linux,code', ret=%d\n", cd);
+			return 0;
+		}
+
+		if (cd == code) {
+			voltage = fdtdec_get_int(fdt_blob, offset,
+					"press-threshold-microvolt", -ENODATA);
+			if (voltage < 0) {
+				debug("Can't read 'press-threshold-microvolt'\n");
+				return 0;
+			}
+			break;
+		}
+	}
+
+	if (voltage < 0)
+		return 0;
 
 	for (offset = fdt_first_subnode(fdt_blob, adc_node);
 	     offset >= 0;
 	     offset = fdt_next_subnode(fdt_blob, offset)) {
-		cd = fdtdec_get_int(fdt_blob, offset, "linux,code", -1);
-		if (cd == code) {
-			mv = fdtdec_get_int(fdt_blob, offset,
-					    "press-threshold-microvolt", -1);
-			if (mv < 0) {
-				debug("Can't read 'press-threshold-microvolt'\n");
-				return 0;
-			}
-
-			adc = mv / (vref / range);
-			max = adc + margin;
-			min = adc > margin ? adc - margin : 0;
-			ret = adc_channel_single_shot("saradc", channel, &val);
-			if (ret) {
-				debug("Failed to read adc%d, ret=%d\n",
-				      channel, ret);
-				return 0;
-			}
-
-			return (val >= min && val <= max);
+		t = fdtdec_get_int(fdt_blob, offset,
+				   "press-threshold-microvolt", -ENODATA);
+		if (t < 0) {
+			debug("Can't read 'press-threshold-microvolt'\n");
+			return 0;
 		}
+
+		if (t > voltage && t < up_threshold)
+			up_threshold = t;
+		else if (t < voltage && t > down_threshold)
+			down_threshold = t;
+		num++;
 	}
 
-	return 0;
+	/* although one node only, it doesn't mean only one key on hardware */
+	if (num == 1) {
+		down_threshold = voltage - volt_margin;
+		up_threshold = voltage + volt_margin;
+	}
+
+	/*
+	 * Define the voltage range such that the button is only pressed
+	 * when the voltage is closest to its own press-threshold-microvolt
+	 */
+	if (down_threshold < 0)
+		min = 0;
+	else
+		min = down_threshold + (voltage - down_threshold) / 2;
+
+	max = voltage + (up_threshold - voltage) / 2;
+
+	/* now, read key status */
+	ret = adc_channel_single_shot("saradc", chn[1], &adc);
+	if (ret) {
+		debug("Failed to read adc%d, ret=%d\n", chn[1], ret);
+		return 0;
+	}
+
+	ret = adc_raw_to_mV(dev, adc, &mV);
+	if (ret) {
+		debug("Failed to convert adc to mV, ret=%d\n", ret);
+		return 0;
+	}
+
+	debug("key[%d] <%d, %d, %d>: adc=%d -> mV=%d\n",
+	      code, min, voltage, max, adc, mV);
+
+	return (mV <= max && mV >= min);
 }
+
diff --git a/u-boot/drivers/misc/Makefile b/u-boot/drivers/misc/Makefile
index b262618..65777a5 100644
--- a/u-boot/drivers/misc/Makefile
+++ b/u-boot/drivers/misc/Makefile
@@ -83,4 +83,12 @@
 obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP) += rk3588-secure-otp.o
 endif
 
+ifdef CONFIG_ROCKCHIP_RK3528
+obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP) += rk3528-secure-otp.o
+endif
+
+ifdef CONFIG_ROCKCHIP_RK3562
+obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP) += rk3562-secure-otp.o
+endif
+
 obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_HW_DECOMPRESS) += rockchip_decompress.o
diff --git a/u-boot/drivers/misc/rk3528-secure-otp.S b/u-boot/drivers/misc/rk3528-secure-otp.S
new file mode 100644
index 0000000..12b91f3
--- /dev/null
+++ b/u-boot/drivers/misc/rk3528-secure-otp.S
@@ -0,0 +1,15901 @@
+	.arch armv8-a+nosimd
+	.file	"rk3528-secure-otp.c"
+	.text
+.Ltext0:
+	.cfi_sections	.debug_frame
+	.section	.text.rk3528_spl_rockchip_otp_stop,"ax",@progbits
+	.align	2
+	.type	rk3528_spl_rockchip_otp_stop, %function
+rk3528_spl_rockchip_otp_stop:
+.LFB263:
+	.file 1 "drivers/misc/rk3528-secure-otp.c"
+	.loc 1 81 0
+	.cfi_startproc
+.LVL0:
+.LBB22:
+	.loc 1 82 0
+#APP
+// 82 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w1, 16777216
+.LVL1:
+	str	w1, [x0]
+	ret
+.LBE22:
+	.cfi_endproc
+.LFE263:
+	.size	rk3528_spl_rockchip_otp_stop, .-rk3528_spl_rockchip_otp_stop
+	.section	.text.secure_otp_ioctl,"ax",@progbits
+	.align	2
+	.type	secure_otp_ioctl, %function
+secure_otp_ioctl:
+.LFB276:
+	.loc 1 697 0
+	.cfi_startproc
+.LVL2:
+	.loc 1 700 0
+	mov	x0, 27908
+.LVL3:
+	cmp	x1, x0
+	bne	.L6
+.LVL4:
+.LBB23:
+.LBB24:
+	.loc 1 689 0
+	mov	w0, 8
+	str	w0, [x2]
+.LVL5:
+.LBE24:
+.LBE23:
+	.loc 1 702 0
+	mov	w0, 0
+	.loc 1 703 0
+	ret
+.LVL6:
+.L6:
+	.loc 1 698 0
+	mov	w0, -22
+	.loc 1 709 0
+	ret
+	.cfi_endproc
+.LFE276:
+	.size	secure_otp_ioctl, .-secure_otp_ioctl
+	.section	.text.secure_otp_write,"ax",@progbits
+	.align	2
+	.type	secure_otp_write, %function
+secure_otp_write:
+.LFB274:
+	.loc 1 681 0
+	.cfi_startproc
+.LVL7:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	mov	x19, x0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.loc 1 681 0
+	mov	w20, w1
+	mov	x21, x2
+	mov	w22, w3
+	.loc 1 682 0
+	bl	dev_get_driver_data
+.LVL8:
+	.loc 1 684 0
+	ldr	x4, [x0, 8]
+	mov	w3, w22
+	mov	x2, x21
+	mov	w1, w20
+	mov	x0, x19
+.LVL9:
+	.loc 1 685 0
+	ldp	x21, x22, [sp, 32]
+.LVL10:
+	ldp	x19, x20, [sp, 16]
+.LVL11:
+	ldp	x29, x30, [sp], 48
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	.loc 1 684 0
+	br	x4
+.LVL12:
+	.cfi_endproc
+.LFE274:
+	.size	secure_otp_write, .-secure_otp_write
+	.section	.text.secure_otp_read,"ax",@progbits
+	.align	2
+	.type	secure_otp_read, %function
+secure_otp_read:
+.LFB273:
+	.loc 1 673 0
+	.cfi_startproc
+.LVL13:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	mov	x19, x0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.loc 1 673 0
+	mov	w20, w1
+	mov	x21, x2
+	mov	w22, w3
+	.loc 1 674 0
+	bl	dev_get_driver_data
+.LVL14:
+	.loc 1 676 0
+	ldr	x4, [x0]
+	mov	w3, w22
+	mov	x2, x21
+	mov	w1, w20
+	mov	x0, x19
+.LVL15:
+	.loc 1 677 0
+	ldp	x21, x22, [sp, 32]
+.LVL16:
+	ldp	x19, x20, [sp, 16]
+.LVL17:
+	ldp	x29, x30, [sp], 48
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	.loc 1 676 0
+	br	x4
+.LVL18:
+	.cfi_endproc
+.LFE273:
+	.size	secure_otp_read, .-secure_otp_read
+	.section	.text.rockchip_secure_otp_ofdata_to_platdata,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_ofdata_to_platdata, %function
+rockchip_secure_otp_ofdata_to_platdata:
+.LFB277:
+	.loc 1 718 0
+	.cfi_startproc
+.LVL19:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 718 0
+	mov	x20, x0
+	.loc 1 719 0
+	bl	dev_get_platdata
+.LVL20:
+	mov	x19, x0
+.LVL21:
+	.loc 1 721 0
+	mov	x0, x20
+.LVL22:
+	bl	dev_read_addr_ptr
+.LVL23:
+	.loc 1 722 0
+	mov	w2, 0
+	adrp	x1, .LC0
+	.loc 1 721 0
+	str	x0, [x19]
+	.loc 1 722 0
+	add	x1, x1, :lo12:.LC0
+	mov	x0, x20
+	bl	dev_read_u32_default
+.LVL24:
+	.loc 1 723 0
+	uxtw	x0, w0
+	str	x0, [x19, 8]
+	.loc 1 724 0
+	mov	w2, 0
+	mov	x0, x20
+	adrp	x1, .LC1
+	add	x1, x1, :lo12:.LC1
+	bl	dev_read_u32_default
+.LVL25:
+	.loc 1 725 0
+	uxtw	x0, w0
+	str	x0, [x19, 16]
+	.loc 1 726 0
+	mov	w2, 0
+	mov	x0, x20
+	adrp	x1, .LC2
+	add	x1, x1, :lo12:.LC2
+	bl	dev_read_u32_default
+.LVL26:
+	.loc 1 727 0
+	uxtw	x0, w0
+	str	x0, [x19, 24]
+	.loc 1 730 0
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+.LVL27:
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE277:
+	.size	rockchip_secure_otp_ofdata_to_platdata, .-rockchip_secure_otp_ofdata_to_platdata
+	.section	.text.rk3528_spl_rockchip_otp_start,"ax",@progbits
+	.align	2
+	.type	rk3528_spl_rockchip_otp_start, %function
+rk3528_spl_rockchip_otp_start:
+.LFB262:
+	.loc 1 69 0
+	.cfi_startproc
+.LVL28:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	.loc 1 69 0
+	mov	x19, x1
+.LBB25:
+	.loc 1 71 0
+#APP
+// 71 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w1, 16777472
+.LVL29:
+	str	w1, [x0]
+.LVL30:
+.LBE25:
+.LBB26:
+	.loc 1 72 0
+#APP
+// 72 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w0, 131074
+.LVL31:
+	str	w0, [x19]
+.LBE26:
+	.loc 1 73 0
+	mov	x0, 2
+	bl	udelay
+.LVL32:
+.LBB27:
+	.loc 1 74 0
+#APP
+// 74 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w0, 131072
+	str	w0, [x19]
+.LBE27:
+	.loc 1 76 0
+	ldr	x19, [sp, 16]
+.LVL33:
+	.loc 1 75 0
+	mov	x0, 1
+	.loc 1 76 0
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	.loc 1 75 0
+	b	udelay
+.LVL34:
+	.cfi_endproc
+.LFE262:
+	.size	rk3528_spl_rockchip_otp_start, .-rk3528_spl_rockchip_otp_start
+	.section	.text.rockchip_secure_otp_check_flag.isra.0,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_check_flag.isra.0, %function
+rockchip_secure_otp_check_flag.isra.0:
+.LFB278:
+	.loc 1 129 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 129 0
+	mov	w19, 34465
+	mov	x20, x0
+	movk	w19, 0x1, lsl 16
+.L17:
+.LVL35:
+.LBB28:
+	.loc 1 136 0
+	ldr	x0, [x20]
+	ldr	w1, [x0, 44]
+.LVL36:
+#APP
+// 136 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+.LVL37:
+#NO_APP
+.LBE28:
+	.loc 1 137 0
+	and	w0, w1, 16
+	tbz	x1, 4, .L15
+	.loc 1 140 0
+	subs	w19, w19, #1
+.LVL38:
+	beq	.L18
+.LVL39:
+	.loc 1 146 0
+	mov	x0, 1
+	bl	udelay
+.LVL40:
+	b	.L17
+.LVL41:
+.L18:
+	.loc 1 141 0
+	mov	w0, -1
+.LVL42:
+.L15:
+	.loc 1 150 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE278:
+	.size	rockchip_secure_otp_check_flag.isra.0, .-rockchip_secure_otp_check_flag.isra.0
+	.section	.text.rockchip_secure_otp_wait_flag.isra.1,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_wait_flag.isra.1, %function
+rockchip_secure_otp_wait_flag.isra.1:
+.LFB279:
+	.loc 1 106 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 106 0
+	mov	x20, x0
+	mov	w19, 20001
+.L25:
+.LVL43:
+.LBB29:
+	.loc 1 113 0
+	ldr	x0, [x20]
+	ldr	w0, [x0, 44]
+.LVL44:
+#APP
+// 113 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+.LVL45:
+#NO_APP
+.LBE29:
+	.loc 1 114 0
+	tbnz	x0, 4, .L26
+	.loc 1 117 0
+	subs	w19, w19, #1
+.LVL46:
+	beq	.L27
+	.loc 1 122 0
+	mov	x0, 1
+.LVL47:
+	bl	udelay
+.LVL48:
+	b	.L25
+.LVL49:
+.L26:
+	.loc 1 110 0
+	mov	w0, 0
+.LVL50:
+.L23:
+	.loc 1 127 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL51:
+.L27:
+	.cfi_restore_state
+	.loc 1 118 0
+	mov	w0, -1
+.LVL52:
+	b	.L23
+	.cfi_endproc
+.LFE279:
+	.size	rockchip_secure_otp_wait_flag.isra.1, .-rockchip_secure_otp_wait_flag.isra.1
+	.section	.text.rockchip_secure_otp_wait_status.isra.2,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_wait_status.isra.2, %function
+rockchip_secure_otp_wait_status.isra.2:
+.LFB280:
+	.loc 1 86 0
+	.cfi_startproc
+.LVL53:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	mov	w19, w1
+	str	x21, [sp, 32]
+	.cfi_offset 21, -16
+	.loc 1 86 0
+	mov	x21, x0
+	mov	w20, 10000
+.LVL54:
+.L30:
+.LBB36:
+	.loc 1 91 0
+	ldr	x0, [x21]
+	ldr	w0, [x0, 772]
+.LVL55:
+#APP
+// 91 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+.LBE36:
+	tst	w0, w19
+	beq	.L32
+.LBB37:
+	.loc 1 101 0
+	orr	w19, w19, -65536
+.LVL56:
+#APP
+// 101 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x21]
+.LVL57:
+	str	w19, [x0, 772]
+.LBE37:
+	.loc 1 103 0
+	mov	w0, 0
+	b	.L29
+.LVL58:
+.L32:
+	.loc 1 92 0
+	mov	x0, 1
+.LVL59:
+	bl	udelay
+.LVL60:
+	.loc 1 94 0
+	subs	w20, w20, #1
+.LVL61:
+	bne	.L30
+.LVL62:
+.LBB38:
+.LBB39:
+	.loc 1 95 0
+	adrp	x1, .LANCHOR0
+	adrp	x0, .LC3
+	add	x1, x1, :lo12:.LANCHOR0
+	add	x0, x0, :lo12:.LC3
+	bl	printf
+.LVL63:
+	mov	w0, -110
+.LVL64:
+.L29:
+.LBE39:
+.LBE38:
+	.loc 1 104 0
+	ldp	x19, x20, [sp, 16]
+.LVL65:
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE280:
+	.size	rockchip_secure_otp_wait_status.isra.2, .-rockchip_secure_otp_wait_status.isra.2
+	.section	.text.rk3528_secure_otp_write_2_bytes_noecc,"ax",@progbits
+	.align	2
+	.type	rk3528_secure_otp_write_2_bytes_noecc, %function
+rk3528_secure_otp_write_2_bytes_noecc:
+.LFB269:
+	.loc 1 240 0
+	.cfi_startproc
+.LVL66:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	mov	w24, w2
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	.loc 1 244 0
+	asr	w20, w24, 1
+	.loc 1 240 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	and	w21, w3, 65535
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	mov	x26, x1
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 27, -16
+	.cfi_offset 28, -8
+	.loc 1 242 0
+	bl	dev_get_driver_data
+.LVL67:
+	.loc 1 245 0
+	cmp	w20, 447
+	bgt	.L43
+	mov	x23, x0
+	.loc 1 249 0
+	sub	w0, w20, #416
+.LVL68:
+	cmp	w0, 15
+	ccmp	w20, 16, 4, hi
+	beq	.L37
+	.loc 1 252 0
+	adrp	x0, .LC4
+	and	w1, w24, -2
+	add	x0, x0, :lo12:.LC4
+	bl	printf
+.LVL69:
+.L43:
+	.loc 1 246 0
+	mov	w0, -1
+.LVL70:
+.L35:
+	.loc 1 446 0
+	ldp	x19, x20, [sp, 16]
+.LVL71:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+.LVL72:
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 27
+	.cfi_restore 28
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL73:
+.L37:
+	.cfi_restore_state
+	.loc 1 256 0
+	cbz	w21, .L44
+	.loc 1 259 0
+	ldr	x6, [x23, 16]
+	mov	w3, w20
+	ldp	x0, x2, [x26, 8]
+	ldr	x1, [x26, 24]
+	blr	x6
+.LVL74:
+.LBB40:
+	.loc 1 262 0
+#APP
+// 262 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 65536
+	str	w1, [x0, 256]
+.LVL75:
+.LBE40:
+.LBB41:
+	.loc 1 263 0
+#APP
+// 263 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 262148
+	str	w1, [x0, 32]
+.LVL76:
+.LBE41:
+.LBB42:
+	.loc 1 264 0
+#APP
+// 264 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, -65536
+	str	w1, [x0, 40]
+.LVL77:
+.LBE42:
+.LBB43:
+	.loc 1 265 0
+#APP
+// 265 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL78:
+.LBE43:
+.LBB44:
+	.loc 1 266 0
+#APP
+// 266 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w22, -65534
+	str	w22, [x0, 36]
+.LVL79:
+.LBE44:
+.LBB45:
+	.loc 1 267 0
+#APP
+// 267 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 252
+	str	w1, [x0, 4096]
+.LVL80:
+.LBE45:
+.LBB46:
+	.loc 1 268 0
+#APP
+// 268 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4100]
+.LVL81:
+.LBE46:
+.LBB47:
+	.loc 1 269 0
+#APP
+// 269 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4104]
+.LVL82:
+.LBE47:
+.LBB48:
+	.loc 1 270 0
+#APP
+// 270 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w19, 65537
+.LBE48:
+	.loc 1 271 0
+	mov	w1, 2
+.LBB49:
+	.loc 1 270 0
+	str	w19, [x0, 32]
+.LBE49:
+	.loc 1 271 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL83:
+	.loc 1 272 0
+	tbz	w0, #31, .L38
+.L40:
+	.loc 1 273 0
+	adrp	x1, .LANCHOR1
+	adrp	x0, .LC5
+.LVL84:
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x0, x0, :lo12:.LC5
+.L46:
+	.loc 1 406 0
+	bl	printf
+.LVL85:
+.L39:
+	.loc 1 442 0
+	ldr	x5, [x23, 24]
+	mov	w3, w20
+	ldp	x0, x2, [x26, 8]
+	ldr	x1, [x26, 24]
+	blr	x5
+.LVL86:
+.L44:
+	.loc 1 257 0
+	mov	w0, 0
+	b	.L35
+.LVL87:
+.L38:
+.LBB50:
+	.loc 1 277 0
+#APP
+// 277 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL88:
+	mov	w28, -65522
+	str	w28, [x0, 36]
+.LVL89:
+.LBE50:
+.LBB51:
+	.loc 1 278 0
+#APP
+// 278 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w27, 240
+	str	w27, [x0, 4096]
+.LVL90:
+.LBE51:
+.LBB52:
+	.loc 1 279 0
+#APP
+// 279 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL91:
+.LBE52:
+.LBB53:
+	.loc 1 280 0
+#APP
+// 280 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w25, 122
+	str	w25, [x0, 4104]
+.LVL92:
+.LBE53:
+.LBB54:
+	.loc 1 281 0
+#APP
+// 281 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 37
+	str	w1, [x0, 4108]
+.LVL93:
+.LBE54:
+.LBB55:
+	.loc 1 282 0
+#APP
+// 282 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4112]
+.LVL94:
+.LBE55:
+.LBB56:
+	.loc 1 283 0
+#APP
+// 283 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4116]
+.LVL95:
+.LBE56:
+.LBB57:
+	.loc 1 284 0
+#APP
+// 284 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4120]
+.LVL96:
+.LBE57:
+.LBB58:
+	.loc 1 285 0
+#APP
+// 285 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 31
+	str	w1, [x0, 4124]
+.LVL97:
+.LBE58:
+.LBB59:
+	.loc 1 286 0
+#APP
+// 286 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 11
+	str	w1, [x0, 4128]
+.LVL98:
+.LBE59:
+.LBB60:
+	.loc 1 287 0
+#APP
+// 287 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 8
+	str	w1, [x0, 4132]
+.LVL99:
+.LBE60:
+.LBB61:
+	.loc 1 288 0
+#APP
+// 288 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4136]
+.LVL100:
+.LBE61:
+.LBB62:
+	.loc 1 289 0
+#APP
+// 289 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4140]
+.LVL101:
+.LBE62:
+.LBB63:
+	.loc 1 290 0
+#APP
+// 290 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4144]
+.LBE63:
+.LBB64:
+	.loc 1 291 0
+	and	w0, w20, 255
+#APP
+// 291 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x26]
+.LBE64:
+.LBB65:
+	.loc 1 292 0
+	ubfx	x5, x24, 9, 8
+.LVL102:
+.LBE65:
+.LBB66:
+	.loc 1 291 0
+	str	w0, [x1, 4148]
+.LBE66:
+.LBB67:
+	.loc 1 292 0
+#APP
+// 292 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w5, [x0, 4152]
+.LVL103:
+.LBE67:
+.LBB68:
+	.loc 1 293 0
+#APP
+// 293 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE68:
+	.loc 1 294 0
+	mov	w1, 2
+.LBB69:
+	.loc 1 293 0
+	str	w19, [x0, 32]
+.LBE69:
+	.loc 1 294 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL104:
+	.loc 1 295 0
+	tbnz	w0, #31, .L40
+.LVL105:
+.LBB70:
+	.loc 1 300 0
+#APP
+// 300 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL106:
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL107:
+.LBE70:
+.LBB71:
+	.loc 1 301 0
+#APP
+// 301 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 250
+	str	w1, [x0, 4096]
+.LVL108:
+.LBE71:
+.LBB72:
+	.loc 1 302 0
+#APP
+// 302 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 9
+	str	w1, [x0, 4100]
+.LVL109:
+.LBE72:
+.LBB73:
+	.loc 1 303 0
+#APP
+// 303 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE73:
+	.loc 1 304 0
+	mov	w1, 2
+.LBB74:
+	.loc 1 303 0
+	str	w19, [x0, 32]
+.LBE74:
+	.loc 1 304 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL110:
+	.loc 1 305 0
+	tbnz	w0, #31, .L40
+.LVL111:
+.LBB75:
+	.loc 1 310 0
+#APP
+// 310 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL112:
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL113:
+.LBE75:
+.LBB76:
+	.loc 1 311 0
+#APP
+// 311 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w28, [x0, 36]
+.LVL114:
+.LBE76:
+.LBB77:
+	.loc 1 312 0
+#APP
+// 312 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w27, [x0, 4096]
+.LVL115:
+.LBE77:
+.LBB78:
+	.loc 1 313 0
+#APP
+// 313 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL116:
+.LBE78:
+.LBB79:
+	.loc 1 314 0
+#APP
+// 314 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w25, [x0, 4104]
+.LVL117:
+.LBE79:
+.LBB80:
+	.loc 1 315 0
+#APP
+// 315 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 21
+	str	w1, [x0, 4108]
+.LVL118:
+.LBE80:
+.LBB81:
+	.loc 1 316 0
+#APP
+// 316 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 220
+	str	w1, [x0, 4112]
+.LVL119:
+.LBE81:
+.LBB82:
+	.loc 1 317 0
+#APP
+// 317 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 146
+	str	w1, [x0, 4116]
+.LVL120:
+.LBE82:
+.LBB83:
+	.loc 1 318 0
+#APP
+// 318 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 121
+	str	w1, [x0, 4120]
+.LVL121:
+.LBE83:
+.LBB84:
+	.loc 1 319 0
+#APP
+// 319 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 129
+	str	w1, [x0, 4124]
+.LVL122:
+.LBE84:
+.LBB85:
+	.loc 1 320 0
+#APP
+// 320 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 126
+	str	w1, [x0, 4128]
+.LVL123:
+.LBE85:
+.LBB86:
+	.loc 1 321 0
+#APP
+// 321 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 33
+	str	w1, [x0, 4132]
+.LVL124:
+.LBE86:
+.LBB87:
+	.loc 1 322 0
+#APP
+// 322 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 17
+	str	w1, [x0, 4136]
+.LVL125:
+.LBE87:
+.LBB88:
+	.loc 1 323 0
+#APP
+// 323 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 157
+	str	w1, [x0, 4140]
+.LVL126:
+.LBE88:
+.LBB89:
+	.loc 1 324 0
+#APP
+// 324 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w25, 2
+	str	w25, [x0, 4144]
+.LVL127:
+.LBE89:
+.LBB90:
+	.loc 1 325 0
+#APP
+// 325 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4148]
+.LVL128:
+.LBE90:
+.LBB91:
+	.loc 1 326 0
+#APP
+// 326 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 64
+	str	w1, [x0, 4152]
+.LVL129:
+.LBE91:
+.LBB92:
+	.loc 1 327 0
+#APP
+// 327 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE92:
+	.loc 1 328 0
+	mov	w1, w25
+.LBB93:
+	.loc 1 327 0
+	str	w19, [x0, 32]
+.LBE93:
+	.loc 1 328 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL130:
+	.loc 1 329 0
+	tbnz	w0, #31, .L40
+.LVL131:
+.LBB94:
+	.loc 1 334 0
+#APP
+// 334 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL132:
+	str	w22, [x0, 36]
+.LVL133:
+.LBE94:
+.LBB95:
+	.loc 1 335 0
+#APP
+// 335 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 252
+	str	w1, [x0, 4096]
+.LVL134:
+.LBE95:
+.LBB96:
+	.loc 1 336 0
+#APP
+// 336 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 10
+	str	w1, [x0, 4100]
+.LVL135:
+.LBE96:
+.LBB97:
+	.loc 1 337 0
+#APP
+// 337 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 112
+	str	w1, [x0, 4104]
+.LVL136:
+.LBE97:
+.LBB98:
+	.loc 1 338 0
+#APP
+// 338 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE98:
+	.loc 1 339 0
+	mov	w1, w25
+.LBB99:
+	.loc 1 338 0
+	str	w19, [x0, 32]
+.LBE99:
+	.loc 1 339 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL137:
+	.loc 1 340 0
+	tbnz	w0, #31, .L40
+.LVL138:
+.LBB100:
+	.loc 1 345 0
+#APP
+// 345 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL139:
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL140:
+.LBE100:
+.LBB101:
+	.loc 1 346 0
+#APP
+// 346 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w22, [x0, 36]
+.LVL141:
+.LBE101:
+.LBB102:
+	.loc 1 347 0
+#APP
+// 347 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 192
+	str	w1, [x0, 4096]
+.LBE102:
+.LBB103:
+	.loc 1 348 0
+	and	w1, w21, 255
+.LVL142:
+#APP
+// 348 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE103:
+.LBB104:
+	.loc 1 349 0
+	lsr	w21, w21, 8
+.LVL143:
+.LBE104:
+.LBB105:
+	.loc 1 348 0
+	str	w1, [x0, 4100]
+.LBE105:
+.LBB106:
+	.loc 1 349 0
+#APP
+// 349 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w21, [x0, 4104]
+.LVL144:
+.LBE106:
+.LBB107:
+	.loc 1 350 0
+#APP
+// 350 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE107:
+	.loc 1 351 0
+	mov	w1, w25
+.LVL145:
+.LBB108:
+	.loc 1 350 0
+	str	w19, [x0, 32]
+.LBE108:
+	.loc 1 351 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL146:
+	.loc 1 352 0
+	tbnz	w0, #31, .L40
+.LVL147:
+.LBB109:
+	.loc 1 357 0
+#APP
+// 357 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL148:
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL149:
+.LBE109:
+.LBB110:
+	.loc 1 358 0
+#APP
+// 358 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 224
+	str	w1, [x0, 4096]
+.LVL150:
+.LBE110:
+.LBB111:
+	.loc 1 359 0
+#APP
+// 359 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4100]
+.LVL151:
+.LBE111:
+.LBB112:
+	.loc 1 360 0
+#APP
+// 360 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE112:
+	.loc 1 361 0
+	mov	w1, w25
+.LBB113:
+	.loc 1 360 0
+	str	w19, [x0, 32]
+.LBE113:
+	.loc 1 361 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL152:
+	.loc 1 362 0
+	tbnz	w0, #31, .L40
+.LVL153:
+.LBB114:
+	.loc 1 367 0
+#APP
+// 367 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL154:
+	mov	w22, -65535
+	str	w22, [x0, 36]
+.LVL155:
+.LBE114:
+.LBB115:
+	.loc 1 368 0
+#APP
+// 368 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL156:
+.LBE115:
+.LBB116:
+	.loc 1 369 0
+#APP
+// 369 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 255
+	str	w1, [x0, 4096]
+.LVL157:
+.LBE116:
+.LBB117:
+	.loc 1 370 0
+#APP
+// 370 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 10
+	str	w1, [x0, 4100]
+.LVL158:
+.LBE117:
+.LBB118:
+	.loc 1 371 0
+#APP
+// 371 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w21, 65537
+.LVL159:
+.LBE118:
+	.loc 1 372 0
+	mov	w1, w25
+.LBB119:
+	.loc 1 371 0
+	str	w21, [x0, 32]
+.LBE119:
+	.loc 1 372 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL160:
+	.loc 1 373 0
+	tbnz	w0, #31, .L40
+.LVL161:
+.LBB120:
+	.loc 1 378 0
+#APP
+// 378 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL162:
+	str	w22, [x0, 36]
+.LVL163:
+.LBE120:
+.LBB121:
+	.loc 1 379 0
+#APP
+// 379 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 1
+	str	w1, [x0, 4096]
+.LVL164:
+.LBE121:
+.LBB122:
+	.loc 1 380 0
+#APP
+// 380 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w24, 191
+.LVL165:
+	str	w24, [x0, 4100]
+.LVL166:
+.LBE122:
+.LBB123:
+	.loc 1 381 0
+#APP
+// 381 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE123:
+	.loc 1 382 0
+	mov	w1, w25
+.LBB124:
+	.loc 1 381 0
+	str	w21, [x0, 32]
+.LBE124:
+	.loc 1 382 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL167:
+	.loc 1 383 0
+	tbnz	w0, #31, .L40
+	.loc 1 388 0
+	mov	x0, x26
+.LVL168:
+	bl	rockchip_secure_otp_check_flag.isra.0
+.LVL169:
+	.loc 1 389 0
+	tbz	w0, #31, .L41
+	.loc 1 390 0
+	adrp	x1, .LANCHOR1
+	adrp	x0, .LC6
+.LVL170:
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x0, x0, :lo12:.LC6
+	b	.L46
+.LVL171:
+.L41:
+.LBB125:
+	.loc 1 394 0
+#APP
+// 394 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL172:
+	str	w22, [x0, 36]
+.LVL173:
+.LBE125:
+.LBB126:
+	.loc 1 395 0
+#APP
+// 395 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w19, 2
+	str	w19, [x0, 4096]
+.LVL174:
+.LBE126:
+.LBB127:
+	.loc 1 396 0
+#APP
+// 396 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w24, [x0, 4100]
+.LVL175:
+.LBE127:
+.LBB128:
+	.loc 1 397 0
+#APP
+// 397 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE128:
+	.loc 1 398 0
+	mov	w1, w19
+.LBB129:
+	.loc 1 397 0
+	str	w21, [x0, 32]
+.LBE129:
+	.loc 1 398 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL176:
+	.loc 1 399 0
+	tbnz	w0, #31, .L40
+	.loc 1 404 0
+	mov	x0, x26
+.LVL177:
+	bl	rockchip_secure_otp_wait_flag.isra.1
+.LVL178:
+	.loc 1 405 0
+	tbz	w0, #31, .L42
+	.loc 1 406 0
+	adrp	x1, .LANCHOR1
+	adrp	x0, .LC7
+.LVL179:
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x0, x0, :lo12:.LC7
+	b	.L46
+.LVL180:
+.L42:
+.LBB130:
+	.loc 1 410 0
+#APP
+// 410 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL181:
+	mov	w1, -65533
+	str	w1, [x0, 772]
+.LVL182:
+.LBE130:
+.LBB131:
+	.loc 1 411 0
+#APP
+// 411 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL183:
+.LBE131:
+.LBB132:
+	.loc 1 412 0
+#APP
+// 412 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w22, [x0, 36]
+.LVL184:
+.LBE132:
+.LBB133:
+	.loc 1 413 0
+#APP
+// 413 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w19, [x0, 4096]
+.LVL185:
+.LBE133:
+.LBB134:
+	.loc 1 414 0
+#APP
+// 414 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 128
+	str	w1, [x0, 4100]
+.LVL186:
+.LBE134:
+.LBB135:
+	.loc 1 415 0
+#APP
+// 415 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE135:
+	.loc 1 416 0
+	mov	w1, w19
+.LBB136:
+	.loc 1 415 0
+	str	w21, [x0, 32]
+.LBE136:
+	.loc 1 416 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL187:
+	.loc 1 417 0
+	tbnz	w0, #31, .L40
+.LVL188:
+.LBB137:
+	.loc 1 422 0
+#APP
+// 422 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL189:
+	str	w22, [x0, 36]
+.LVL190:
+.LBE137:
+.LBB138:
+	.loc 1 423 0
+#APP
+// 423 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 160
+	str	w1, [x0, 4096]
+.LVL191:
+.LBE138:
+.LBB139:
+	.loc 1 424 0
+#APP
+// 424 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4100]
+.LVL192:
+.LBE139:
+.LBB140:
+	.loc 1 425 0
+#APP
+// 425 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE140:
+	.loc 1 426 0
+	mov	w1, w19
+.LBB141:
+	.loc 1 425 0
+	str	w21, [x0, 32]
+.LBE141:
+	.loc 1 426 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL193:
+	.loc 1 427 0
+	tbnz	w0, #31, .L40
+.LVL194:
+.LBB142:
+	.loc 1 432 0
+#APP
+// 432 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL195:
+	mov	w1, 250
+	str	w1, [x0, 4096]
+.LVL196:
+.LBE142:
+.LBB143:
+	.loc 1 433 0
+#APP
+// 433 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 9
+	str	w1, [x0, 4100]
+.LVL197:
+.LBE143:
+.LBB144:
+	.loc 1 434 0
+#APP
+// 434 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE144:
+	.loc 1 435 0
+	mov	w1, w19
+.LBB145:
+	.loc 1 434 0
+	str	w21, [x0, 32]
+.LBE145:
+	.loc 1 435 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL198:
+	.loc 1 436 0
+	tbz	w0, #31, .L39
+	b	.L40
+	.cfi_endproc
+.LFE269:
+	.size	rk3528_secure_otp_write_2_bytes_noecc, .-rk3528_secure_otp_write_2_bytes_noecc
+	.section	.text.rockchip_secure_otp_ecc_enable,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_ecc_enable, %function
+rockchip_secure_otp_ecc_enable:
+.LFB267:
+	.loc 1 154 0
+	.cfi_startproc
+.LVL199:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	and	w1, w1, 255
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+.LBB160:
+	.loc 1 157 0
+#APP
+// 157 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x2, [x0]
+	mov	w3, 512
+	movk	w3, 0xff00, lsl 16
+	str	w3, [x2, 32]
+.LVL200:
+.LBE160:
+.LBB161:
+	.loc 1 158 0
+#APP
+// 158 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x2, [x0]
+	mov	w3, -65535
+	str	w3, [x2, 36]
+.LVL201:
+.LBE161:
+.LBB162:
+	.loc 1 159 0
+#APP
+// 159 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x2, [x0]
+	mov	w3, 250
+	str	w3, [x2, 4096]
+.LBE162:
+	.loc 1 160 0
+	cbz	w1, .L48
+.LVL202:
+.LBB163:
+	.loc 1 161 0
+#APP
+// 161 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x0]
+.LVL203:
+	str	wzr, [x1, 4100]
+.LVL204:
+.L49:
+.LBE163:
+.LBB164:
+	.loc 1 165 0
+#APP
+// 165 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x0]
+	mov	w2, 65537
+	str	w2, [x1, 32]
+.LBE164:
+	.loc 1 167 0
+	mov	w1, 2
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL205:
+	mov	w19, w0
+.LVL206:
+	.loc 1 168 0
+	tbz	w0, #31, .L47
+.LVL207:
+.LBB165:
+.LBB166:
+	.loc 1 169 0
+	adrp	x1, .LANCHOR2
+	adrp	x0, .LC8
+.LVL208:
+	add	x1, x1, :lo12:.LANCHOR2
+	add	x0, x0, :lo12:.LC8
+	bl	printf
+.LVL209:
+.L47:
+.LBE166:
+.LBE165:
+	.loc 1 172 0
+	mov	w0, w19
+	ldr	x19, [sp, 16]
+.LVL210:
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+.LVL211:
+.L48:
+	.cfi_restore_state
+.LBB167:
+	.loc 1 163 0
+#APP
+// 163 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x0]
+	mov	w2, 9
+	str	w2, [x1, 4100]
+	b	.L49
+.LBE167:
+	.cfi_endproc
+.LFE267:
+	.size	rockchip_secure_otp_ecc_enable, .-rockchip_secure_otp_ecc_enable
+	.section	.text.rk3528_secure_otp_read,"ax",@progbits
+	.align	2
+	.type	rk3528_secure_otp_read, %function
+rk3528_secure_otp_read:
+.LFB268:
+	.loc 1 176 0
+	.cfi_startproc
+.LVL212:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.loc 1 183 0
+	asr	w19, w1, 1
+	.loc 1 176 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	mov	x21, x2
+	stp	x23, x24, [sp, 48]
+	mov	x22, x0
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	mov	w23, w3
+	str	x25, [sp, 64]
+	.cfi_offset 25, -16
+	.loc 1 177 0
+	bl	dev_get_platdata
+.LVL213:
+	mov	x20, x0
+.LVL214:
+	.loc 1 178 0
+	mov	x0, x22
+.LVL215:
+	bl	dev_get_driver_data
+.LVL216:
+	.loc 1 184 0
+	ldr	x4, [x0, 16]
+	.loc 1 178 0
+	mov	x24, x0
+.LVL217:
+	.loc 1 184 0
+	ldr	x1, [x20, 24]
+	mov	w3, w19
+	ldp	x0, x2, [x20, 8]
+.LVL218:
+	blr	x4
+.LVL219:
+	.loc 1 187 0
+	sub	w1, w19, #16
+	sub	w0, w19, #416
+	cmp	w1, 15
+	ccmp	w0, 31, 0, hi
+	bhi	.L53
+	.loc 1 188 0
+	mov	w1, 0
+.L65:
+	.loc 1 190 0
+	mov	x0, x20
+	bl	rockchip_secure_otp_ecc_enable
+.LVL220:
+.LBB168:
+	.loc 1 192 0
+#APP
+// 192 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+	mov	w25, 65537
+.LBE168:
+	.loc 1 181 0
+	mov	w22, 0
+.LVL221:
+.LBB169:
+	.loc 1 192 0
+	str	w25, [x0, 256]
+.LBE169:
+	.loc 1 193 0
+	mov	x0, 50
+	bl	udelay
+.LVL222:
+.L55:
+	.loc 1 194 0
+	cbz	w23, .L60
+	.loc 1 196 0
+	cmp	w19, 447
+	ble	.L56
+	.loc 1 197 0
+	adrp	x0, .LC9
+	mov	w1, w19
+	add	x0, x0, :lo12:.LC9
+.L66:
+	.loc 1 205 0
+	mov	w22, -1
+.LVL223:
+	.loc 1 204 0
+	bl	printf
+.LVL224:
+.L52:
+	.loc 1 235 0
+	mov	w0, w22
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+.LVL225:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL226:
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL227:
+.L53:
+	.cfi_restore_state
+	.loc 1 190 0
+	mov	w1, 1
+	b	.L65
+.LVL228:
+.L56:
+	.loc 1 201 0
+	sub	w0, w19, #192
+	cmp	w0, 31
+	ccmp	w19, 16, 4, hi
+	beq	.L58
+	.loc 1 201 0 is_stmt 0 discriminator 1
+	sub	w0, w19, #416
+	cmp	w0, 15
+	bls	.L58
+	.loc 1 204 0 is_stmt 1
+	adrp	x0, .LC10
+	lsl	w1, w19, 1
+	add	x0, x0, :lo12:.LC10
+	b	.L66
+.L58:
+.LBB170:
+	.loc 1 208 0
+	orr	w1, w19, -65536
+.LVL229:
+#APP
+// 208 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+.LBE170:
+	.loc 1 209 0
+	add	w19, w19, 1
+.LVL230:
+.LBB171:
+	.loc 1 208 0
+	str	w1, [x0, 260]
+.LBE171:
+.LBB172:
+	.loc 1 210 0
+#APP
+// 210 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+.LBE172:
+	.loc 1 212 0
+	mov	w1, 4
+.LVL231:
+.LBB173:
+	.loc 1 210 0
+	str	w25, [x0, 264]
+.LVL232:
+.LBE173:
+	.loc 1 212 0
+	mov	x0, x20
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL233:
+	mov	w22, w0
+.LVL234:
+	.loc 1 213 0
+	tbz	w0, #31, .L59
+	.loc 1 214 0
+	adrp	x1, .LANCHOR3
+	adrp	x0, .LC11
+.LVL235:
+	add	x1, x1, :lo12:.LANCHOR3
+	add	x0, x0, :lo12:.LC11
+	bl	printf
+.LVL236:
+.L60:
+.LBB174:
+	.loc 1 228 0
+#APP
+// 228 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+	mov	w1, 65536
+.LBE174:
+	.loc 1 230 0
+	ldr	x2, [x20, 16]
+	mov	w3, w19
+	ldr	x4, [x24, 24]
+.LBB175:
+	.loc 1 228 0
+	str	w1, [x0, 256]
+.LBE175:
+	.loc 1 230 0
+	ldr	x0, [x20, 8]
+	ldr	x1, [x20, 24]
+	blr	x4
+.LVL237:
+	.loc 1 234 0
+	b	.L52
+.LVL238:
+.L59:
+.LBB176:
+	.loc 1 218 0
+	ldr	x0, [x20]
+.LVL239:
+	ldrh	w0, [x0, 292]
+	and	w0, w0, 65535
+.LVL240:
+#APP
+// 218 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+.LVL241:
+#NO_APP
+.LBE176:
+	.loc 1 220 0
+	strb	w0, [x21]
+	.loc 1 221 0
+	cmp	w23, 1
+	beq	.L60
+.LVL242:
+	.loc 1 222 0
+	lsr	w0, w0, 8
+.LVL243:
+	.loc 1 223 0
+	sub	w23, w23, #2
+.LVL244:
+	.loc 1 222 0
+	strb	w0, [x21, 1]
+	add	x21, x21, 2
+.LVL245:
+	b	.L55
+	.cfi_endproc
+.LFE268:
+	.size	rk3528_secure_otp_read, .-rk3528_secure_otp_read
+	.section	.text.rk3528_secure_otp_write,"ax",@progbits
+	.align	2
+	.type	rk3528_secure_otp_write, %function
+rk3528_secure_otp_write:
+.LFB272:
+	.loc 1 621 0
+	.cfi_startproc
+.LVL246:
+	stp	x29, x30, [sp, -144]!
+	.cfi_def_cfa_offset 144
+	.cfi_offset 29, -144
+	.cfi_offset 30, -136
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -128
+	.cfi_offset 20, -120
+	mov	w20, w1
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -112
+	.cfi_offset 22, -104
+	mov	w21, w3
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -96
+	.cfi_offset 24, -88
+	mov	x24, x0
+	stp	x27, x28, [sp, 80]
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 27, -64
+	.cfi_offset 28, -56
+	.cfi_offset 25, -80
+	.cfi_offset 26, -72
+	.loc 1 621 0
+	str	x2, [x29, 112]
+	.loc 1 622 0
+	bl	dev_get_platdata
+.LVL247:
+	mov	x28, x0
+.LVL248:
+	.loc 1 625 0
+	sxtw	x0, w21
+.LVL249:
+	bl	malloc_simple
+.LVL250:
+	.loc 1 628 0
+	cbnz	x0, .L68
+.LVL251:
+.L115:
+	.loc 1 643 0
+	mov	w27, -1
+.LVL252:
+.L67:
+	.loc 1 669 0
+	mov	w0, w27
+	ldp	x19, x20, [sp, 16]
+.LVL253:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL254:
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+.LVL255:
+	ldp	x29, x30, [sp], 144
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 27
+	.cfi_restore 28
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+.LVL256:
+	ret
+.LVL257:
+.L68:
+	.cfi_restore_state
+	mov	x19, x0
+	.loc 1 631 0
+	sub	w0, w20, #384
+.LVL258:
+	cmp	w0, 63
+	bls	.L70
+.LVL259:
+.L77:
+	.loc 1 649 0
+	sub	w1, w20, #832
+	sub	w0, w20, #32
+	cmp	w1, 63
+	ccmp	w0, 31, 0, hi
+	bls	.L71
+	.loc 1 659 0
+	mov	w0, 2
+.LBB244:
+.LBB245:
+	.loc 1 607 0
+	adrp	x19, .LANCHOR4
+.LVL260:
+	add	x19, x19, :lo12:.LANCHOR4
+.LBE245:
+.LBE244:
+	.loc 1 659 0
+	mov	x23, 0
+	sdiv	w0, w21, w0
+	str	w0, [x29, 108]
+.LVL261:
+.L78:
+	.loc 1 659 0 is_stmt 0 discriminator 1
+	ldr	w0, [x29, 108]
+	cmp	w0, w23
+	ble	.L97
+	.loc 1 660 0 is_stmt 1
+	ldr	x0, [x29, 112]
+	add	w21, w20, w23, lsl 1
+.LBB324:
+.LBB320:
+	.loc 1 477 0
+	asr	w25, w21, 1
+.LBE320:
+.LBE324:
+	.loc 1 660 0
+	ldrh	w26, [x0, x23, lsl 1]
+.LVL262:
+.LBB325:
+.LBB321:
+	.loc 1 475 0
+	mov	x0, x24
+	bl	dev_get_driver_data
+.LVL263:
+	str	x0, [x29, 120]
+.LVL264:
+	.loc 1 478 0
+	cmp	w25, 447
+	bgt	.L99
+	.loc 1 482 0
+	sub	w0, w25, #192
+.LVL265:
+	cmp	w0, 31
+	bls	.L85
+	.loc 1 485 0
+	adrp	x0, .LC4
+	and	w1, w21, -2
+	add	x0, x0, :lo12:.LC4
+	bl	printf
+.LVL266:
+.L99:
+	.loc 1 478 0
+	mov	w27, -1
+	b	.L84
+.LVL267:
+.L70:
+.LBE321:
+.LBE325:
+	.loc 1 633 0
+	mov	w3, w21
+	mov	x2, x19
+	mov	w1, w20
+	mov	x0, x24
+	bl	rk3528_secure_otp_read
+.LVL268:
+	.loc 1 634 0
+	cbnz	w0, .L115
+	mov	x0, 0
+.LVL269:
+.L75:
+	.loc 1 639 0 discriminator 1
+	cmp	w21, w0
+	ble	.L77
+	add	x0, x0, 1
+.LVL270:
+	.loc 1 640 0
+	add	x1, x19, x0
+	ldrb	w1, [x1, -1]
+	cbz	w1, .L75
+	.loc 1 641 0
+	adrp	x0, .LC12
+	add	x0, x0, :lo12:.LC12
+	bl	printf
+.LVL271:
+	b	.L115
+.LVL272:
+.L83:
+.LBB326:
+.LBB327:
+	.loc 1 455 0
+	adds	w25, w20, w19
+.LBE327:
+.LBE326:
+	.loc 1 652 0
+	ldr	x0, [x29, 112]
+.LBB332:
+.LBB328:
+	.loc 1 455 0
+	and	w26, w25, 1
+	mov	w3, 2
+	csneg	w22, w26, w26, pl
+	add	x2, x29, 142
+	sub	w22, w25, w22
+.LBE328:
+.LBE332:
+	.loc 1 652 0
+	ldrb	w23, [x0, x19]
+.LVL273:
+.LBB333:
+.LBB329:
+	.loc 1 455 0
+	mov	w1, w22
+	mov	x0, x24
+	bl	rk3528_secure_otp_read
+.LVL274:
+	.loc 1 456 0
+	cbnz	w0, .L79
+	ldrh	w3, [x29, 142]
+	.loc 1 459 0
+	cbnz	w26, .L80
+.LVL275:
+	.loc 1 461 0
+	bic	w3, w23, w3
+	mov	w2, w25
+.LVL276:
+.L112:
+	.loc 1 464 0
+	mov	x1, x28
+	mov	x0, x24
+.LVL277:
+	add	x19, x19, 1
+.LVL278:
+	bl	rk3528_secure_otp_write_2_bytes_noecc
+.LVL279:
+	mov	w27, w0
+.LVL280:
+.LBE329:
+.LBE333:
+	.loc 1 653 0
+	cbz	w0, .L82
+.L98:
+	.loc 1 654 0
+	adrp	x0, .LC13
+	add	x0, x0, :lo12:.LC13
+.LVL281:
+.L114:
+	.loc 1 662 0
+	bl	printf
+.LVL282:
+	.loc 1 663 0
+	b	.L67
+.LVL283:
+.L80:
+.LBB334:
+.LBB330:
+	.loc 1 463 0
+	lsl	w23, w23, 8
+.LVL284:
+	.loc 1 464 0
+	mov	w2, w22
+	bic	w3, w23, w3
+	b	.L112
+.LVL285:
+.L71:
+.LBE330:
+.LBE334:
+	mov	x19, 0
+.LVL286:
+.L82:
+	.loc 1 651 0 discriminator 1
+	cmp	w21, w19
+	bgt	.L83
+.LVL287:
+.L97:
+	.loc 1 629 0
+	mov	w27, 0
+	b	.L67
+.LVL288:
+.L85:
+.LBB335:
+.LBB322:
+	.loc 1 489 0
+	cbz	w26, .L86
+	.loc 1 492 0
+	ldr	x0, [x29, 120]
+	mov	w3, w25
+	ldp	x2, x1, [x28, 16]
+	ldr	x5, [x0, 16]
+	ldr	x0, [x28, 8]
+	blr	x5
+.LVL289:
+.LBB246:
+	.loc 1 495 0
+#APP
+// 495 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 65536
+	str	w1, [x0, 256]
+.LVL290:
+.LBE246:
+.LBB247:
+	.loc 1 496 0
+#APP
+// 496 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 262148
+	str	w1, [x0, 32]
+.LVL291:
+.LBE247:
+.LBB248:
+	.loc 1 497 0
+#APP
+// 497 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65536
+	str	w1, [x0, 40]
+.LVL292:
+.LBE248:
+.LBB249:
+	.loc 1 498 0
+#APP
+// 498 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL293:
+.LBE249:
+.LBB250:
+	.loc 1 499 0
+#APP
+// 499 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65522
+	str	w1, [x0, 36]
+.LVL294:
+.LBE250:
+.LBB251:
+	.loc 1 500 0
+#APP
+// 500 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w3, 240
+	str	w3, [x29, 100]
+.LVL295:
+	str	w3, [x0, 4096]
+.LBE251:
+.LBB252:
+	.loc 1 501 0
+#APP
+// 501 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL296:
+.LBE252:
+.LBB253:
+	.loc 1 502 0
+#APP
+// 502 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w2, 122
+	str	w2, [x29, 104]
+.LVL297:
+	str	w2, [x0, 4104]
+.LBE253:
+.LBB254:
+	.loc 1 503 0
+#APP
+// 503 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 37
+	str	w1, [x0, 4108]
+.LVL298:
+.LBE254:
+.LBB255:
+	.loc 1 504 0
+#APP
+// 504 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4112]
+.LVL299:
+.LBE255:
+.LBB256:
+	.loc 1 505 0
+#APP
+// 505 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4116]
+.LVL300:
+.LBE256:
+.LBB257:
+	.loc 1 506 0
+#APP
+// 506 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4120]
+.LVL301:
+.LBE257:
+.LBB258:
+	.loc 1 507 0
+#APP
+// 507 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 31
+	str	w1, [x0, 4124]
+.LVL302:
+.LBE258:
+.LBB259:
+	.loc 1 508 0
+#APP
+// 508 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 11
+	str	w1, [x0, 4128]
+.LVL303:
+.LBE259:
+.LBB260:
+	.loc 1 509 0
+#APP
+// 509 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 8
+	str	w1, [x0, 4132]
+.LVL304:
+.LBE260:
+.LBB261:
+	.loc 1 510 0
+#APP
+// 510 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4136]
+.LVL305:
+.LBE261:
+.LBB262:
+	.loc 1 511 0
+#APP
+// 511 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4140]
+.LVL306:
+.LBE262:
+.LBB263:
+	.loc 1 512 0
+#APP
+// 512 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4144]
+.LVL307:
+.LBE263:
+.LBB264:
+	.loc 1 513 0
+#APP
+// 513 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE264:
+.LBB265:
+	.loc 1 514 0
+	ubfx	x21, x21, 9, 8
+.LVL308:
+.LBE265:
+.LBB266:
+	.loc 1 513 0
+	str	w25, [x0, 4148]
+.LBE266:
+.LBB267:
+	.loc 1 514 0
+#APP
+// 514 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w21, [x0, 4152]
+.LVL309:
+.LBE267:
+.LBB268:
+	.loc 1 515 0
+#APP
+// 515 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w22, 65537
+.LBE268:
+	.loc 1 516 0
+	mov	w1, 2
+.LBB269:
+	.loc 1 515 0
+	str	w22, [x0, 32]
+.LBE269:
+	.loc 1 516 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL310:
+	mov	w27, w0
+.LVL311:
+	.loc 1 517 0
+	ldp	w3, w2, [x29, 100]
+	tbz	w0, #31, .L87
+	.loc 1 518 0
+	adrp	x0, .LC5
+.LVL312:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC5
+.LVL313:
+.L113:
+	.loc 1 607 0
+	bl	printf
+.LVL314:
+.L88:
+.LBB270:
+	.loc 1 612 0
+#APP
+// 612 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65533
+.LBE270:
+	.loc 1 613 0
+	ldr	x2, [x28, 16]
+	mov	w3, w25
+.LBB271:
+	.loc 1 612 0
+	str	w1, [x0, 772]
+.LBE271:
+	.loc 1 613 0
+	ldr	x0, [x29, 120]
+	ldr	x1, [x28, 24]
+	ldr	x6, [x0, 24]
+	ldr	x0, [x28, 8]
+	blr	x6
+.LVL315:
+.LBE322:
+.LBE335:
+	.loc 1 661 0
+	cbz	w27, .L86
+.LVL316:
+.L84:
+	.loc 1 662 0
+	adrp	x0, .LC20
+	add	x0, x0, :lo12:.LC20
+	b	.L114
+.LVL317:
+.L87:
+.LBB336:
+.LBB323:
+.LBB272:
+	.loc 1 522 0
+#APP
+// 522 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL318:
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL319:
+.LBE272:
+.LBB273:
+	.loc 1 523 0
+#APP
+// 523 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w3, [x0, 4096]
+.LVL320:
+.LBE273:
+.LBB274:
+	.loc 1 524 0
+#APP
+// 524 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL321:
+.LBE274:
+.LBB275:
+	.loc 1 525 0
+#APP
+// 525 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w2, [x0, 4104]
+.LVL322:
+.LBE275:
+.LBB276:
+	.loc 1 526 0
+#APP
+// 526 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 21
+	str	w1, [x0, 4108]
+.LVL323:
+.LBE276:
+.LBB277:
+	.loc 1 527 0
+#APP
+// 527 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 220
+	str	w1, [x0, 4112]
+.LVL324:
+.LBE277:
+.LBB278:
+	.loc 1 528 0
+#APP
+// 528 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 146
+	str	w1, [x0, 4116]
+.LVL325:
+.LBE278:
+.LBB279:
+	.loc 1 529 0
+#APP
+// 529 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 121
+	str	w1, [x0, 4120]
+.LVL326:
+.LBE279:
+.LBB280:
+	.loc 1 530 0
+#APP
+// 530 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 129
+	str	w1, [x0, 4124]
+.LVL327:
+.LBE280:
+.LBB281:
+	.loc 1 531 0
+#APP
+// 531 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 126
+	str	w1, [x0, 4128]
+.LVL328:
+.LBE281:
+.LBB282:
+	.loc 1 532 0
+#APP
+// 532 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 33
+	str	w1, [x0, 4132]
+.LVL329:
+.LBE282:
+.LBB283:
+	.loc 1 533 0
+#APP
+// 533 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 17
+	str	w1, [x0, 4136]
+.LVL330:
+.LBE283:
+.LBB284:
+	.loc 1 534 0
+#APP
+// 534 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 157
+	str	w1, [x0, 4140]
+.LVL331:
+.LBE284:
+.LBB285:
+	.loc 1 535 0
+#APP
+// 535 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w21, 2
+.LVL332:
+	str	w21, [x0, 4144]
+.LVL333:
+.LBE285:
+.LBB286:
+	.loc 1 536 0
+#APP
+// 536 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4148]
+.LVL334:
+.LBE286:
+.LBB287:
+	.loc 1 537 0
+#APP
+// 537 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4152]
+.LVL335:
+.LBE287:
+.LBB288:
+	.loc 1 538 0
+#APP
+// 538 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE288:
+	.loc 1 539 0
+	mov	w1, w21
+.LBB289:
+	.loc 1 538 0
+	str	w22, [x0, 32]
+.LBE289:
+	.loc 1 539 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL336:
+	mov	w27, w0
+.LVL337:
+	.loc 1 540 0
+	tbz	w0, #31, .L89
+	.loc 1 541 0
+	adrp	x0, .LC14
+.LVL338:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC14
+	b	.L113
+.LVL339:
+.L89:
+.LBB290:
+	.loc 1 545 0
+#APP
+// 545 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL340:
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL341:
+.LBE290:
+.LBB291:
+	.loc 1 546 0
+#APP
+// 546 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL342:
+.LBE291:
+.LBB292:
+	.loc 1 547 0
+#APP
+// 547 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 251
+	str	w1, [x0, 4096]
+.LVL343:
+.LBE292:
+.LBB293:
+	.loc 1 548 0
+#APP
+// 548 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4100]
+.LVL344:
+.LBE293:
+.LBB294:
+	.loc 1 549 0
+#APP
+// 549 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE294:
+	.loc 1 550 0
+	mov	w1, w21
+.LBB295:
+	.loc 1 549 0
+	str	w22, [x0, 32]
+.LBE295:
+	.loc 1 550 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL345:
+	mov	w27, w0
+.LVL346:
+	.loc 1 551 0
+	tbz	w0, #31, .L90
+	.loc 1 552 0
+	adrp	x0, .LC15
+.LVL347:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC15
+	b	.L113
+.LVL348:
+.L90:
+.LBB296:
+	.loc 1 556 0
+#APP
+// 556 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL349:
+	mov	w1, -65534
+	str	w1, [x0, 36]
+.LVL350:
+.LBE296:
+.LBB297:
+	.loc 1 557 0
+#APP
+// 557 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 192
+	str	w1, [x0, 4096]
+.LBE297:
+.LBB298:
+	.loc 1 558 0
+	and	w1, w26, 255
+.LVL351:
+#APP
+// 558 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE298:
+.LBB299:
+	.loc 1 559 0
+	lsr	w26, w26, 8
+.LVL352:
+.LBE299:
+.LBB300:
+	.loc 1 558 0
+	str	w1, [x0, 4100]
+.LBE300:
+.LBB301:
+	.loc 1 559 0
+#APP
+// 559 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w26, [x0, 4104]
+.LVL353:
+.LBE301:
+.LBB302:
+	.loc 1 560 0
+#APP
+// 560 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE302:
+	.loc 1 561 0
+	mov	w1, w21
+.LVL354:
+.LBB303:
+	.loc 1 560 0
+	str	w22, [x0, 32]
+.LBE303:
+	.loc 1 561 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL355:
+	mov	w27, w0
+.LVL356:
+	.loc 1 562 0
+	tbz	w0, #31, .L91
+	.loc 1 563 0
+	adrp	x0, .LC16
+.LVL357:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC16
+	b	.L113
+.LVL358:
+.L91:
+.LBB304:
+	.loc 1 567 0
+#APP
+// 567 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL359:
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL360:
+.LBE304:
+.LBB305:
+	.loc 1 568 0
+#APP
+// 568 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL361:
+.LBE305:
+.LBB306:
+	.loc 1 569 0
+#APP
+// 569 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 255
+	str	w1, [x0, 4096]
+.LVL362:
+.LBE306:
+.LBB307:
+	.loc 1 570 0
+#APP
+// 570 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 10
+	str	w1, [x0, 4100]
+.LVL363:
+.LBE307:
+.LBB308:
+	.loc 1 571 0
+#APP
+// 571 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE308:
+	.loc 1 572 0
+	mov	w1, w21
+.LBB309:
+	.loc 1 571 0
+	str	w22, [x0, 32]
+.LBE309:
+	.loc 1 572 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL364:
+	mov	w27, w0
+.LVL365:
+	.loc 1 573 0
+	tbz	w0, #31, .L92
+	.loc 1 574 0
+	adrp	x0, .LC17
+.LVL366:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC17
+	b	.L113
+.LVL367:
+.L92:
+.LBB310:
+	.loc 1 578 0
+#APP
+// 578 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL368:
+	mov	w1, -65534
+	str	w1, [x0, 36]
+.LVL369:
+.LBE310:
+.LBB311:
+	.loc 1 579 0
+#APP
+// 579 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 1
+	str	w1, [x0, 4096]
+.LVL370:
+.LBE311:
+.LBB312:
+	.loc 1 580 0
+#APP
+// 580 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 191
+	str	w1, [x0, 4100]
+.LVL371:
+.LBE312:
+.LBB313:
+	.loc 1 581 0
+#APP
+// 581 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4104]
+.LVL372:
+.LBE313:
+.LBB314:
+	.loc 1 582 0
+#APP
+// 582 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE314:
+	.loc 1 583 0
+	mov	w1, w21
+.LBB315:
+	.loc 1 582 0
+	str	w22, [x0, 32]
+.LBE315:
+	.loc 1 583 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL373:
+	mov	w27, w0
+.LVL374:
+	.loc 1 584 0
+	tbz	w0, #31, .L93
+	.loc 1 585 0
+	adrp	x0, .LC18
+.LVL375:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC18
+	b	.L113
+.LVL376:
+.L93:
+	.loc 1 589 0
+	mov	x0, x28
+.LVL377:
+	bl	rockchip_secure_otp_check_flag.isra.0
+.LVL378:
+	mov	w27, w0
+.LVL379:
+	.loc 1 590 0
+	tbz	w0, #31, .L94
+	.loc 1 591 0
+	adrp	x0, .LC6
+.LVL380:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC6
+	b	.L113
+.LVL381:
+.L94:
+.LBB316:
+	.loc 1 595 0
+#APP
+// 595 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL382:
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL383:
+.LBE316:
+.LBB317:
+	.loc 1 596 0
+#APP
+// 596 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 2
+	str	w1, [x0, 4096]
+.LVL384:
+.LBE317:
+.LBB318:
+	.loc 1 597 0
+#APP
+// 597 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w2, 191
+	str	w2, [x0, 4100]
+.LVL385:
+.LBE318:
+.LBB319:
+	.loc 1 598 0
+#APP
+// 598 "drivers/misc/rk3528-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w2, 65537
+	str	w2, [x0, 32]
+.LBE319:
+	.loc 1 599 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL386:
+	mov	w27, w0
+.LVL387:
+	.loc 1 600 0
+	tbz	w0, #31, .L95
+	.loc 1 601 0
+	adrp	x0, .LC19
+.LVL388:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC19
+	b	.L113
+.LVL389:
+.L95:
+	.loc 1 605 0
+	mov	x0, x28
+.LVL390:
+	bl	rockchip_secure_otp_wait_flag.isra.1
+.LVL391:
+	mov	w27, w0
+.LVL392:
+	.loc 1 606 0
+	tbz	w0, #31, .L88
+	.loc 1 607 0
+	adrp	x0, .LC7
+.LVL393:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC7
+	b	.L113
+.LVL394:
+.L86:
+	add	x23, x23, 1
+.LVL395:
+	b	.L78
+.LVL396:
+.L79:
+.LBE323:
+.LBE336:
+.LBB337:
+.LBB331:
+	.loc 1 457 0
+	mov	w27, -1
+	b	.L98
+.LBE331:
+.LBE337:
+	.cfi_endproc
+.LFE272:
+	.size	rk3528_secure_otp_write, .-rk3528_secure_otp_write
+	.global	_u_boot_list_2_driver_2_rockchip_secure_otp
+	.section	.rodata.__func__.7575,"a",@progbits
+	.align	3
+	.set	.LANCHOR0,. + 0
+	.type	__func__.7575, %object
+	.size	__func__.7575, 32
+__func__.7575:
+	.string	"rockchip_secure_otp_wait_status"
+	.section	.rodata.__func__.7618,"a",@progbits
+	.align	3
+	.set	.LANCHOR2,. + 0
+	.type	__func__.7618, %object
+	.size	__func__.7618, 31
+__func__.7618:
+	.string	"rockchip_secure_otp_ecc_enable"
+	.section	.rodata.__func__.7636,"a",@progbits
+	.align	3
+	.set	.LANCHOR3,. + 0
+	.type	__func__.7636, %object
+	.size	__func__.7636, 23
+__func__.7636:
+	.string	"rk3528_secure_otp_read"
+	.section	.rodata.__func__.7671,"a",@progbits
+	.align	3
+	.set	.LANCHOR1,. + 0
+	.type	__func__.7671, %object
+	.size	__func__.7671, 38
+__func__.7671:
+	.string	"rk3528_secure_otp_write_2_bytes_noecc"
+	.section	.rodata.__func__.7892,"a",@progbits
+	.align	3
+	.set	.LANCHOR4,. + 0
+	.type	__func__.7892, %object
+	.size	__func__.7892, 32
+__func__.7892:
+	.string	"rk3528_secure_otp_write_2_bytes"
+	.section	.rodata.rk3528_data,"a",@progbits
+	.align	3
+	.type	rk3528_data, %object
+	.size	rk3528_data, 32
+rk3528_data:
+	.xword	rk3528_secure_otp_read
+	.xword	rk3528_secure_otp_write
+	.xword	rk3528_spl_rockchip_otp_start
+	.xword	rk3528_spl_rockchip_otp_stop
+	.section	.rodata.rk3528_secure_otp_read.str1.1,"aMS",@progbits,1
+.LC9:
+	.string	"do not access non secure area, half word offset = %d\n"
+.LC10:
+	.string	"Please input correct addr, offset(bytes) is 0x%x\n"
+.LC11:
+	.string	"%s timeout during read setup\n"
+	.section	.rodata.rk3528_secure_otp_write.str1.1,"aMS",@progbits,1
+.LC12:
+	.string	"The zone is written.\n"
+.LC13:
+	.string	"rk3528_secure_otp_write_byte_noecc error\n"
+.LC14:
+	.string	"%s timeout during write setup 2\n"
+.LC15:
+	.string	"%s timeout during write setup 3\n"
+.LC16:
+	.string	"%s timeout during write setup 4\n"
+.LC17:
+	.string	"%s timeout during write setup 5\n"
+.LC18:
+	.string	"%s timeout during write setup 6\n"
+.LC19:
+	.string	"%s timeout during write setup 8\n"
+.LC20:
+	.string	"rk3528_secure_otp_write_2_bytes error\n"
+	.section	.rodata.rk3528_secure_otp_write_2_bytes_noecc.str1.1,"aMS",@progbits,1
+.LC4:
+	.string	"Please input correct addr, offset is 0x%x\n"
+.LC5:
+	.string	"%s timeout during write setup 1\n"
+.LC6:
+	.string	"%s timeout during write setup 7\n"
+.LC7:
+	.string	"%s timeout during write setup 9\n"
+	.section	.rodata.rockchip_otp_ids,"a",@progbits
+	.align	3
+	.type	rockchip_otp_ids, %object
+	.size	rockchip_otp_ids, 32
+rockchip_otp_ids:
+	.xword	.LC22
+	.xword	rk3528_data
+	.zero	16
+	.section	.rodata.rockchip_secure_otp_ecc_enable.str1.1,"aMS",@progbits,1
+.LC8:
+	.string	"%s timeout during ecc_enable\n"
+	.section	.rodata.rockchip_secure_otp_ofdata_to_platdata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"secure_conf"
+.LC1:
+	.string	"mask_addr"
+.LC2:
+	.string	"cru_rst_addr"
+	.section	.rodata.rockchip_secure_otp_ops,"a",@progbits
+	.align	3
+	.type	rockchip_secure_otp_ops, %object
+	.size	rockchip_secure_otp_ops, 32
+rockchip_secure_otp_ops:
+	.xword	secure_otp_read
+	.xword	secure_otp_write
+	.xword	secure_otp_ioctl
+	.zero	8
+	.section	.rodata.rockchip_secure_otp_wait_status.isra.2.str1.1,"aMS",@progbits,1
+.LC3:
+	.string	"%s: wait init status timeout\n"
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC21:
+	.string	"rockchip_secure_otp"
+.LC22:
+	.string	"rockchip,rk3528-secure-otp"
+	.section	.u_boot_list_2_driver_2_rockchip_secure_otp,"aw",@progbits
+	.align	2
+	.type	_u_boot_list_2_driver_2_rockchip_secure_otp, %object
+	.size	_u_boot_list_2_driver_2_rockchip_secure_otp, 120
+_u_boot_list_2_driver_2_rockchip_secure_otp:
+	.8byte	.LC21
+	.word	36
+	.zero	4
+	.8byte	rockchip_otp_ids
+	.zero	32
+	.8byte	rockchip_secure_otp_ofdata_to_platdata
+	.zero	28
+	.word	32
+	.zero	8
+	.8byte	rockchip_secure_otp_ops
+	.zero	8
+	.text
+.Letext0:
+	.file 2 "include/common.h"
+	.file 3 "./arch/arm/include/asm/types.h"
+	.file 4 "include/linux/types.h"
+	.file 5 "include/errno.h"
+	.file 6 "include/linux/string.h"
+	.file 7 "include/efi.h"
+	.file 8 "include/dm/device.h"
+	.file 9 "include/ide.h"
+	.file 10 "include/linux/list.h"
+	.file 11 "include/part.h"
+	.file 12 "include/flash.h"
+	.file 13 "include/lmb.h"
+	.file 14 "include/asm-generic/u-boot.h"
+	.file 15 "./arch/arm/include/asm/u-boot-arm.h"
+	.file 16 "include/linux/libfdt_env.h"
+	.file 17 "include/linux/../../scripts/dtc/libfdt/fdt.h"
+	.file 18 "include/linux/libfdt.h"
+	.file 19 "include/image.h"
+	.file 20 "./arch/arm/include/asm/global_data.h"
+	.file 21 "include/asm-generic/global_data.h"
+	.file 22 "include/dm/of.h"
+	.file 23 "include/net.h"
+	.file 24 "include/dm/uclass-id.h"
+	.file 25 "include/dm/ofnode.h"
+	.file 26 "include/malloc.h"
+	.file 27 "include/linux/compat.h"
+	.file 28 "include/dm/uclass.h"
+	.file 29 "include/asm-generic/ioctl.h"
+	.file 30 "include/misc.h"
+	.file 31 "include/rockchip-otp.h"
+	.file 32 "include/dm/read.h"
+	.file 33 "include/stdio.h"
+	.file 34 "include/linux/delay.h"
+	.file 35 "include/log.h"
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.4byte	0x42d0
+	.2byte	0x4
+	.4byte	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.4byte	.LASF458
+	.byte	0xc
+	.4byte	.LASF459
+	.4byte	.LASF460
+	.4byte	.Ldebug_ranges0+0x6c0
+	.8byte	0
+	.4byte	.Ldebug_line0
+	.uleb128 0x2
+	.4byte	.LASF4
+	.byte	0x2
+	.byte	0xd
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF0
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF1
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x7
+	.4byte	.LASF2
+	.uleb128 0x4
+	.4byte	.LASF21
+	.byte	0x5
+	.byte	0xc
+	.4byte	0x54
+	.uleb128 0x5
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x6
+	.4byte	.LASF3
+	.uleb128 0x2
+	.4byte	.LASF5
+	.byte	0x3
+	.byte	0xc
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x5
+	.4byte	.LASF6
+	.uleb128 0x2
+	.4byte	.LASF7
+	.byte	0x3
+	.byte	0x12
+	.4byte	0x7f
+	.uleb128 0x3
+	.byte	0x4
+	.byte	0x7
+	.4byte	.LASF8
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF9
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF10
+	.uleb128 0x6
+	.string	"u8"
+	.byte	0x3
+	.byte	0x1f
+	.4byte	0x34
+	.uleb128 0x7
+	.4byte	0x94
+	.uleb128 0x6
+	.string	"u16"
+	.byte	0x3
+	.byte	0x22
+	.4byte	0x42
+	.uleb128 0x6
+	.string	"u32"
+	.byte	0x3
+	.byte	0x25
+	.4byte	0x7f
+	.uleb128 0x6
+	.string	"u64"
+	.byte	0x3
+	.byte	0x28
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF11
+	.byte	0x3
+	.byte	0x31
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF12
+	.byte	0x3
+	.byte	0x32
+	.4byte	0x8d
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF13
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xee
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF14
+	.uleb128 0x7
+	.4byte	0xe7
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF15
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe7
+	.uleb128 0x2
+	.4byte	.LASF16
+	.byte	0x4
+	.byte	0x59
+	.4byte	0x42
+	.uleb128 0x2
+	.4byte	.LASF17
+	.byte	0x4
+	.byte	0x5b
+	.4byte	0x3b
+	.uleb128 0x2
+	.4byte	.LASF18
+	.byte	0x4
+	.byte	0x69
+	.4byte	0x62
+	.uleb128 0x2
+	.4byte	.LASF19
+	.byte	0x4
+	.byte	0x6b
+	.4byte	0x74
+	.uleb128 0x2
+	.4byte	.LASF20
+	.byte	0x4
+	.byte	0x97
+	.4byte	0x74
+	.uleb128 0x9
+	.byte	0x8
+	.uleb128 0x4
+	.4byte	.LASF22
+	.byte	0x6
+	.byte	0xb
+	.4byte	0xfa
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x2
+	.4byte	.LASF23
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0x156
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF24
+	.byte	0x7
+	.2byte	0x140
+	.4byte	0x14b
+	.uleb128 0xc
+	.4byte	.LASF25
+	.byte	0x7
+	.2byte	0x143
+	.4byte	0x14b
+	.uleb128 0xc
+	.4byte	.LASF26
+	.byte	0x7
+	.2byte	0x143
+	.4byte	0x14b
+	.uleb128 0xd
+	.4byte	.LASF45
+	.byte	0xa0
+	.byte	0x8
+	.byte	0x83
+	.4byte	0x25f
+	.uleb128 0xe
+	.4byte	.LASF27
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x1397
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x8
+	.byte	0x85
+	.4byte	0xe1
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF29
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x137
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF30
+	.byte	0x8
+	.byte	0x87
+	.4byte	0x137
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF31
+	.byte	0x8
+	.byte	0x88
+	.4byte	0x137
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF32
+	.byte	0x8
+	.byte	0x89
+	.4byte	0x133e
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF33
+	.byte	0x8
+	.byte	0x8a
+	.4byte	0x10b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF34
+	.byte	0x8
+	.byte	0x8b
+	.4byte	0x25f
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF35
+	.byte	0x8
+	.byte	0x8c
+	.4byte	0x137
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF36
+	.byte	0x8
+	.byte	0x8d
+	.4byte	0x13e6
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF37
+	.byte	0x8
+	.byte	0x8e
+	.4byte	0x137
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF38
+	.byte	0x8
+	.byte	0x8f
+	.4byte	0x137
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF39
+	.byte	0x8
+	.byte	0x90
+	.4byte	0x292
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF40
+	.byte	0x8
+	.byte	0x91
+	.4byte	0x292
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF41
+	.byte	0x8
+	.byte	0x92
+	.4byte	0x292
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF42
+	.byte	0x8
+	.byte	0x93
+	.4byte	0x121
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF43
+	.byte	0x8
+	.byte	0x94
+	.4byte	0x54
+	.byte	0x94
+	.uleb128 0xf
+	.string	"seq"
+	.byte	0x8
+	.byte	0x95
+	.4byte	0x54
+	.byte	0x98
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x17a
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x26b
+	.uleb128 0x10
+	.uleb128 0xa
+	.4byte	0x10b
+	.4byte	0x277
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF44
+	.byte	0x9
+	.byte	0x10
+	.4byte	0x26c
+	.uleb128 0xa
+	.4byte	0x34
+	.4byte	0x292
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x5
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF46
+	.byte	0x10
+	.byte	0xa
+	.byte	0x16
+	.4byte	0x2b7
+	.uleb128 0xe
+	.4byte	.LASF47
+	.byte	0xa
+	.byte	0x17
+	.4byte	0x2b7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF48
+	.byte	0xa
+	.byte	0x17
+	.4byte	0x2b7
+	.byte	0x8
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x292
+	.uleb128 0xd
+	.4byte	.LASF49
+	.byte	0x10
+	.byte	0xb
+	.byte	0xf
+	.4byte	0x2e2
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0xb
+	.byte	0x10
+	.4byte	0xfa
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF50
+	.byte	0xb
+	.byte	0x11
+	.4byte	0x2fb
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x2bd
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x2fb
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x2e7
+	.uleb128 0xa
+	.4byte	0x2e2
+	.4byte	0x30c
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x301
+	.uleb128 0x4
+	.4byte	.LASF49
+	.byte	0xb
+	.byte	0xe1
+	.4byte	0x30c
+	.uleb128 0x14
+	.2byte	0x1220
+	.byte	0xc
+	.byte	0x13
+	.4byte	0x370
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xc
+	.byte	0x14
+	.4byte	0x10b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF52
+	.byte	0xc
+	.byte	0x15
+	.4byte	0x100
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF53
+	.byte	0xc
+	.byte	0x16
+	.4byte	0x10b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF54
+	.byte	0xc
+	.byte	0x17
+	.4byte	0x370
+	.byte	0x18
+	.uleb128 0x15
+	.4byte	.LASF55
+	.byte	0xc
+	.byte	0x18
+	.4byte	0x381
+	.2byte	0x1018
+	.uleb128 0x16
+	.string	"mtd"
+	.byte	0xc
+	.byte	0x31
+	.4byte	0x397
+	.2byte	0x1218
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x10b
+	.4byte	0x381
+	.uleb128 0x17
+	.4byte	0xda
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x29
+	.4byte	0x392
+	.uleb128 0x17
+	.4byte	0xda
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0x18
+	.4byte	.LASF317
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x392
+	.uleb128 0x2
+	.4byte	.LASF56
+	.byte	0xc
+	.byte	0x37
+	.4byte	0x31c
+	.uleb128 0xa
+	.4byte	0x39d
+	.4byte	0x3b3
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF57
+	.byte	0xc
+	.byte	0x39
+	.4byte	0x3a8
+	.uleb128 0x3
+	.byte	0x10
+	.byte	0x4
+	.4byte	.LASF58
+	.uleb128 0xd
+	.4byte	.LASF59
+	.byte	0x10
+	.byte	0xd
+	.byte	0x10
+	.4byte	0x3ea
+	.uleb128 0xe
+	.4byte	.LASF60
+	.byte	0xd
+	.byte	0x11
+	.4byte	0xc4
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xd
+	.byte	0x12
+	.4byte	0xcf
+	.byte	0x8
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF61
+	.2byte	0x120
+	.byte	0xd
+	.byte	0x15
+	.4byte	0x41c
+	.uleb128 0xf
+	.string	"cnt"
+	.byte	0xd
+	.byte	0x16
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xd
+	.byte	0x17
+	.4byte	0xcf
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF62
+	.byte	0xd
+	.byte	0x18
+	.4byte	0x41c
+	.byte	0x10
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x3c5
+	.4byte	0x42c
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x10
+	.byte	0
+	.uleb128 0x1a
+	.string	"lmb"
+	.2byte	0x240
+	.byte	0xd
+	.byte	0x1b
+	.4byte	0x453
+	.uleb128 0xe
+	.4byte	.LASF63
+	.byte	0xd
+	.byte	0x1c
+	.4byte	0x3ea
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF64
+	.byte	0xd
+	.byte	0x1d
+	.4byte	0x3ea
+	.2byte	0x120
+	.byte	0
+	.uleb128 0x1b
+	.string	"lmb"
+	.byte	0xd
+	.byte	0x20
+	.4byte	0x42c
+	.uleb128 0x1c
+	.byte	0x10
+	.byte	0xe
+	.byte	0x5d
+	.4byte	0x47f
+	.uleb128 0xe
+	.4byte	.LASF54
+	.byte	0xe
+	.byte	0x5e
+	.4byte	0xb9
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xe
+	.byte	0x5f
+	.4byte	0xb9
+	.byte	0x8
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF65
+	.byte	0xb0
+	.byte	0xe
+	.byte	0x1b
+	.4byte	0x57c
+	.uleb128 0xe
+	.4byte	.LASF66
+	.byte	0xe
+	.byte	0x1c
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF67
+	.byte	0xe
+	.byte	0x1d
+	.4byte	0xcf
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF68
+	.byte	0xe
+	.byte	0x1e
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF69
+	.byte	0xe
+	.byte	0x1f
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF70
+	.byte	0xe
+	.byte	0x20
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF71
+	.byte	0xe
+	.byte	0x21
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF72
+	.byte	0xe
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF73
+	.byte	0xe
+	.byte	0x24
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF74
+	.byte	0xe
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF75
+	.byte	0xe
+	.byte	0x26
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF76
+	.byte	0xe
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF77
+	.byte	0xe
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF78
+	.byte	0xe
+	.byte	0x33
+	.4byte	0x282
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF79
+	.byte	0xe
+	.byte	0x34
+	.4byte	0x42
+	.byte	0x66
+	.uleb128 0xe
+	.4byte	.LASF80
+	.byte	0xe
+	.byte	0x35
+	.4byte	0x3b
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF81
+	.byte	0xe
+	.byte	0x36
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF82
+	.byte	0xe
+	.byte	0x57
+	.4byte	0x10b
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF83
+	.byte	0xe
+	.byte	0x58
+	.4byte	0x10b
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF84
+	.byte	0xe
+	.byte	0x5b
+	.4byte	0x7f
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF85
+	.byte	0xe
+	.byte	0x60
+	.4byte	0x57c
+	.byte	0x90
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x45e
+	.4byte	0x58c
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF86
+	.byte	0xe
+	.byte	0x62
+	.4byte	0x47f
+	.uleb128 0x4
+	.4byte	.LASF87
+	.byte	0xf
+	.byte	0x13
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF88
+	.byte	0xf
+	.byte	0x14
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF89
+	.byte	0xf
+	.byte	0x15
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF90
+	.byte	0xf
+	.byte	0x16
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF91
+	.byte	0xf
+	.byte	0x17
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF92
+	.byte	0xf
+	.byte	0x18
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF93
+	.byte	0xf
+	.byte	0x19
+	.4byte	0x10b
+	.uleb128 0x2
+	.4byte	.LASF94
+	.byte	0x10
+	.byte	0x11
+	.4byte	0x12c
+	.uleb128 0xd
+	.4byte	.LASF95
+	.byte	0x28
+	.byte	0x11
+	.byte	0x39
+	.4byte	0x674
+	.uleb128 0xe
+	.4byte	.LASF96
+	.byte	0x11
+	.byte	0x3a
+	.4byte	0x5e4
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF97
+	.byte	0x11
+	.byte	0x3b
+	.4byte	0x5e4
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF98
+	.byte	0x11
+	.byte	0x3c
+	.4byte	0x5e4
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF99
+	.byte	0x11
+	.byte	0x3d
+	.4byte	0x5e4
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF100
+	.byte	0x11
+	.byte	0x3e
+	.4byte	0x5e4
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF101
+	.byte	0x11
+	.byte	0x3f
+	.4byte	0x5e4
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF102
+	.byte	0x11
+	.byte	0x40
+	.4byte	0x5e4
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF103
+	.byte	0x11
+	.byte	0x43
+	.4byte	0x5e4
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF104
+	.byte	0x11
+	.byte	0x46
+	.4byte	0x5e4
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF105
+	.byte	0x11
+	.byte	0x49
+	.4byte	0x5e4
+	.byte	0x24
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF106
+	.byte	0x12
+	.2byte	0x136
+	.4byte	0x680
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x5ef
+	.uleb128 0x1d
+	.4byte	.LASF107
+	.byte	0x40
+	.byte	0x13
+	.2byte	0x137
+	.4byte	0x730
+	.uleb128 0x1e
+	.4byte	.LASF108
+	.byte	0x13
+	.2byte	0x138
+	.4byte	0x12c
+	.byte	0
+	.uleb128 0x1e
+	.4byte	.LASF109
+	.byte	0x13
+	.2byte	0x139
+	.4byte	0x12c
+	.byte	0x4
+	.uleb128 0x1e
+	.4byte	.LASF110
+	.byte	0x13
+	.2byte	0x13a
+	.4byte	0x12c
+	.byte	0x8
+	.uleb128 0x1e
+	.4byte	.LASF111
+	.byte	0x13
+	.2byte	0x13b
+	.4byte	0x12c
+	.byte	0xc
+	.uleb128 0x1e
+	.4byte	.LASF112
+	.byte	0x13
+	.2byte	0x13c
+	.4byte	0x12c
+	.byte	0x10
+	.uleb128 0x1e
+	.4byte	.LASF113
+	.byte	0x13
+	.2byte	0x13d
+	.4byte	0x12c
+	.byte	0x14
+	.uleb128 0x1e
+	.4byte	.LASF114
+	.byte	0x13
+	.2byte	0x13e
+	.4byte	0x12c
+	.byte	0x18
+	.uleb128 0x1e
+	.4byte	.LASF115
+	.byte	0x13
+	.2byte	0x13f
+	.4byte	0x116
+	.byte	0x1c
+	.uleb128 0x1e
+	.4byte	.LASF116
+	.byte	0x13
+	.2byte	0x140
+	.4byte	0x116
+	.byte	0x1d
+	.uleb128 0x1e
+	.4byte	.LASF117
+	.byte	0x13
+	.2byte	0x141
+	.4byte	0x116
+	.byte	0x1e
+	.uleb128 0x1e
+	.4byte	.LASF118
+	.byte	0x13
+	.2byte	0x142
+	.4byte	0x116
+	.byte	0x1f
+	.uleb128 0x1e
+	.4byte	.LASF119
+	.byte	0x13
+	.2byte	0x143
+	.4byte	0x730
+	.byte	0x20
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x116
+	.4byte	0x740
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF120
+	.byte	0x13
+	.2byte	0x144
+	.4byte	0x686
+	.uleb128 0x1d
+	.4byte	.LASF121
+	.byte	0x30
+	.byte	0x13
+	.2byte	0x146
+	.4byte	0x7ce
+	.uleb128 0x1e
+	.4byte	.LASF54
+	.byte	0x13
+	.2byte	0x147
+	.4byte	0x10b
+	.byte	0
+	.uleb128 0x20
+	.string	"end"
+	.byte	0x13
+	.2byte	0x147
+	.4byte	0x10b
+	.byte	0x8
+	.uleb128 0x1e
+	.4byte	.LASF122
+	.byte	0x13
+	.2byte	0x148
+	.4byte	0x10b
+	.byte	0x10
+	.uleb128 0x1e
+	.4byte	.LASF123
+	.byte	0x13
+	.2byte	0x148
+	.4byte	0x10b
+	.byte	0x18
+	.uleb128 0x1e
+	.4byte	.LASF124
+	.byte	0x13
+	.2byte	0x149
+	.4byte	0x10b
+	.byte	0x20
+	.uleb128 0x1e
+	.4byte	.LASF125
+	.byte	0x13
+	.2byte	0x14a
+	.4byte	0x116
+	.byte	0x28
+	.uleb128 0x1e
+	.4byte	.LASF126
+	.byte	0x13
+	.2byte	0x14a
+	.4byte	0x116
+	.byte	0x29
+	.uleb128 0x20
+	.string	"os"
+	.byte	0x13
+	.2byte	0x14a
+	.4byte	0x116
+	.byte	0x2a
+	.uleb128 0x1e
+	.4byte	.LASF127
+	.byte	0x13
+	.2byte	0x14b
+	.4byte	0x116
+	.byte	0x2b
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF128
+	.byte	0x13
+	.2byte	0x14c
+	.4byte	0x74c
+	.uleb128 0x21
+	.4byte	.LASF129
+	.2byte	0x380
+	.byte	0x13
+	.2byte	0x152
+	.4byte	0x977
+	.uleb128 0x1e
+	.4byte	.LASF130
+	.byte	0x13
+	.2byte	0x158
+	.4byte	0x977
+	.byte	0
+	.uleb128 0x1e
+	.4byte	.LASF131
+	.byte	0x13
+	.2byte	0x159
+	.4byte	0x740
+	.byte	0x8
+	.uleb128 0x1e
+	.4byte	.LASF132
+	.byte	0x13
+	.2byte	0x15a
+	.4byte	0x10b
+	.byte	0x48
+	.uleb128 0x1e
+	.4byte	.LASF133
+	.byte	0x13
+	.2byte	0x15d
+	.4byte	0xe1
+	.byte	0x50
+	.uleb128 0x1e
+	.4byte	.LASF134
+	.byte	0x13
+	.2byte	0x15f
+	.4byte	0x137
+	.byte	0x58
+	.uleb128 0x1e
+	.4byte	.LASF135
+	.byte	0x13
+	.2byte	0x160
+	.4byte	0xe1
+	.byte	0x60
+	.uleb128 0x1e
+	.4byte	.LASF136
+	.byte	0x13
+	.2byte	0x161
+	.4byte	0x54
+	.byte	0x68
+	.uleb128 0x1e
+	.4byte	.LASF137
+	.byte	0x13
+	.2byte	0x163
+	.4byte	0x137
+	.byte	0x70
+	.uleb128 0x1e
+	.4byte	.LASF138
+	.byte	0x13
+	.2byte	0x164
+	.4byte	0xe1
+	.byte	0x78
+	.uleb128 0x1e
+	.4byte	.LASF139
+	.byte	0x13
+	.2byte	0x165
+	.4byte	0x54
+	.byte	0x80
+	.uleb128 0x1e
+	.4byte	.LASF140
+	.byte	0x13
+	.2byte	0x167
+	.4byte	0x137
+	.byte	0x88
+	.uleb128 0x1e
+	.4byte	.LASF141
+	.byte	0x13
+	.2byte	0x168
+	.4byte	0xe1
+	.byte	0x90
+	.uleb128 0x1e
+	.4byte	.LASF142
+	.byte	0x13
+	.2byte	0x169
+	.4byte	0x54
+	.byte	0x98
+	.uleb128 0x1e
+	.4byte	.LASF143
+	.byte	0x13
+	.2byte	0x16b
+	.4byte	0x137
+	.byte	0xa0
+	.uleb128 0x1e
+	.4byte	.LASF144
+	.byte	0x13
+	.2byte	0x16c
+	.4byte	0xe1
+	.byte	0xa8
+	.uleb128 0x1e
+	.4byte	.LASF145
+	.byte	0x13
+	.2byte	0x16d
+	.4byte	0x54
+	.byte	0xb0
+	.uleb128 0x20
+	.string	"os"
+	.byte	0x13
+	.2byte	0x171
+	.4byte	0x7ce
+	.byte	0xb8
+	.uleb128 0x20
+	.string	"ep"
+	.byte	0x13
+	.2byte	0x172
+	.4byte	0x10b
+	.byte	0xe8
+	.uleb128 0x1e
+	.4byte	.LASF146
+	.byte	0x13
+	.2byte	0x174
+	.4byte	0x10b
+	.byte	0xf0
+	.uleb128 0x1e
+	.4byte	.LASF147
+	.byte	0x13
+	.2byte	0x174
+	.4byte	0x10b
+	.byte	0xf8
+	.uleb128 0x22
+	.4byte	.LASF148
+	.byte	0x13
+	.2byte	0x176
+	.4byte	0xfa
+	.2byte	0x100
+	.uleb128 0x22
+	.4byte	.LASF149
+	.byte	0x13
+	.2byte	0x177
+	.4byte	0x10b
+	.2byte	0x108
+	.uleb128 0x22
+	.4byte	.LASF150
+	.byte	0x13
+	.2byte	0x179
+	.4byte	0x10b
+	.2byte	0x110
+	.uleb128 0x22
+	.4byte	.LASF151
+	.byte	0x13
+	.2byte	0x17a
+	.4byte	0x10b
+	.2byte	0x118
+	.uleb128 0x22
+	.4byte	.LASF152
+	.byte	0x13
+	.2byte	0x17b
+	.4byte	0x10b
+	.2byte	0x120
+	.uleb128 0x22
+	.4byte	.LASF153
+	.byte	0x13
+	.2byte	0x17c
+	.4byte	0x10b
+	.2byte	0x128
+	.uleb128 0x23
+	.string	"kbd"
+	.byte	0x13
+	.2byte	0x17d
+	.4byte	0x97d
+	.2byte	0x130
+	.uleb128 0x22
+	.4byte	.LASF154
+	.byte	0x13
+	.2byte	0x180
+	.4byte	0x54
+	.2byte	0x138
+	.uleb128 0x22
+	.4byte	.LASF155
+	.byte	0x13
+	.2byte	0x18d
+	.4byte	0x54
+	.2byte	0x13c
+	.uleb128 0x23
+	.string	"lmb"
+	.byte	0x13
+	.2byte	0x190
+	.4byte	0x42c
+	.2byte	0x140
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x740
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x58c
+	.uleb128 0x1f
+	.4byte	.LASF156
+	.byte	0x13
+	.2byte	0x196
+	.4byte	0x7da
+	.uleb128 0xc
+	.4byte	.LASF157
+	.byte	0x13
+	.2byte	0x198
+	.4byte	0x983
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0x9ac
+	.uleb128 0x17
+	.4byte	0xda
+	.2byte	0x3ff
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF351
+	.byte	0x4
+	.4byte	0x54
+	.byte	0x18
+	.byte	0xe
+	.4byte	0xc0f
+	.uleb128 0x25
+	.4byte	.LASF158
+	.byte	0
+	.uleb128 0x25
+	.4byte	.LASF159
+	.byte	0x1
+	.uleb128 0x25
+	.4byte	.LASF160
+	.byte	0x2
+	.uleb128 0x25
+	.4byte	.LASF161
+	.byte	0x3
+	.uleb128 0x25
+	.4byte	.LASF162
+	.byte	0x4
+	.uleb128 0x25
+	.4byte	.LASF163
+	.byte	0x5
+	.uleb128 0x25
+	.4byte	.LASF164
+	.byte	0x6
+	.uleb128 0x25
+	.4byte	.LASF165
+	.byte	0x7
+	.uleb128 0x25
+	.4byte	.LASF166
+	.byte	0x8
+	.uleb128 0x25
+	.4byte	.LASF167
+	.byte	0x9
+	.uleb128 0x25
+	.4byte	.LASF168
+	.byte	0xa
+	.uleb128 0x25
+	.4byte	.LASF169
+	.byte	0xb
+	.uleb128 0x25
+	.4byte	.LASF170
+	.byte	0xc
+	.uleb128 0x25
+	.4byte	.LASF171
+	.byte	0xd
+	.uleb128 0x25
+	.4byte	.LASF172
+	.byte	0xe
+	.uleb128 0x25
+	.4byte	.LASF173
+	.byte	0xf
+	.uleb128 0x25
+	.4byte	.LASF174
+	.byte	0x10
+	.uleb128 0x25
+	.4byte	.LASF175
+	.byte	0x11
+	.uleb128 0x25
+	.4byte	.LASF176
+	.byte	0x12
+	.uleb128 0x25
+	.4byte	.LASF177
+	.byte	0x13
+	.uleb128 0x25
+	.4byte	.LASF178
+	.byte	0x14
+	.uleb128 0x25
+	.4byte	.LASF179
+	.byte	0x15
+	.uleb128 0x25
+	.4byte	.LASF180
+	.byte	0x16
+	.uleb128 0x25
+	.4byte	.LASF181
+	.byte	0x17
+	.uleb128 0x25
+	.4byte	.LASF182
+	.byte	0x18
+	.uleb128 0x25
+	.4byte	.LASF183
+	.byte	0x19
+	.uleb128 0x25
+	.4byte	.LASF184
+	.byte	0x1a
+	.uleb128 0x25
+	.4byte	.LASF185
+	.byte	0x1b
+	.uleb128 0x25
+	.4byte	.LASF186
+	.byte	0x1c
+	.uleb128 0x25
+	.4byte	.LASF187
+	.byte	0x1d
+	.uleb128 0x25
+	.4byte	.LASF188
+	.byte	0x1e
+	.uleb128 0x25
+	.4byte	.LASF189
+	.byte	0x1f
+	.uleb128 0x25
+	.4byte	.LASF190
+	.byte	0x20
+	.uleb128 0x25
+	.4byte	.LASF191
+	.byte	0x21
+	.uleb128 0x25
+	.4byte	.LASF192
+	.byte	0x22
+	.uleb128 0x25
+	.4byte	.LASF193
+	.byte	0x23
+	.uleb128 0x25
+	.4byte	.LASF194
+	.byte	0x24
+	.uleb128 0x25
+	.4byte	.LASF195
+	.byte	0x25
+	.uleb128 0x25
+	.4byte	.LASF196
+	.byte	0x26
+	.uleb128 0x25
+	.4byte	.LASF197
+	.byte	0x27
+	.uleb128 0x25
+	.4byte	.LASF198
+	.byte	0x28
+	.uleb128 0x25
+	.4byte	.LASF199
+	.byte	0x29
+	.uleb128 0x25
+	.4byte	.LASF200
+	.byte	0x2a
+	.uleb128 0x25
+	.4byte	.LASF201
+	.byte	0x2b
+	.uleb128 0x25
+	.4byte	.LASF202
+	.byte	0x2c
+	.uleb128 0x25
+	.4byte	.LASF203
+	.byte	0x2d
+	.uleb128 0x25
+	.4byte	.LASF204
+	.byte	0x2e
+	.uleb128 0x25
+	.4byte	.LASF205
+	.byte	0x2f
+	.uleb128 0x25
+	.4byte	.LASF206
+	.byte	0x30
+	.uleb128 0x25
+	.4byte	.LASF207
+	.byte	0x31
+	.uleb128 0x25
+	.4byte	.LASF208
+	.byte	0x32
+	.uleb128 0x25
+	.4byte	.LASF209
+	.byte	0x33
+	.uleb128 0x25
+	.4byte	.LASF210
+	.byte	0x34
+	.uleb128 0x25
+	.4byte	.LASF211
+	.byte	0x35
+	.uleb128 0x25
+	.4byte	.LASF212
+	.byte	0x36
+	.uleb128 0x25
+	.4byte	.LASF213
+	.byte	0x37
+	.uleb128 0x25
+	.4byte	.LASF214
+	.byte	0x38
+	.uleb128 0x25
+	.4byte	.LASF215
+	.byte	0x39
+	.uleb128 0x25
+	.4byte	.LASF216
+	.byte	0x3a
+	.uleb128 0x25
+	.4byte	.LASF217
+	.byte	0x3b
+	.uleb128 0x25
+	.4byte	.LASF218
+	.byte	0x3c
+	.uleb128 0x25
+	.4byte	.LASF219
+	.byte	0x3d
+	.uleb128 0x25
+	.4byte	.LASF220
+	.byte	0x3e
+	.uleb128 0x25
+	.4byte	.LASF221
+	.byte	0x3f
+	.uleb128 0x25
+	.4byte	.LASF222
+	.byte	0x40
+	.uleb128 0x25
+	.4byte	.LASF223
+	.byte	0x41
+	.uleb128 0x25
+	.4byte	.LASF224
+	.byte	0x42
+	.uleb128 0x25
+	.4byte	.LASF225
+	.byte	0x43
+	.uleb128 0x25
+	.4byte	.LASF226
+	.byte	0x44
+	.uleb128 0x25
+	.4byte	.LASF227
+	.byte	0x45
+	.uleb128 0x25
+	.4byte	.LASF228
+	.byte	0x46
+	.uleb128 0x25
+	.4byte	.LASF229
+	.byte	0x47
+	.uleb128 0x25
+	.4byte	.LASF230
+	.byte	0x48
+	.uleb128 0x25
+	.4byte	.LASF231
+	.byte	0x49
+	.uleb128 0x25
+	.4byte	.LASF232
+	.byte	0x4a
+	.uleb128 0x25
+	.4byte	.LASF233
+	.byte	0x4b
+	.uleb128 0x25
+	.4byte	.LASF234
+	.byte	0x4c
+	.uleb128 0x25
+	.4byte	.LASF235
+	.byte	0x4d
+	.uleb128 0x25
+	.4byte	.LASF236
+	.byte	0x4e
+	.uleb128 0x25
+	.4byte	.LASF237
+	.byte	0x4f
+	.uleb128 0x25
+	.4byte	.LASF238
+	.byte	0x50
+	.uleb128 0x25
+	.4byte	.LASF239
+	.byte	0x51
+	.uleb128 0x25
+	.4byte	.LASF240
+	.byte	0x52
+	.uleb128 0x25
+	.4byte	.LASF241
+	.byte	0x53
+	.uleb128 0x25
+	.4byte	.LASF242
+	.byte	0x54
+	.uleb128 0x25
+	.4byte	.LASF243
+	.byte	0x55
+	.uleb128 0x25
+	.4byte	.LASF244
+	.byte	0x56
+	.uleb128 0x25
+	.4byte	.LASF245
+	.byte	0x57
+	.uleb128 0x25
+	.4byte	.LASF246
+	.byte	0x58
+	.uleb128 0x25
+	.4byte	.LASF247
+	.byte	0x59
+	.uleb128 0x25
+	.4byte	.LASF248
+	.byte	0x5a
+	.uleb128 0x25
+	.4byte	.LASF249
+	.byte	0x5b
+	.uleb128 0x25
+	.4byte	.LASF250
+	.byte	0x5c
+	.uleb128 0x25
+	.4byte	.LASF251
+	.byte	0x5d
+	.uleb128 0x25
+	.4byte	.LASF252
+	.byte	0x5e
+	.uleb128 0x25
+	.4byte	.LASF253
+	.byte	0x5f
+	.uleb128 0x25
+	.4byte	.LASF254
+	.byte	0x60
+	.uleb128 0x25
+	.4byte	.LASF255
+	.byte	0x61
+	.uleb128 0x26
+	.4byte	.LASF256
+	.sleb128 -1
+	.byte	0
+	.uleb128 0x27
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x23
+	.byte	0xf6
+	.4byte	0xc22
+	.uleb128 0x25
+	.4byte	.LASF257
+	.byte	0x5
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF258
+	.byte	0x40
+	.byte	0x14
+	.byte	0xc
+	.4byte	0xc9b
+	.uleb128 0xe
+	.4byte	.LASF259
+	.byte	0x14
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0xf
+	.string	"tbu"
+	.byte	0x14
+	.byte	0x23
+	.4byte	0x7f
+	.byte	0x8
+	.uleb128 0xf
+	.string	"tbl"
+	.byte	0x14
+	.byte	0x24
+	.4byte	0x7f
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF260
+	.byte	0x14
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF261
+	.byte	0x14
+	.byte	0x26
+	.4byte	0x8d
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF262
+	.byte	0x14
+	.byte	0x29
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF263
+	.byte	0x14
+	.byte	0x2a
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF264
+	.byte	0x14
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x14
+	.byte	0x2d
+	.4byte	0x3b
+	.byte	0x38
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF266
+	.byte	0x18
+	.byte	0x15
+	.byte	0x22
+	.4byte	0xce3
+	.uleb128 0xe
+	.4byte	.LASF267
+	.byte	0x15
+	.byte	0x23
+	.4byte	0xae
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF268
+	.byte	0x15
+	.byte	0x24
+	.4byte	0xae
+	.byte	0x4
+	.uleb128 0xf
+	.string	"id"
+	.byte	0x15
+	.byte	0x25
+	.4byte	0xae
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF269
+	.byte	0x15
+	.byte	0x26
+	.4byte	0xae
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF270
+	.byte	0x15
+	.byte	0x27
+	.4byte	0x10b
+	.byte	0x10
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF271
+	.2byte	0x1c0
+	.byte	0x15
+	.byte	0x2a
+	.4byte	0xf0c
+	.uleb128 0xf
+	.string	"bd"
+	.byte	0x15
+	.byte	0x2b
+	.4byte	0x97d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF42
+	.byte	0x15
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF269
+	.byte	0x15
+	.byte	0x2d
+	.4byte	0x7f
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF272
+	.byte	0x15
+	.byte	0x2e
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF273
+	.byte	0x15
+	.byte	0x2f
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF274
+	.byte	0x15
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF275
+	.byte	0x15
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF276
+	.byte	0x15
+	.byte	0x3e
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF277
+	.byte	0x15
+	.byte	0x42
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF278
+	.byte	0x15
+	.byte	0x43
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF279
+	.byte	0x15
+	.byte	0x45
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF280
+	.byte	0x15
+	.byte	0x46
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF281
+	.byte	0x15
+	.byte	0x47
+	.4byte	0x3b
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF282
+	.byte	0x15
+	.byte	0x48
+	.4byte	0xcf
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF283
+	.byte	0x15
+	.byte	0x49
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF284
+	.byte	0x15
+	.byte	0x4a
+	.4byte	0x3b
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF285
+	.byte	0x15
+	.byte	0x4b
+	.4byte	0x3b
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF286
+	.byte	0x15
+	.byte	0x4c
+	.4byte	0x3b
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF287
+	.byte	0x15
+	.byte	0x4d
+	.4byte	0xf0c
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF288
+	.byte	0x15
+	.byte	0x50
+	.4byte	0x25f
+	.byte	0x98
+	.uleb128 0xe
+	.4byte	.LASF289
+	.byte	0x15
+	.byte	0x51
+	.4byte	0x25f
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF290
+	.byte	0x15
+	.byte	0x52
+	.4byte	0x292
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF291
+	.byte	0x15
+	.byte	0x57
+	.4byte	0x265
+	.byte	0xb8
+	.uleb128 0xe
+	.4byte	.LASF292
+	.byte	0x15
+	.byte	0x58
+	.4byte	0x137
+	.byte	0xc0
+	.uleb128 0xe
+	.4byte	.LASF293
+	.byte	0x15
+	.byte	0x59
+	.4byte	0x3b
+	.byte	0xc8
+	.uleb128 0xe
+	.4byte	.LASF294
+	.byte	0x15
+	.byte	0x5b
+	.4byte	0xf84
+	.byte	0xd0
+	.uleb128 0xe
+	.4byte	.LASF295
+	.byte	0x15
+	.byte	0x5c
+	.4byte	0xf84
+	.byte	0xd8
+	.uleb128 0xe
+	.4byte	.LASF296
+	.byte	0x15
+	.byte	0x5e
+	.4byte	0x265
+	.byte	0xe0
+	.uleb128 0xe
+	.4byte	.LASF297
+	.byte	0x15
+	.byte	0x5f
+	.4byte	0x265
+	.byte	0xe8
+	.uleb128 0xf
+	.string	"jt"
+	.byte	0x15
+	.byte	0x60
+	.4byte	0xf8f
+	.byte	0xf0
+	.uleb128 0xe
+	.4byte	.LASF298
+	.byte	0x15
+	.byte	0x61
+	.4byte	0xf95
+	.byte	0xf8
+	.uleb128 0x15
+	.4byte	.LASF299
+	.byte	0x15
+	.byte	0x6b
+	.4byte	0x7f
+	.2byte	0x118
+	.uleb128 0x15
+	.4byte	.LASF300
+	.byte	0x15
+	.byte	0x6c
+	.4byte	0x7f
+	.2byte	0x11c
+	.uleb128 0x15
+	.4byte	.LASF301
+	.byte	0x15
+	.byte	0x6e
+	.4byte	0x3b
+	.2byte	0x120
+	.uleb128 0x15
+	.4byte	.LASF302
+	.byte	0x15
+	.byte	0x6f
+	.4byte	0x3b
+	.2byte	0x128
+	.uleb128 0x15
+	.4byte	.LASF303
+	.byte	0x15
+	.byte	0x70
+	.4byte	0x3b
+	.2byte	0x130
+	.uleb128 0x15
+	.4byte	.LASF304
+	.byte	0x15
+	.byte	0x79
+	.4byte	0x25f
+	.2byte	0x138
+	.uleb128 0x15
+	.4byte	.LASF127
+	.byte	0x15
+	.byte	0x7a
+	.4byte	0xc22
+	.2byte	0x140
+	.uleb128 0x15
+	.4byte	.LASF305
+	.byte	0x15
+	.byte	0x80
+	.4byte	0x10b
+	.2byte	0x180
+	.uleb128 0x15
+	.4byte	.LASF306
+	.byte	0x15
+	.byte	0x81
+	.4byte	0x10b
+	.2byte	0x188
+	.uleb128 0x15
+	.4byte	.LASF307
+	.byte	0x15
+	.byte	0x87
+	.4byte	0xc4
+	.2byte	0x190
+	.uleb128 0x15
+	.4byte	.LASF308
+	.byte	0x15
+	.byte	0x8c
+	.4byte	0xc9b
+	.2byte	0x198
+	.uleb128 0x15
+	.4byte	.LASF309
+	.byte	0x15
+	.byte	0x8d
+	.4byte	0x10b
+	.2byte	0x1b0
+	.uleb128 0x15
+	.4byte	.LASF310
+	.byte	0x15
+	.byte	0x8e
+	.4byte	0x54
+	.2byte	0x1b8
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xce3
+	.uleb128 0xd
+	.4byte	.LASF311
+	.byte	0x40
+	.byte	0x16
+	.byte	0x2c
+	.4byte	0xf7f
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x16
+	.byte	0x2d
+	.4byte	0xe1
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF126
+	.byte	0x16
+	.byte	0x2e
+	.4byte	0xe1
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF312
+	.byte	0x16
+	.byte	0x2f
+	.4byte	0x12b8
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF313
+	.byte	0x16
+	.byte	0x30
+	.4byte	0xe1
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF314
+	.byte	0x16
+	.byte	0x32
+	.4byte	0x1300
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF34
+	.byte	0x16
+	.byte	0x33
+	.4byte	0xf84
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF315
+	.byte	0x16
+	.byte	0x34
+	.4byte	0xf84
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF316
+	.byte	0x16
+	.byte	0x35
+	.4byte	0xf84
+	.byte	0x38
+	.byte	0
+	.uleb128 0x7
+	.4byte	0xf12
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xf12
+	.uleb128 0x18
+	.4byte	.LASF318
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xf8a
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0xfa5
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF319
+	.byte	0x15
+	.byte	0x9b
+	.4byte	0xce3
+	.uleb128 0x28
+	.4byte	0xfa5
+	.uleb128 0x4
+	.4byte	.LASF320
+	.byte	0x2
+	.byte	0xad
+	.4byte	0x10b
+	.uleb128 0xa
+	.4byte	0x94
+	.4byte	0xfcb
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF321
+	.byte	0x2
+	.byte	0xaf
+	.4byte	0xfc0
+	.uleb128 0x4
+	.4byte	.LASF322
+	.byte	0x2
+	.byte	0xb0
+	.4byte	0xfc0
+	.uleb128 0x4
+	.4byte	.LASF323
+	.byte	0x2
+	.byte	0xfe
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF324
+	.byte	0x2
+	.byte	0xff
+	.4byte	0x10b
+	.uleb128 0xc
+	.4byte	.LASF325
+	.byte	0x2
+	.2byte	0x100
+	.4byte	0x10b
+	.uleb128 0xd
+	.4byte	.LASF326
+	.byte	0x4
+	.byte	0x17
+	.byte	0x2e
+	.4byte	0x101c
+	.uleb128 0xe
+	.4byte	.LASF327
+	.byte	0x17
+	.byte	0x2f
+	.4byte	0x12c
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x29
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x1031
+	.uleb128 0x13
+	.4byte	0x25f
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1022
+	.uleb128 0xa
+	.4byte	0x94
+	.4byte	0x1047
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x5
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF328
+	.byte	0x17
+	.2byte	0x1fd
+	.4byte	0x1003
+	.uleb128 0xc
+	.4byte	.LASF329
+	.byte	0x17
+	.2byte	0x1fe
+	.4byte	0x1003
+	.uleb128 0xc
+	.4byte	.LASF330
+	.byte	0x17
+	.2byte	0x200
+	.4byte	0x1003
+	.uleb128 0xc
+	.4byte	.LASF331
+	.byte	0x17
+	.2byte	0x205
+	.4byte	0xf95
+	.uleb128 0xc
+	.4byte	.LASF332
+	.byte	0x17
+	.2byte	0x206
+	.4byte	0xf95
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0x1093
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x3f
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF333
+	.byte	0x17
+	.2byte	0x207
+	.4byte	0x1083
+	.uleb128 0xc
+	.4byte	.LASF334
+	.byte	0x17
+	.2byte	0x209
+	.4byte	0x1037
+	.uleb128 0xc
+	.4byte	.LASF335
+	.byte	0x17
+	.2byte	0x20a
+	.4byte	0x1037
+	.uleb128 0xc
+	.4byte	.LASF336
+	.byte	0x17
+	.2byte	0x20b
+	.4byte	0x1003
+	.uleb128 0xc
+	.4byte	.LASF337
+	.byte	0x17
+	.2byte	0x20c
+	.4byte	0x1003
+	.uleb128 0xc
+	.4byte	.LASF338
+	.byte	0x17
+	.2byte	0x20d
+	.4byte	0x101c
+	.uleb128 0xa
+	.4byte	0x101c
+	.4byte	0x10eb
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x3
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF339
+	.byte	0x17
+	.2byte	0x20e
+	.4byte	0x10db
+	.uleb128 0xc
+	.4byte	.LASF340
+	.byte	0x17
+	.2byte	0x20f
+	.4byte	0x101c
+	.uleb128 0xc
+	.4byte	.LASF341
+	.byte	0x17
+	.2byte	0x210
+	.4byte	0x54
+	.uleb128 0xa
+	.4byte	0x9e
+	.4byte	0x111f
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x5
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x110f
+	.uleb128 0xc
+	.4byte	.LASF342
+	.byte	0x17
+	.2byte	0x211
+	.4byte	0x111f
+	.uleb128 0xc
+	.4byte	.LASF343
+	.byte	0x17
+	.2byte	0x212
+	.4byte	0x111f
+	.uleb128 0xc
+	.4byte	.LASF344
+	.byte	0x17
+	.2byte	0x216
+	.4byte	0x100
+	.uleb128 0xc
+	.4byte	.LASF345
+	.byte	0x17
+	.2byte	0x217
+	.4byte	0x100
+	.uleb128 0xc
+	.4byte	.LASF346
+	.byte	0x17
+	.2byte	0x219
+	.4byte	0x54
+	.uleb128 0xc
+	.4byte	.LASF347
+	.byte	0x17
+	.2byte	0x220
+	.4byte	0x99b
+	.uleb128 0xc
+	.4byte	.LASF348
+	.byte	0x17
+	.2byte	0x222
+	.4byte	0xae
+	.uleb128 0xc
+	.4byte	.LASF349
+	.byte	0x17
+	.2byte	0x224
+	.4byte	0xae
+	.uleb128 0xc
+	.4byte	.LASF350
+	.byte	0x17
+	.2byte	0x230
+	.4byte	0x1003
+	.uleb128 0x29
+	.4byte	.LASF352
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x17
+	.2byte	0x286
+	.4byte	0x11ba
+	.uleb128 0x25
+	.4byte	.LASF353
+	.byte	0
+	.uleb128 0x25
+	.4byte	.LASF354
+	.byte	0x1
+	.uleb128 0x25
+	.4byte	.LASF355
+	.byte	0x2
+	.uleb128 0x25
+	.4byte	.LASF356
+	.byte	0x3
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF357
+	.byte	0x17
+	.2byte	0x28c
+	.4byte	0x1190
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x94
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xa3
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xae
+	.uleb128 0xd
+	.4byte	.LASF27
+	.byte	0x78
+	.byte	0x8
+	.byte	0xf1
+	.4byte	0x12b3
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x8
+	.byte	0xf2
+	.4byte	0xfa
+	.byte	0
+	.uleb128 0xf
+	.string	"id"
+	.byte	0x8
+	.byte	0xf3
+	.4byte	0x9ac
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF358
+	.byte	0x8
+	.byte	0xf4
+	.4byte	0x1416
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF359
+	.byte	0x8
+	.byte	0xf5
+	.4byte	0x1031
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF360
+	.byte	0x8
+	.byte	0xf6
+	.4byte	0x1031
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF361
+	.byte	0x8
+	.byte	0xf7
+	.4byte	0x1031
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF362
+	.byte	0x8
+	.byte	0xf8
+	.4byte	0x1031
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF363
+	.byte	0x8
+	.byte	0xf9
+	.4byte	0x1031
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF364
+	.byte	0x8
+	.byte	0xfa
+	.4byte	0x1031
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF365
+	.byte	0x8
+	.byte	0xfb
+	.4byte	0x1031
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF366
+	.byte	0x8
+	.byte	0xfc
+	.4byte	0x1031
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF367
+	.byte	0x8
+	.byte	0xfd
+	.4byte	0x54
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF368
+	.byte	0x8
+	.byte	0xfe
+	.4byte	0x54
+	.byte	0x5c
+	.uleb128 0xe
+	.4byte	.LASF369
+	.byte	0x8
+	.byte	0xff
+	.4byte	0x54
+	.byte	0x60
+	.uleb128 0x1e
+	.4byte	.LASF370
+	.byte	0x8
+	.2byte	0x100
+	.4byte	0x54
+	.byte	0x64
+	.uleb128 0x20
+	.string	"ops"
+	.byte	0x8
+	.2byte	0x101
+	.4byte	0x265
+	.byte	0x68
+	.uleb128 0x1e
+	.4byte	.LASF42
+	.byte	0x8
+	.2byte	0x102
+	.4byte	0x121
+	.byte	0x70
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x11d8
+	.uleb128 0x2
+	.4byte	.LASF312
+	.byte	0x16
+	.byte	0xf
+	.4byte	0xae
+	.uleb128 0xd
+	.4byte	.LASF371
+	.byte	0x20
+	.byte	0x16
+	.byte	0x19
+	.4byte	0x1300
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x16
+	.byte	0x1a
+	.4byte	0xfa
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF372
+	.byte	0x16
+	.byte	0x1b
+	.4byte	0x54
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF373
+	.byte	0x16
+	.byte	0x1c
+	.4byte	0x137
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF47
+	.byte	0x16
+	.byte	0x1d
+	.4byte	0x1300
+	.byte	0x18
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x12c3
+	.uleb128 0x2a
+	.string	"gd"
+	.byte	0x16
+	.byte	0x57
+	.4byte	0x1310
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xfb0
+	.uleb128 0x2b
+	.4byte	.LASF461
+	.byte	0x8
+	.byte	0x19
+	.byte	0x33
+	.4byte	0x1338
+	.uleb128 0x2c
+	.string	"np"
+	.byte	0x19
+	.byte	0x34
+	.4byte	0x1338
+	.uleb128 0x2d
+	.4byte	.LASF374
+	.byte	0x19
+	.byte	0x35
+	.4byte	0xf3
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xf7f
+	.uleb128 0x2
+	.4byte	.LASF375
+	.byte	0x19
+	.byte	0x36
+	.4byte	0x1316
+	.uleb128 0xc
+	.4byte	.LASF376
+	.byte	0x1a
+	.2byte	0x3ba
+	.4byte	0x10b
+	.uleb128 0xc
+	.4byte	.LASF377
+	.byte	0x1a
+	.2byte	0x3bb
+	.4byte	0x10b
+	.uleb128 0xc
+	.4byte	.LASF378
+	.byte	0x1a
+	.2byte	0x3bc
+	.4byte	0x10b
+	.uleb128 0xd
+	.4byte	.LASF379
+	.byte	0x4
+	.byte	0x1b
+	.byte	0xd
+	.4byte	0x1386
+	.uleb128 0xf
+	.string	"pid"
+	.byte	0x1b
+	.byte	0xe
+	.4byte	0x54
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF380
+	.byte	0x1b
+	.byte	0x11
+	.4byte	0x1391
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x136d
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x12b3
+	.uleb128 0xd
+	.4byte	.LASF36
+	.byte	0x38
+	.byte	0x1c
+	.byte	0x23
+	.4byte	0x13e6
+	.uleb128 0xe
+	.4byte	.LASF35
+	.byte	0x1c
+	.byte	0x24
+	.4byte	0x137
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF381
+	.byte	0x1c
+	.byte	0x25
+	.4byte	0x1500
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF382
+	.byte	0x1c
+	.byte	0x26
+	.4byte	0x292
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF41
+	.byte	0x1c
+	.byte	0x27
+	.4byte	0x292
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x1c
+	.byte	0x29
+	.4byte	0x2b7
+	.byte	0x30
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x139d
+	.uleb128 0xd
+	.4byte	.LASF384
+	.byte	0x10
+	.byte	0x8
+	.byte	0xb8
+	.4byte	0x1411
+	.uleb128 0xe
+	.4byte	.LASF385
+	.byte	0x8
+	.byte	0xb9
+	.4byte	0xe1
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF386
+	.byte	0x8
+	.byte	0xba
+	.4byte	0x10b
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x13ec
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1411
+	.uleb128 0xd
+	.4byte	.LASF387
+	.byte	0x80
+	.byte	0x1c
+	.byte	0x57
+	.4byte	0x1500
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x1c
+	.byte	0x58
+	.4byte	0xe1
+	.byte	0
+	.uleb128 0xf
+	.string	"id"
+	.byte	0x1c
+	.byte	0x59
+	.4byte	0x9ac
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF388
+	.byte	0x1c
+	.byte	0x5a
+	.4byte	0x1031
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF389
+	.byte	0x1c
+	.byte	0x5b
+	.4byte	0x1031
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF390
+	.byte	0x1c
+	.byte	0x5c
+	.4byte	0x1031
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF391
+	.byte	0x1c
+	.byte	0x5d
+	.4byte	0x1031
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF392
+	.byte	0x1c
+	.byte	0x5e
+	.4byte	0x1031
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF364
+	.byte	0x1c
+	.byte	0x5f
+	.4byte	0x1031
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF365
+	.byte	0x1c
+	.byte	0x60
+	.4byte	0x1031
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF393
+	.byte	0x1c
+	.byte	0x61
+	.4byte	0x1515
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF394
+	.byte	0x1c
+	.byte	0x62
+	.4byte	0x1515
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF367
+	.byte	0x1c
+	.byte	0x63
+	.4byte	0x54
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF395
+	.byte	0x1c
+	.byte	0x64
+	.4byte	0x54
+	.byte	0x5c
+	.uleb128 0xe
+	.4byte	.LASF396
+	.byte	0x1c
+	.byte	0x65
+	.4byte	0x54
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF369
+	.byte	0x1c
+	.byte	0x66
+	.4byte	0x54
+	.byte	0x64
+	.uleb128 0xe
+	.4byte	.LASF370
+	.byte	0x1c
+	.byte	0x67
+	.4byte	0x54
+	.byte	0x68
+	.uleb128 0xf
+	.string	"ops"
+	.byte	0x1c
+	.byte	0x68
+	.4byte	0x265
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF42
+	.byte	0x1c
+	.byte	0x69
+	.4byte	0x121
+	.byte	0x78
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x141c
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x1515
+	.uleb128 0x13
+	.4byte	0x13e6
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1506
+	.uleb128 0x4
+	.4byte	.LASF397
+	.byte	0x1d
+	.byte	0x49
+	.4byte	0x7f
+	.uleb128 0x24
+	.4byte	.LASF398
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1e
+	.byte	0x15
+	.4byte	0x1555
+	.uleb128 0x25
+	.4byte	.LASF399
+	.byte	0x1
+	.uleb128 0x25
+	.4byte	.LASF400
+	.byte	0x2
+	.uleb128 0x25
+	.4byte	.LASF401
+	.byte	0x4
+	.uleb128 0x25
+	.4byte	.LASF402
+	.byte	0x8
+	.uleb128 0x25
+	.4byte	.LASF403
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF404
+	.byte	0x20
+	.byte	0x1e
+	.byte	0x61
+	.4byte	0x1592
+	.uleb128 0xe
+	.4byte	.LASF405
+	.byte	0x1e
+	.byte	0x6b
+	.4byte	0x15b5
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF406
+	.byte	0x1e
+	.byte	0x75
+	.4byte	0x15d9
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF407
+	.byte	0x1e
+	.byte	0x7f
+	.4byte	0x15f8
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF408
+	.byte	0x1e
+	.byte	0x8c
+	.4byte	0x1626
+	.byte	0x18
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x1555
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x15b5
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x137
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1597
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x15d9
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x265
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x15bb
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x15f8
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x3b
+	.uleb128 0x13
+	.4byte	0x137
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x15df
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x1626
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x137
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x137
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x15fe
+	.uleb128 0xd
+	.4byte	.LASF409
+	.byte	0x20
+	.byte	0x1f
+	.byte	0x5e
+	.4byte	0x1669
+	.uleb128 0xe
+	.4byte	.LASF60
+	.byte	0x1f
+	.byte	0x5f
+	.4byte	0x137
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF410
+	.byte	0x1f
+	.byte	0x60
+	.4byte	0x3b
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF411
+	.byte	0x1f
+	.byte	0x61
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF412
+	.byte	0x1f
+	.byte	0x62
+	.4byte	0x3b
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF413
+	.byte	0x20
+	.byte	0x1
+	.byte	0xf
+	.4byte	0x16a6
+	.uleb128 0xe
+	.4byte	.LASF405
+	.byte	0x1
+	.byte	0x10
+	.4byte	0x15b5
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF406
+	.byte	0x1
+	.byte	0x11
+	.4byte	0x15d9
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF414
+	.byte	0x1
+	.byte	0x12
+	.4byte	0x16c5
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF415
+	.byte	0x1
+	.byte	0x15
+	.4byte	0x16c5
+	.byte	0x18
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x1669
+	.uleb128 0x2e
+	.4byte	0x16c5
+	.uleb128 0x13
+	.4byte	0x11d2
+	.uleb128 0x13
+	.4byte	0x11d2
+	.uleb128 0x13
+	.4byte	0x3b
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x16ab
+	.uleb128 0x2f
+	.4byte	.LASF416
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x1592
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	rockchip_secure_otp_ops
+	.uleb128 0x2f
+	.4byte	.LASF417
+	.byte	0x1
+	.2byte	0x2dc
+	.4byte	0x16a6
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	rk3528_data
+	.uleb128 0xa
+	.4byte	0x1411
+	.4byte	0x1707
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x16f7
+	.uleb128 0x2f
+	.4byte	.LASF418
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x1707
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	rockchip_otp_ids
+	.uleb128 0x30
+	.4byte	.LASF419
+	.byte	0x1
+	.2byte	0x2eb
+	.4byte	0x11d8
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	_u_boot_list_2_driver_2_rockchip_secure_otp
+	.uleb128 0x31
+	.4byte	.LASF420
+	.byte	0x1
+	.2byte	0x2cd
+	.4byte	0x54
+	.8byte	.LFB277
+	.8byte	.LFE277-.LFB277
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1825
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x2cd
+	.4byte	0x25f
+	.4byte	.LLST14
+	.uleb128 0x33
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x2cf
+	.4byte	0x1825
+	.4byte	.LLST15
+	.uleb128 0x34
+	.8byte	.LVL20
+	.4byte	0x4283
+	.4byte	0x1792
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL23
+	.4byte	0x428f
+	.4byte	0x17aa
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL24
+	.4byte	0x429a
+	.4byte	0x17d4
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x1
+	.byte	0x30
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL25
+	.4byte	0x429a
+	.4byte	0x17fe
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC1
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x1
+	.byte	0x30
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL26
+	.4byte	0x429a
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC2
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x1
+	.byte	0x30
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x162c
+	.uleb128 0x31
+	.4byte	.LASF421
+	.byte	0x1
+	.2byte	0x2b6
+	.4byte	0x54
+	.8byte	.LFB276
+	.8byte	.LFE276-.LFB276
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x18ac
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x2b6
+	.4byte	0x25f
+	.4byte	.LLST1
+	.uleb128 0x37
+	.4byte	.LASF422
+	.byte	0x1
+	.2byte	0x2b7
+	.4byte	0x3b
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x38
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2b8
+	.4byte	0x137
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x33
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x2ba
+	.4byte	0x54
+	.4byte	.LLST2
+	.uleb128 0x39
+	.4byte	0x18ac
+	.8byte	.LBB23
+	.8byte	.LBE23-.LBB23
+	.byte	0x1
+	.2byte	0x2be
+	.uleb128 0x3a
+	.4byte	0x18bd
+	.4byte	.LLST3
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.4byte	.LASF430
+	.byte	0x1
+	.2byte	0x2af
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x18ca
+	.uleb128 0x3c
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2af
+	.4byte	0x11d2
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF423
+	.byte	0x1
+	.2byte	0x2a7
+	.4byte	0x54
+	.8byte	.LFB274
+	.8byte	.LFE274-.LFB274
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x197b
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x2a7
+	.4byte	0x25f
+	.4byte	.LLST4
+	.uleb128 0x3d
+	.4byte	.LASF424
+	.byte	0x1
+	.2byte	0x2a7
+	.4byte	0x54
+	.4byte	.LLST5
+	.uleb128 0x32
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2a8
+	.4byte	0x265
+	.4byte	.LLST6
+	.uleb128 0x3d
+	.4byte	.LASF51
+	.byte	0x1
+	.2byte	0x2a8
+	.4byte	0x54
+	.4byte	.LLST7
+	.uleb128 0x3e
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x2aa
+	.4byte	0x197b
+	.4byte	.LLST8
+	.uleb128 0x34
+	.8byte	.LVL8
+	.4byte	0x42a5
+	.4byte	0x1954
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3f
+	.8byte	.LVL12
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1669
+	.uleb128 0x31
+	.4byte	.LASF426
+	.byte	0x1
+	.2byte	0x29f
+	.4byte	0x54
+	.8byte	.LFB273
+	.8byte	.LFE273-.LFB273
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1a32
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x29f
+	.4byte	0x25f
+	.4byte	.LLST9
+	.uleb128 0x3d
+	.4byte	.LASF424
+	.byte	0x1
+	.2byte	0x29f
+	.4byte	0x54
+	.4byte	.LLST10
+	.uleb128 0x32
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2a0
+	.4byte	0x137
+	.4byte	.LLST11
+	.uleb128 0x3d
+	.4byte	.LASF51
+	.byte	0x1
+	.2byte	0x2a0
+	.4byte	0x54
+	.4byte	.LLST12
+	.uleb128 0x3e
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x2a2
+	.4byte	0x197b
+	.4byte	.LLST13
+	.uleb128 0x34
+	.8byte	.LVL14
+	.4byte	0x42a5
+	.4byte	0x1a0b
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3f
+	.8byte	.LVL18
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF427
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x54
+	.8byte	.LFB272
+	.8byte	.LFE272-.LFB272
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x255e
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x25f
+	.4byte	.LLST69
+	.uleb128 0x3d
+	.4byte	.LASF424
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x54
+	.4byte	.LLST70
+	.uleb128 0x32
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x265
+	.4byte	.LLST71
+	.uleb128 0x3d
+	.4byte	.LASF51
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x54
+	.4byte	.LLST72
+	.uleb128 0x33
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x26e
+	.4byte	0x1825
+	.4byte	.LLST73
+	.uleb128 0x3e
+	.4byte	.LASF386
+	.byte	0x1
+	.2byte	0x26f
+	.4byte	0x11cc
+	.4byte	.LLST74
+	.uleb128 0x3e
+	.4byte	.LASF428
+	.byte	0x1
+	.2byte	0x270
+	.4byte	0xfa
+	.4byte	.LLST74
+	.uleb128 0x3e
+	.4byte	.LASF429
+	.byte	0x1
+	.2byte	0x271
+	.4byte	0xfa
+	.4byte	.LLST76
+	.uleb128 0x33
+	.string	"i"
+	.byte	0x1
+	.2byte	0x272
+	.4byte	0x54
+	.4byte	.LLST77
+	.uleb128 0x33
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x272
+	.4byte	0x54
+	.4byte	.LLST78
+	.uleb128 0x40
+	.4byte	0x255e
+	.8byte	.LBB244
+	.4byte	.Ldebug_ranges0+0x3f0
+	.byte	0x1
+	.2byte	0x294
+	.4byte	0x2430
+	.uleb128 0x3a
+	.4byte	0x2593
+	.4byte	.LLST79
+	.uleb128 0x3a
+	.4byte	0x2587
+	.4byte	.LLST80
+	.uleb128 0x3a
+	.4byte	0x257b
+	.4byte	.LLST81
+	.uleb128 0x3a
+	.4byte	0x256f
+	.4byte	.LLST82
+	.uleb128 0x41
+	.4byte	.Ldebug_ranges0+0x3f0
+	.uleb128 0x42
+	.4byte	0x259f
+	.4byte	.LLST83
+	.uleb128 0x42
+	.4byte	0x25ab
+	.4byte	.LLST84
+	.uleb128 0x43
+	.4byte	0x25c4
+	.8byte	.L88
+	.uleb128 0x44
+	.4byte	0x25b7
+	.uleb128 0x45
+	.8byte	.LBB246
+	.8byte	.LBE246-.LBB246
+	.4byte	0x1b76
+	.uleb128 0x42
+	.4byte	0x25d1
+	.4byte	.LLST85
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB247
+	.8byte	.LBE247-.LBB247
+	.4byte	0x1b95
+	.uleb128 0x42
+	.4byte	0x25e3
+	.4byte	.LLST86
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB248
+	.8byte	.LBE248-.LBB248
+	.4byte	0x1bb4
+	.uleb128 0x42
+	.4byte	0x25f5
+	.4byte	.LLST87
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB249
+	.8byte	.LBE249-.LBB249
+	.4byte	0x1bd3
+	.uleb128 0x42
+	.4byte	0x2607
+	.4byte	.LLST88
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB250
+	.8byte	.LBE250-.LBB250
+	.4byte	0x1bf2
+	.uleb128 0x42
+	.4byte	0x2619
+	.4byte	.LLST89
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB251
+	.8byte	.LBE251-.LBB251
+	.4byte	0x1c11
+	.uleb128 0x42
+	.4byte	0x262b
+	.4byte	.LLST90
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB252
+	.8byte	.LBE252-.LBB252
+	.4byte	0x1c30
+	.uleb128 0x42
+	.4byte	0x263d
+	.4byte	.LLST91
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB253
+	.8byte	.LBE253-.LBB253
+	.4byte	0x1c4f
+	.uleb128 0x42
+	.4byte	0x264f
+	.4byte	.LLST92
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB254
+	.8byte	.LBE254-.LBB254
+	.4byte	0x1c6e
+	.uleb128 0x42
+	.4byte	0x2661
+	.4byte	.LLST93
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB255
+	.8byte	.LBE255-.LBB255
+	.4byte	0x1c8d
+	.uleb128 0x42
+	.4byte	0x2673
+	.4byte	.LLST94
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB256
+	.8byte	.LBE256-.LBB256
+	.4byte	0x1cac
+	.uleb128 0x42
+	.4byte	0x2685
+	.4byte	.LLST95
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB257
+	.8byte	.LBE257-.LBB257
+	.4byte	0x1ccb
+	.uleb128 0x42
+	.4byte	0x2697
+	.4byte	.LLST96
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB258
+	.8byte	.LBE258-.LBB258
+	.4byte	0x1cea
+	.uleb128 0x42
+	.4byte	0x26a9
+	.4byte	.LLST97
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB259
+	.8byte	.LBE259-.LBB259
+	.4byte	0x1d09
+	.uleb128 0x42
+	.4byte	0x26bb
+	.4byte	.LLST98
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB260
+	.8byte	.LBE260-.LBB260
+	.4byte	0x1d28
+	.uleb128 0x42
+	.4byte	0x26cd
+	.4byte	.LLST99
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB261
+	.8byte	.LBE261-.LBB261
+	.4byte	0x1d47
+	.uleb128 0x42
+	.4byte	0x26df
+	.4byte	.LLST100
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB262
+	.8byte	.LBE262-.LBB262
+	.4byte	0x1d66
+	.uleb128 0x42
+	.4byte	0x26f1
+	.4byte	.LLST101
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB263
+	.8byte	.LBE263-.LBB263
+	.4byte	0x1d85
+	.uleb128 0x42
+	.4byte	0x2703
+	.4byte	.LLST102
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x450
+	.4byte	0x1d98
+	.uleb128 0x42
+	.4byte	0x2715
+	.4byte	.LLST103
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x480
+	.4byte	0x1dab
+	.uleb128 0x42
+	.4byte	0x2727
+	.4byte	.LLST104
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x4b0
+	.4byte	0x1dbe
+	.uleb128 0x42
+	.4byte	0x2739
+	.4byte	.LLST105
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x4e0
+	.4byte	0x1dd1
+	.uleb128 0x42
+	.4byte	0x2a29
+	.4byte	.LLST106
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB272
+	.8byte	.LBE272-.LBB272
+	.4byte	0x1df0
+	.uleb128 0x42
+	.4byte	0x274b
+	.4byte	.LLST107
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB273
+	.8byte	.LBE273-.LBB273
+	.4byte	0x1e0f
+	.uleb128 0x42
+	.4byte	0x275d
+	.4byte	.LLST108
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB274
+	.8byte	.LBE274-.LBB274
+	.4byte	0x1e2e
+	.uleb128 0x42
+	.4byte	0x276f
+	.4byte	.LLST109
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB275
+	.8byte	.LBE275-.LBB275
+	.4byte	0x1e4d
+	.uleb128 0x42
+	.4byte	0x2781
+	.4byte	.LLST110
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB276
+	.8byte	.LBE276-.LBB276
+	.4byte	0x1e6c
+	.uleb128 0x42
+	.4byte	0x2793
+	.4byte	.LLST111
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB277
+	.8byte	.LBE277-.LBB277
+	.4byte	0x1e8b
+	.uleb128 0x42
+	.4byte	0x27a5
+	.4byte	.LLST112
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB278
+	.8byte	.LBE278-.LBB278
+	.4byte	0x1eaa
+	.uleb128 0x42
+	.4byte	0x27b7
+	.4byte	.LLST113
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB279
+	.8byte	.LBE279-.LBB279
+	.4byte	0x1ec9
+	.uleb128 0x42
+	.4byte	0x27c9
+	.4byte	.LLST114
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB280
+	.8byte	.LBE280-.LBB280
+	.4byte	0x1ee8
+	.uleb128 0x42
+	.4byte	0x27db
+	.4byte	.LLST115
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB281
+	.8byte	.LBE281-.LBB281
+	.4byte	0x1f07
+	.uleb128 0x42
+	.4byte	0x27ed
+	.4byte	.LLST116
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB282
+	.8byte	.LBE282-.LBB282
+	.4byte	0x1f26
+	.uleb128 0x42
+	.4byte	0x27ff
+	.4byte	.LLST117
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB283
+	.8byte	.LBE283-.LBB283
+	.4byte	0x1f45
+	.uleb128 0x42
+	.4byte	0x2811
+	.4byte	.LLST118
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB284
+	.8byte	.LBE284-.LBB284
+	.4byte	0x1f64
+	.uleb128 0x42
+	.4byte	0x2823
+	.4byte	.LLST119
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB285
+	.8byte	.LBE285-.LBB285
+	.4byte	0x1f83
+	.uleb128 0x42
+	.4byte	0x2835
+	.4byte	.LLST120
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB286
+	.8byte	.LBE286-.LBB286
+	.4byte	0x1fa2
+	.uleb128 0x42
+	.4byte	0x2847
+	.4byte	.LLST121
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB287
+	.8byte	.LBE287-.LBB287
+	.4byte	0x1fc1
+	.uleb128 0x42
+	.4byte	0x2859
+	.4byte	.LLST122
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x510
+	.4byte	0x1fd4
+	.uleb128 0x42
+	.4byte	0x286b
+	.4byte	.LLST123
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB290
+	.8byte	.LBE290-.LBB290
+	.4byte	0x1ff3
+	.uleb128 0x42
+	.4byte	0x287d
+	.4byte	.LLST124
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB291
+	.8byte	.LBE291-.LBB291
+	.4byte	0x2012
+	.uleb128 0x42
+	.4byte	0x288f
+	.4byte	.LLST125
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB292
+	.8byte	.LBE292-.LBB292
+	.4byte	0x2031
+	.uleb128 0x42
+	.4byte	0x28a1
+	.4byte	.LLST126
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB293
+	.8byte	.LBE293-.LBB293
+	.4byte	0x2050
+	.uleb128 0x42
+	.4byte	0x28b3
+	.4byte	.LLST127
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x540
+	.4byte	0x2063
+	.uleb128 0x42
+	.4byte	0x28c5
+	.4byte	.LLST128
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB296
+	.8byte	.LBE296-.LBB296
+	.4byte	0x2082
+	.uleb128 0x42
+	.4byte	0x28d7
+	.4byte	.LLST129
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB297
+	.8byte	.LBE297-.LBB297
+	.4byte	0x20a1
+	.uleb128 0x42
+	.4byte	0x28e9
+	.4byte	.LLST130
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x570
+	.4byte	0x20b4
+	.uleb128 0x42
+	.4byte	0x28fb
+	.4byte	.LLST131
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x5a0
+	.4byte	0x20c7
+	.uleb128 0x42
+	.4byte	0x290d
+	.4byte	.LLST132
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x5d0
+	.4byte	0x20da
+	.uleb128 0x42
+	.4byte	0x291f
+	.4byte	.LLST133
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB304
+	.8byte	.LBE304-.LBB304
+	.4byte	0x20f9
+	.uleb128 0x42
+	.4byte	0x2931
+	.4byte	.LLST134
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB305
+	.8byte	.LBE305-.LBB305
+	.4byte	0x2118
+	.uleb128 0x42
+	.4byte	0x2943
+	.4byte	.LLST135
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB306
+	.8byte	.LBE306-.LBB306
+	.4byte	0x2137
+	.uleb128 0x42
+	.4byte	0x2955
+	.4byte	.LLST136
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB307
+	.8byte	.LBE307-.LBB307
+	.4byte	0x2156
+	.uleb128 0x42
+	.4byte	0x2967
+	.4byte	.LLST137
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x600
+	.4byte	0x2169
+	.uleb128 0x42
+	.4byte	0x2979
+	.4byte	.LLST138
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB310
+	.8byte	.LBE310-.LBB310
+	.4byte	0x2188
+	.uleb128 0x42
+	.4byte	0x298b
+	.4byte	.LLST139
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB311
+	.8byte	.LBE311-.LBB311
+	.4byte	0x21a7
+	.uleb128 0x42
+	.4byte	0x299d
+	.4byte	.LLST140
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB312
+	.8byte	.LBE312-.LBB312
+	.4byte	0x21c6
+	.uleb128 0x42
+	.4byte	0x29af
+	.4byte	.LLST141
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB313
+	.8byte	.LBE313-.LBB313
+	.4byte	0x21e5
+	.uleb128 0x42
+	.4byte	0x29c1
+	.4byte	.LLST142
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x630
+	.4byte	0x21f8
+	.uleb128 0x42
+	.4byte	0x29d3
+	.4byte	.LLST143
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB316
+	.8byte	.LBE316-.LBB316
+	.4byte	0x2217
+	.uleb128 0x42
+	.4byte	0x29e5
+	.4byte	.LLST144
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB317
+	.8byte	.LBE317-.LBB317
+	.4byte	0x2236
+	.uleb128 0x42
+	.4byte	0x29f7
+	.4byte	.LLST145
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB318
+	.8byte	.LBE318-.LBB318
+	.4byte	0x2255
+	.uleb128 0x42
+	.4byte	0x2a09
+	.4byte	.LLST146
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB319
+	.8byte	.LBE319-.LBB319
+	.4byte	0x2274
+	.uleb128 0x42
+	.4byte	0x2a1b
+	.4byte	.LLST147
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL263
+	.4byte	0x42a5
+	.4byte	0x228c
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL266
+	.4byte	0x42b1
+	.4byte	0x22b4
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC4
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x5
+	.byte	0x85
+	.sleb128 0
+	.byte	0x9
+	.byte	0xfe
+	.byte	0x1a
+	.byte	0
+	.uleb128 0x47
+	.8byte	.LVL289
+	.4byte	0x22c8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL310
+	.4byte	0x4018
+	.4byte	0x22ed
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL314
+	.4byte	0x42b1
+	.uleb128 0x47
+	.8byte	.LVL315
+	.4byte	0x230e
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL336
+	.4byte	0x4018
+	.4byte	0x2334
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL345
+	.4byte	0x4018
+	.4byte	0x235a
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL355
+	.4byte	0x4018
+	.4byte	0x2380
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL364
+	.4byte	0x4018
+	.4byte	0x23a6
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL373
+	.4byte	0x4018
+	.4byte	0x23cc
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL378
+	.4byte	0x3f43
+	.4byte	0x23ec
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3ce0
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL386
+	.4byte	0x4018
+	.4byte	0x2412
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL391
+	.4byte	0x3fad
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d2a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x40
+	.4byte	0x2a4c
+	.8byte	.LBB326
+	.4byte	.Ldebug_ranges0+0x660
+	.byte	0x1
+	.2byte	0x28c
+	.4byte	0x24d1
+	.uleb128 0x3a
+	.4byte	0x2a81
+	.4byte	.LLST148
+	.uleb128 0x3a
+	.4byte	0x2a75
+	.4byte	.LLST149
+	.uleb128 0x3a
+	.4byte	0x2a69
+	.4byte	.LLST150
+	.uleb128 0x3a
+	.4byte	0x2a5d
+	.4byte	.LLST151
+	.uleb128 0x41
+	.4byte	.Ldebug_ranges0+0x660
+	.uleb128 0x42
+	.4byte	0x2a8d
+	.4byte	.LLST152
+	.uleb128 0x4a
+	.4byte	0x2a99
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -2
+	.uleb128 0x42
+	.4byte	0x2aa5
+	.4byte	.LLST153
+	.uleb128 0x34
+	.8byte	.LVL274
+	.4byte	0x39cf
+	.4byte	0x24b5
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0x8f
+	.sleb128 254
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL279
+	.4byte	0x2ab2
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL247
+	.4byte	0x4283
+	.4byte	0x24e9
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL250
+	.4byte	0x42bc
+	.4byte	0x2507
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x8
+	.byte	0x85
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL268
+	.4byte	0x39cf
+	.4byte	0x2531
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL271
+	.4byte	0x42b1
+	.4byte	0x2550
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC12
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL282
+	.4byte	0x42b1
+	.byte	0
+	.uleb128 0x3b
+	.4byte	.LASF431
+	.byte	0x1
+	.2byte	0x1d6
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x2a37
+	.uleb128 0x3c
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x1d6
+	.4byte	0x25f
+	.uleb128 0x3c
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x1d7
+	.4byte	0x1825
+	.uleb128 0x4b
+	.4byte	.LASF424
+	.byte	0x1
+	.2byte	0x1d8
+	.4byte	0x54
+	.uleb128 0x4b
+	.4byte	.LASF386
+	.byte	0x1
+	.2byte	0x1d8
+	.4byte	0xa3
+	.uleb128 0x4c
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x1da
+	.4byte	0x54
+	.uleb128 0x4d
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x1db
+	.4byte	0x197b
+	.uleb128 0x4e
+	.4byte	.LASF432
+	.4byte	0x2a47
+	.4byte	.LASF431
+	.uleb128 0x4f
+	.4byte	.LASF438
+	.byte	0x1
+	.2byte	0x263
+	.uleb128 0x50
+	.4byte	0x25de
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1ef
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x25f0
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f0
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2602
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f1
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2614
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f2
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2626
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f3
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2638
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f4
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x264a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f5
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x265c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f6
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x266e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f7
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2680
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f8
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2692
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f9
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26a4
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fa
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26b6
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fb
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26c8
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fc
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26da
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fd
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26ec
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fe
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26fe
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1ff
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2710
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x200
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2722
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x201
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2734
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x202
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2746
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x203
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2758
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20a
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x276a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20b
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x277c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20c
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x278e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20d
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27a0
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20e
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27b2
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20f
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27c4
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x210
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27d6
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x211
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27e8
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x212
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27fa
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x213
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x280c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x214
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x281e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x215
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2830
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x216
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2842
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x217
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2854
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x218
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2866
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x219
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2878
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x21a
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x288a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x221
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x289c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x222
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28ae
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x223
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28c0
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x224
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28d2
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x225
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28e4
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22c
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28f6
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22d
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2908
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22e
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x291a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22f
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x292c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x230
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x293e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x237
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2950
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x238
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2962
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x239
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2974
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x23a
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2986
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x23b
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2998
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x242
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29aa
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x243
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29bc
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x244
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29ce
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x245
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29e0
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x246
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29f2
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x253
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2a04
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x254
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2a16
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x255
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2a28
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x256
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x264
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x2a47
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x2a37
+	.uleb128 0x3b
+	.4byte	.LASF433
+	.byte	0x1
+	.2byte	0x1c0
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x2ab2
+	.uleb128 0x3c
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x1c0
+	.4byte	0x25f
+	.uleb128 0x3c
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x1c1
+	.4byte	0x1825
+	.uleb128 0x4b
+	.4byte	.LASF424
+	.byte	0x1
+	.2byte	0x1c2
+	.4byte	0x54
+	.uleb128 0x4b
+	.4byte	.LASF386
+	.byte	0x1
+	.2byte	0x1c2
+	.4byte	0x94
+	.uleb128 0x4d
+	.4byte	.LASF434
+	.byte	0x1
+	.2byte	0x1c4
+	.4byte	0xa3
+	.uleb128 0x4d
+	.4byte	.LASF429
+	.byte	0x1
+	.2byte	0x1c4
+	.4byte	0xa3
+	.uleb128 0x4c
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x1c5
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x52
+	.4byte	.LASF435
+	.byte	0x1
+	.byte	0xed
+	.4byte	0x54
+	.8byte	.LFB269
+	.8byte	.LFE269-.LFB269
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x39ba
+	.uleb128 0x53
+	.string	"dev"
+	.byte	0x1
+	.byte	0xed
+	.4byte	0x25f
+	.4byte	.LLST30
+	.uleb128 0x53
+	.string	"otp"
+	.byte	0x1
+	.byte	0xee
+	.4byte	0x1825
+	.4byte	.LLST31
+	.uleb128 0x54
+	.4byte	.LASF424
+	.byte	0x1
+	.byte	0xef
+	.4byte	0x54
+	.4byte	.LLST32
+	.uleb128 0x54
+	.4byte	.LASF386
+	.byte	0x1
+	.byte	0xef
+	.4byte	0xa3
+	.4byte	.LLST33
+	.uleb128 0x55
+	.string	"ret"
+	.byte	0x1
+	.byte	0xf1
+	.4byte	0x54
+	.4byte	.LLST34
+	.uleb128 0x56
+	.4byte	.LASF425
+	.byte	0x1
+	.byte	0xf2
+	.4byte	0x197b
+	.4byte	.LLST35
+	.uleb128 0x57
+	.4byte	.LASF432
+	.4byte	0x39ca
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.7671
+	.uleb128 0x58
+	.4byte	.LASF438
+	.byte	0x1
+	.2byte	0x1b9
+	.8byte	.L39
+	.uleb128 0x45
+	.8byte	.LBB40
+	.8byte	.LBE40-.LBB40
+	.4byte	0x2b76
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x106
+	.4byte	0xae
+	.4byte	.LLST36
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB41
+	.8byte	.LBE41-.LBB41
+	.4byte	0x2b9c
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x107
+	.4byte	0xae
+	.4byte	.LLST37
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB42
+	.8byte	.LBE42-.LBB42
+	.4byte	0x2bc2
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x108
+	.4byte	0xae
+	.4byte	.LLST38
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB43
+	.8byte	.LBE43-.LBB43
+	.4byte	0x2be8
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x109
+	.4byte	0xae
+	.4byte	.LLST39
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB44
+	.8byte	.LBE44-.LBB44
+	.4byte	0x2c0e
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10a
+	.4byte	0xae
+	.4byte	.LLST40
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB45
+	.8byte	.LBE45-.LBB45
+	.4byte	0x2c34
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10b
+	.4byte	0xae
+	.4byte	.LLST41
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB46
+	.8byte	.LBE46-.LBB46
+	.4byte	0x2c5a
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10c
+	.4byte	0xae
+	.4byte	.LLST42
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB47
+	.8byte	.LBE47-.LBB47
+	.4byte	0x2c80
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10d
+	.4byte	0xae
+	.4byte	.LLST43
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0
+	.4byte	0x2c9a
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10e
+	.4byte	0xae
+	.4byte	.LLST44
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB50
+	.8byte	.LBE50-.LBB50
+	.4byte	0x2cbf
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x115
+	.4byte	0xae
+	.sleb128 -65522
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB51
+	.8byte	.LBE51-.LBB51
+	.4byte	0x2ce2
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x116
+	.4byte	0xae
+	.byte	0xf0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB52
+	.8byte	.LBE52-.LBB52
+	.4byte	0x2d05
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x117
+	.4byte	0xae
+	.byte	0x1
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB53
+	.8byte	.LBE53-.LBB53
+	.4byte	0x2d28
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x118
+	.4byte	0xae
+	.byte	0x7a
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB54
+	.8byte	.LBE54-.LBB54
+	.4byte	0x2d4b
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x119
+	.4byte	0xae
+	.byte	0x25
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB55
+	.8byte	.LBE55-.LBB55
+	.4byte	0x2d6e
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11a
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB56
+	.8byte	.LBE56-.LBB56
+	.4byte	0x2d91
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11b
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB57
+	.8byte	.LBE57-.LBB57
+	.4byte	0x2db4
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11c
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB58
+	.8byte	.LBE58-.LBB58
+	.4byte	0x2dd7
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11d
+	.4byte	0xae
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB59
+	.8byte	.LBE59-.LBB59
+	.4byte	0x2dfa
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11e
+	.4byte	0xae
+	.byte	0xb
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB60
+	.8byte	.LBE60-.LBB60
+	.4byte	0x2e1d
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11f
+	.4byte	0xae
+	.byte	0x8
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB61
+	.8byte	.LBE61-.LBB61
+	.4byte	0x2e40
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x120
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB62
+	.8byte	.LBE62-.LBB62
+	.4byte	0x2e63
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x121
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB63
+	.8byte	.LBE63-.LBB63
+	.4byte	0x2e86
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x122
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x30
+	.4byte	0x2e9e
+	.uleb128 0x5b
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x123
+	.4byte	0xae
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x60
+	.4byte	0x2eb8
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0xae
+	.4byte	.LLST45
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x90
+	.4byte	0x2ed2
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x125
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB70
+	.8byte	.LBE70-.LBB70
+	.4byte	0x2ef7
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12c
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB71
+	.8byte	.LBE71-.LBB71
+	.4byte	0x2f1a
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12d
+	.4byte	0xae
+	.byte	0xfa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB72
+	.8byte	.LBE72-.LBB72
+	.4byte	0x2f3d
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12e
+	.4byte	0xae
+	.byte	0x9
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0xc0
+	.4byte	0x2f57
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12f
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB75
+	.8byte	.LBE75-.LBB75
+	.4byte	0x2f7d
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x136
+	.4byte	0xae
+	.sleb128 -16762368
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB76
+	.8byte	.LBE76-.LBB76
+	.4byte	0x2fa2
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x137
+	.4byte	0xae
+	.sleb128 -65522
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB77
+	.8byte	.LBE77-.LBB77
+	.4byte	0x2fc5
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xae
+	.byte	0xf0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB78
+	.8byte	.LBE78-.LBB78
+	.4byte	0x2fe8
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x139
+	.4byte	0xae
+	.byte	0x1
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB79
+	.8byte	.LBE79-.LBB79
+	.4byte	0x300b
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13a
+	.4byte	0xae
+	.byte	0x7a
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB80
+	.8byte	.LBE80-.LBB80
+	.4byte	0x302e
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13b
+	.4byte	0xae
+	.byte	0x15
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB81
+	.8byte	.LBE81-.LBB81
+	.4byte	0x3051
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13c
+	.4byte	0xae
+	.byte	0xdc
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB82
+	.8byte	.LBE82-.LBB82
+	.4byte	0x3074
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13d
+	.4byte	0xae
+	.byte	0x92
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB83
+	.8byte	.LBE83-.LBB83
+	.4byte	0x3097
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13e
+	.4byte	0xae
+	.byte	0x79
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB84
+	.8byte	.LBE84-.LBB84
+	.4byte	0x30ba
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13f
+	.4byte	0xae
+	.byte	0x81
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB85
+	.8byte	.LBE85-.LBB85
+	.4byte	0x30dd
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x140
+	.4byte	0xae
+	.byte	0x7e
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB86
+	.8byte	.LBE86-.LBB86
+	.4byte	0x3100
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x141
+	.4byte	0xae
+	.byte	0x21
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB87
+	.8byte	.LBE87-.LBB87
+	.4byte	0x3123
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x142
+	.4byte	0xae
+	.byte	0x11
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB88
+	.8byte	.LBE88-.LBB88
+	.4byte	0x3146
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x143
+	.4byte	0xae
+	.byte	0x9d
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB89
+	.8byte	.LBE89-.LBB89
+	.4byte	0x3169
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x144
+	.4byte	0xae
+	.byte	0x2
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB90
+	.8byte	.LBE90-.LBB90
+	.4byte	0x318c
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x145
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB91
+	.8byte	.LBE91-.LBB91
+	.4byte	0x31af
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x146
+	.4byte	0xae
+	.byte	0x40
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0xf0
+	.4byte	0x31c9
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x147
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB94
+	.8byte	.LBE94-.LBB94
+	.4byte	0x31ee
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x14e
+	.4byte	0xae
+	.sleb128 -65534
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB95
+	.8byte	.LBE95-.LBB95
+	.4byte	0x3211
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x14f
+	.4byte	0xae
+	.byte	0xfc
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB96
+	.8byte	.LBE96-.LBB96
+	.4byte	0x3234
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x150
+	.4byte	0xae
+	.byte	0xa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB97
+	.8byte	.LBE97-.LBB97
+	.4byte	0x3257
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x151
+	.4byte	0xae
+	.byte	0x70
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x120
+	.4byte	0x3271
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x152
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB100
+	.8byte	.LBE100-.LBB100
+	.4byte	0x3297
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x159
+	.4byte	0xae
+	.sleb128 -16776704
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB101
+	.8byte	.LBE101-.LBB101
+	.4byte	0x32bc
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15a
+	.4byte	0xae
+	.sleb128 -65534
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB102
+	.8byte	.LBE102-.LBB102
+	.4byte	0x32df
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15b
+	.4byte	0xae
+	.byte	0xc0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x150
+	.4byte	0x32f9
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15c
+	.4byte	0xae
+	.4byte	.LLST46
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x180
+	.4byte	0x3313
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15d
+	.4byte	0xae
+	.4byte	.LLST47
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x1b0
+	.4byte	0x332d
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15e
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB109
+	.8byte	.LBE109-.LBB109
+	.4byte	0x3352
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x165
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB110
+	.8byte	.LBE110-.LBB110
+	.4byte	0x3375
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x166
+	.4byte	0xae
+	.byte	0xe0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB111
+	.8byte	.LBE111-.LBB111
+	.4byte	0x3398
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x167
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x1e0
+	.4byte	0x33b2
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x168
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB114
+	.8byte	.LBE114-.LBB114
+	.4byte	0x33d7
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x16f
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB115
+	.8byte	.LBE115-.LBB115
+	.4byte	0x33fd
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x170
+	.4byte	0xae
+	.sleb128 -16762368
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB116
+	.8byte	.LBE116-.LBB116
+	.4byte	0x3420
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x171
+	.4byte	0xae
+	.byte	0xff
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB117
+	.8byte	.LBE117-.LBB117
+	.4byte	0x3443
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xae
+	.byte	0xa
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x210
+	.4byte	0x345d
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x173
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB120
+	.8byte	.LBE120-.LBB120
+	.4byte	0x3482
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17a
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB121
+	.8byte	.LBE121-.LBB121
+	.4byte	0x34a5
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17b
+	.4byte	0xae
+	.byte	0x1
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB122
+	.8byte	.LBE122-.LBB122
+	.4byte	0x34c8
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17c
+	.4byte	0xae
+	.byte	0xbf
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x240
+	.4byte	0x34e2
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17d
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB125
+	.8byte	.LBE125-.LBB125
+	.4byte	0x3507
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18a
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB126
+	.8byte	.LBE126-.LBB126
+	.4byte	0x352a
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18b
+	.4byte	0xae
+	.byte	0x2
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB127
+	.8byte	.LBE127-.LBB127
+	.4byte	0x354d
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18c
+	.4byte	0xae
+	.byte	0xbf
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x270
+	.4byte	0x3567
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18d
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB130
+	.8byte	.LBE130-.LBB130
+	.4byte	0x358c
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19a
+	.4byte	0xae
+	.sleb128 -65533
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB131
+	.8byte	.LBE131-.LBB131
+	.4byte	0x35b2
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19b
+	.4byte	0xae
+	.sleb128 -16776704
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB132
+	.8byte	.LBE132-.LBB132
+	.4byte	0x35d7
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19c
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB133
+	.8byte	.LBE133-.LBB133
+	.4byte	0x35fa
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19d
+	.4byte	0xae
+	.byte	0x2
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB134
+	.8byte	.LBE134-.LBB134
+	.4byte	0x361d
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19e
+	.4byte	0xae
+	.byte	0x80
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x2a0
+	.4byte	0x3637
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19f
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB137
+	.8byte	.LBE137-.LBB137
+	.4byte	0x365c
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a6
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB138
+	.8byte	.LBE138-.LBB138
+	.4byte	0x367f
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a7
+	.4byte	0xae
+	.byte	0xa0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB139
+	.8byte	.LBE139-.LBB139
+	.4byte	0x36a2
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a8
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x36bc
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a9
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB142
+	.8byte	.LBE142-.LBB142
+	.4byte	0x36df
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1b0
+	.4byte	0xae
+	.byte	0xfa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB143
+	.8byte	.LBE143-.LBB143
+	.4byte	0x3702
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1b1
+	.4byte	0xae
+	.byte	0x9
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x300
+	.4byte	0x371c
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1b2
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL67
+	.4byte	0x42a5
+	.4byte	0x3735
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL69
+	.4byte	0x42b1
+	.4byte	0x375d
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC4
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x5
+	.byte	0x88
+	.sleb128 0
+	.byte	0x9
+	.byte	0xfe
+	.byte	0x1a
+	.byte	0
+	.uleb128 0x47
+	.8byte	.LVL74
+	.4byte	0x3771
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL83
+	.4byte	0x4018
+	.4byte	0x3796
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL85
+	.4byte	0x42b1
+	.uleb128 0x47
+	.8byte	.LVL86
+	.4byte	0x37b7
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL104
+	.4byte	0x4018
+	.4byte	0x37dc
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL110
+	.4byte	0x4018
+	.4byte	0x3801
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL130
+	.4byte	0x4018
+	.4byte	0x3827
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL137
+	.4byte	0x4018
+	.4byte	0x384d
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL146
+	.4byte	0x4018
+	.4byte	0x3873
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL152
+	.4byte	0x4018
+	.4byte	0x3899
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL160
+	.4byte	0x4018
+	.4byte	0x38bf
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL167
+	.4byte	0x4018
+	.4byte	0x38e5
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL169
+	.4byte	0x3f43
+	.4byte	0x3905
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3ce0
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL176
+	.4byte	0x4018
+	.4byte	0x392b
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL178
+	.4byte	0x3fad
+	.4byte	0x394b
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d2a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL187
+	.4byte	0x4018
+	.4byte	0x3971
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL193
+	.4byte	0x4018
+	.4byte	0x3997
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL198
+	.4byte	0x4018
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x39ca
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x25
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x39ba
+	.uleb128 0x52
+	.4byte	.LASF436
+	.byte	0x1
+	.byte	0xae
+	.4byte	0x54
+	.8byte	.LFB268
+	.8byte	.LFE268-.LFB268
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3c05
+	.uleb128 0x53
+	.string	"dev"
+	.byte	0x1
+	.byte	0xae
+	.4byte	0x25f
+	.4byte	.LLST55
+	.uleb128 0x54
+	.4byte	.LASF424
+	.byte	0x1
+	.byte	0xae
+	.4byte	0x54
+	.4byte	.LLST56
+	.uleb128 0x53
+	.string	"buf"
+	.byte	0x1
+	.byte	0xaf
+	.4byte	0x137
+	.4byte	.LLST57
+	.uleb128 0x54
+	.4byte	.LASF51
+	.byte	0x1
+	.byte	0xaf
+	.4byte	0x54
+	.4byte	.LLST58
+	.uleb128 0x55
+	.string	"otp"
+	.byte	0x1
+	.byte	0xb1
+	.4byte	0x1825
+	.4byte	.LLST59
+	.uleb128 0x56
+	.4byte	.LASF386
+	.byte	0x1
+	.byte	0xb2
+	.4byte	0x197b
+	.4byte	.LLST60
+	.uleb128 0x56
+	.4byte	.LASF437
+	.byte	0x1
+	.byte	0xb3
+	.4byte	0x11c6
+	.4byte	.LLST61
+	.uleb128 0x56
+	.4byte	.LASF429
+	.byte	0x1
+	.byte	0xb4
+	.4byte	0xa3
+	.4byte	.LLST62
+	.uleb128 0x55
+	.string	"ret"
+	.byte	0x1
+	.byte	0xb5
+	.4byte	0x54
+	.4byte	.LLST63
+	.uleb128 0x57
+	.4byte	.LASF432
+	.4byte	0x3c15
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.7636
+	.uleb128 0x5d
+	.4byte	.LASF439
+	.byte	0x1
+	.byte	0xe3
+	.8byte	.L60
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x330
+	.4byte	0x3ab2
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xc0
+	.4byte	0xae
+	.4byte	.LLST64
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x360
+	.4byte	0x3acb
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xd0
+	.4byte	0xae
+	.4byte	.LLST65
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x390
+	.4byte	0x3ae4
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xd2
+	.4byte	0xae
+	.4byte	.LLST66
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB176
+	.8byte	.LBE176-.LBB176
+	.4byte	0x3b09
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xda
+	.4byte	0xa3
+	.4byte	.LLST68
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x3c0
+	.4byte	0x3b22
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xe4
+	.4byte	0xae
+	.4byte	.LLST67
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL213
+	.4byte	0x4283
+	.4byte	0x3b3a
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL216
+	.4byte	0x42a5
+	.4byte	0x3b52
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.byte	0
+	.uleb128 0x47
+	.8byte	.LVL219
+	.4byte	0x3b66
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL220
+	.4byte	0x3c1a
+	.4byte	0x3b7e
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL222
+	.4byte	0x42c8
+	.4byte	0x3b96
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x32
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL224
+	.4byte	0x42b1
+	.uleb128 0x34
+	.8byte	.LVL233
+	.4byte	0x4018
+	.4byte	0x3bc8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x34
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL236
+	.4byte	0x42b1
+	.4byte	0x3bf4
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC11
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR3
+	.byte	0
+	.uleb128 0x5e
+	.8byte	.LVL237
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x3c15
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x16
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x3c05
+	.uleb128 0x5f
+	.4byte	.LASF440
+	.byte	0x1
+	.byte	0x98
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3cbb
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x98
+	.4byte	0x1825
+	.uleb128 0x61
+	.4byte	.LASF268
+	.byte	0x1
+	.byte	0x99
+	.4byte	0x144
+	.uleb128 0x62
+	.string	"ret"
+	.byte	0x1
+	.byte	0x9b
+	.4byte	0x54
+	.uleb128 0x4e
+	.4byte	.LASF432
+	.4byte	0x3ccb
+	.4byte	.LASF440
+	.uleb128 0x50
+	.4byte	0x3c69
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x9d
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3c7a
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x9e
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3c8b
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x9f
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3c9c
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0xa1
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3cad
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0xa3
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0xa5
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x3ccb
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1e
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x3cbb
+	.uleb128 0x5f
+	.4byte	.LASF441
+	.byte	0x1
+	.byte	0x81
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3d1a
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x81
+	.4byte	0x1825
+	.uleb128 0x63
+	.4byte	.LASF442
+	.byte	0x1
+	.byte	0x83
+	.4byte	0x54
+	.uleb128 0x63
+	.4byte	.LASF429
+	.byte	0x1
+	.byte	0x84
+	.4byte	0x54
+	.uleb128 0x62
+	.string	"ret"
+	.byte	0x1
+	.byte	0x85
+	.4byte	0x54
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x88
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.4byte	.LASF443
+	.byte	0x1
+	.byte	0x6a
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3d64
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x6a
+	.4byte	0x1825
+	.uleb128 0x63
+	.4byte	.LASF442
+	.byte	0x1
+	.byte	0x6c
+	.4byte	0x54
+	.uleb128 0x63
+	.4byte	.LASF429
+	.byte	0x1
+	.byte	0x6d
+	.4byte	0x54
+	.uleb128 0x62
+	.string	"ret"
+	.byte	0x1
+	.byte	0x6e
+	.4byte	0x54
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x71
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.4byte	.LASF444
+	.byte	0x1
+	.byte	0x56
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3dc1
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x56
+	.4byte	0x1825
+	.uleb128 0x61
+	.4byte	.LASF445
+	.byte	0x1
+	.byte	0x57
+	.4byte	0xae
+	.uleb128 0x63
+	.4byte	.LASF442
+	.byte	0x1
+	.byte	0x59
+	.4byte	0x54
+	.uleb128 0x4e
+	.4byte	.LASF432
+	.4byte	0x2a47
+	.4byte	.LASF444
+	.uleb128 0x50
+	.4byte	0x3db3
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x5b
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x65
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF449
+	.byte	0x1
+	.byte	0x4e
+	.8byte	.LFB263
+	.8byte	.LFE263-.LFB263
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3e36
+	.uleb128 0x65
+	.4byte	.LASF446
+	.byte	0x1
+	.byte	0x4e
+	.4byte	0x11d2
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x54
+	.4byte	.LASF447
+	.byte	0x1
+	.byte	0x4f
+	.4byte	0x11d2
+	.4byte	.LLST0
+	.uleb128 0x65
+	.4byte	.LASF448
+	.byte	0x1
+	.byte	0x50
+	.4byte	0x3b
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x65
+	.4byte	.LASF424
+	.byte	0x1
+	.byte	0x50
+	.4byte	0x54
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x66
+	.8byte	.LBB22
+	.8byte	.LBE22-.LBB22
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x52
+	.4byte	0xae
+	.4byte	0x1000000
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF450
+	.byte	0x1
+	.byte	0x42
+	.8byte	.LFB262
+	.8byte	.LFE262-.LFB262
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3f29
+	.uleb128 0x54
+	.4byte	.LASF446
+	.byte	0x1
+	.byte	0x42
+	.4byte	0x11d2
+	.4byte	.LLST16
+	.uleb128 0x54
+	.4byte	.LASF447
+	.byte	0x1
+	.byte	0x43
+	.4byte	0x11d2
+	.4byte	.LLST17
+	.uleb128 0x54
+	.4byte	.LASF448
+	.byte	0x1
+	.byte	0x44
+	.4byte	0x3b
+	.4byte	.LLST18
+	.uleb128 0x54
+	.4byte	.LASF424
+	.byte	0x1
+	.byte	0x44
+	.4byte	0x54
+	.4byte	.LLST19
+	.uleb128 0x45
+	.8byte	.LBB25
+	.8byte	.LBE25-.LBB25
+	.4byte	0x3eb4
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x47
+	.4byte	0xae
+	.4byte	0x1000100
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB26
+	.8byte	.LBE26-.LBB26
+	.4byte	0x3ed9
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x48
+	.4byte	0xae
+	.4byte	0x20002
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB27
+	.8byte	.LBE27-.LBB27
+	.4byte	0x3efe
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x4a
+	.4byte	0xae
+	.4byte	0x20000
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL32
+	.4byte	0x42c8
+	.4byte	0x3f15
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.uleb128 0x68
+	.8byte	.LVL34
+	.4byte	0x42c8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.LASF462
+	.byte	0x1a
+	.2byte	0x36f
+	.byte	0x3
+	.4byte	0x3f43
+	.uleb128 0x3c
+	.string	"ptr"
+	.byte	0x1a
+	.2byte	0x36f
+	.4byte	0x137
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3cd0
+	.8byte	.LFB278
+	.8byte	.LFE278-.LFB278
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3fad
+	.uleb128 0x6b
+	.4byte	0x3ce0
+	.uleb128 0x42
+	.4byte	0x3ceb
+	.4byte	.LLST20
+	.uleb128 0x42
+	.4byte	0x3cf6
+	.4byte	.LLST21
+	.uleb128 0x44
+	.4byte	0x3d01
+	.uleb128 0x45
+	.8byte	.LBB28
+	.8byte	.LBE28-.LBB28
+	.4byte	0x3f99
+	.uleb128 0x42
+	.4byte	0x3d0d
+	.4byte	.LLST22
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL40
+	.4byte	0x42c8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3d1a
+	.8byte	.LFB279
+	.8byte	.LFE279-.LFB279
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x4018
+	.uleb128 0x6b
+	.4byte	0x3d2a
+	.uleb128 0x42
+	.4byte	0x3d35
+	.4byte	.LLST23
+	.uleb128 0x42
+	.4byte	0x3d40
+	.4byte	.LLST24
+	.uleb128 0x6c
+	.4byte	0x3d4b
+	.sleb128 -1
+	.uleb128 0x45
+	.8byte	.LBB29
+	.8byte	.LBE29-.LBB29
+	.4byte	0x4004
+	.uleb128 0x42
+	.4byte	0x3d57
+	.4byte	.LLST25
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL48
+	.4byte	0x42c8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3d64
+	.8byte	.LFB280
+	.8byte	.LFE280-.LFB280
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x4105
+	.uleb128 0x3a
+	.4byte	0x3d7f
+	.4byte	.LLST26
+	.uleb128 0x6b
+	.4byte	0x3d74
+	.uleb128 0x42
+	.4byte	0x3d8a
+	.4byte	.LLST27
+	.uleb128 0x44
+	.4byte	0x3d95
+	.uleb128 0x45
+	.8byte	.LBB36
+	.8byte	.LBE36-.LBB36
+	.4byte	0x406e
+	.uleb128 0x42
+	.4byte	0x3da7
+	.4byte	.LLST28
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB37
+	.8byte	.LBE37-.LBB37
+	.4byte	0x408d
+	.uleb128 0x42
+	.4byte	0x3db4
+	.4byte	.LLST29
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB38
+	.8byte	.LBE38-.LBB38
+	.4byte	0x40f1
+	.uleb128 0x6b
+	.4byte	0x3d7f
+	.uleb128 0x6b
+	.4byte	0x3d74
+	.uleb128 0x66
+	.8byte	.LBB39
+	.8byte	.LBE39-.LBB39
+	.uleb128 0x44
+	.4byte	0x3d8a
+	.uleb128 0x44
+	.4byte	0x3d95
+	.uleb128 0x36
+	.8byte	.LVL63
+	.4byte	0x42b1
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC3
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL60
+	.4byte	0x42c8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3c1a
+	.8byte	.LFB267
+	.8byte	.LFE267-.LFB267
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x4283
+	.uleb128 0x3a
+	.4byte	0x3c2a
+	.4byte	.LLST48
+	.uleb128 0x3a
+	.4byte	0x3c35
+	.4byte	.LLST49
+	.uleb128 0x42
+	.4byte	0x3c40
+	.4byte	.LLST50
+	.uleb128 0x44
+	.4byte	0x3c4b
+	.uleb128 0x45
+	.8byte	.LBB160
+	.8byte	.LBE160-.LBB160
+	.4byte	0x415f
+	.uleb128 0x6c
+	.4byte	0x3c5d
+	.sleb128 -16776704
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB161
+	.8byte	.LBE161-.LBB161
+	.4byte	0x417d
+	.uleb128 0x6c
+	.4byte	0x3c6e
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB162
+	.8byte	.LBE162-.LBB162
+	.4byte	0x4199
+	.uleb128 0x6d
+	.4byte	0x3c7f
+	.byte	0xfa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB163
+	.8byte	.LBE163-.LBB163
+	.4byte	0x41b8
+	.uleb128 0x42
+	.4byte	0x3c90
+	.4byte	.LLST51
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB164
+	.8byte	.LBE164-.LBB164
+	.4byte	0x41d7
+	.uleb128 0x42
+	.4byte	0x3cae
+	.4byte	.LLST52
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB165
+	.8byte	.LBE165-.LBB165
+	.4byte	0x4243
+	.uleb128 0x3a
+	.4byte	0x3c2a
+	.4byte	.LLST53
+	.uleb128 0x3a
+	.4byte	0x3c35
+	.4byte	.LLST54
+	.uleb128 0x66
+	.8byte	.LBB166
+	.8byte	.LBE166-.LBB166
+	.uleb128 0x44
+	.4byte	0x4132
+	.uleb128 0x44
+	.4byte	0x413b
+	.uleb128 0x36
+	.8byte	.LVL209
+	.4byte	0x42b1
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR2
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB167
+	.8byte	.LBE167-.LBB167
+	.4byte	0x425f
+	.uleb128 0x6d
+	.4byte	0x3ca1
+	.byte	0x9
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL205
+	.4byte	0x4018
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d74
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.byte	0
+	.uleb128 0x6e
+	.4byte	.LASF451
+	.4byte	.LASF451
+	.byte	0x8
+	.2byte	0x115
+	.uleb128 0x6f
+	.4byte	.LASF452
+	.4byte	.LASF452
+	.byte	0x20
+	.byte	0x85
+	.uleb128 0x6f
+	.4byte	.LASF453
+	.4byte	.LASF453
+	.byte	0x20
+	.byte	0x38
+	.uleb128 0x6e
+	.4byte	.LASF454
+	.4byte	.LASF454
+	.byte	0x8
+	.2byte	0x16e
+	.uleb128 0x6f
+	.4byte	.LASF455
+	.4byte	.LASF455
+	.byte	0x21
+	.byte	0x13
+	.uleb128 0x6e
+	.4byte	.LASF456
+	.4byte	.LASF456
+	.byte	0x1a
+	.2byte	0x393
+	.uleb128 0x6f
+	.4byte	.LASF457
+	.4byte	.LASF457
+	.byte	0x22
+	.byte	0xb
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x26
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.uleb128 0x1
+	.byte	0x1
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0x21
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0xc
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xe
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0xf
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x10
+	.uleb128 0x26
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x12
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x13
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x14
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x15
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x16
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x17
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x18
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1a
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1b
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x1c
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1d
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1e
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x1f
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x20
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x21
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x22
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x23
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x24
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x25
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x26
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x27
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x28
+	.uleb128 0x35
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x29
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x2b
+	.uleb128 0x17
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2c
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2d
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2e
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2f
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x30
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x33
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x34
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.uleb128 0x410a
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x18
+	.uleb128 0x2111
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x36
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x37
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x3a
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3c
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3d
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3e
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x40
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x41
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x42
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x43
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x44
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x47
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x48
+	.uleb128 0x410a
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2111
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4d
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4e
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x34
+	.uleb128 0x19
+	.uleb128 0x1c
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x4f
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0xb
+	.byte	0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x52
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x55
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x56
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x57
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x34
+	.uleb128 0x19
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x5b
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0x6
+	.byte	0
+	.byte	0
+	.uleb128 0x5d
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x60
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x62
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x63
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x65
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x66
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.byte	0
+	.byte	0
+	.uleb128 0x67
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0x6
+	.byte	0
+	.byte	0
+	.uleb128 0x68
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6b
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x6d
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x6e
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x6f
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST14:
+	.8byte	.LVL19
+	.8byte	.LVL20-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL20-1
+	.8byte	.LVL27
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL27
+	.8byte	.LFE277
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST15:
+	.8byte	.LVL21
+	.8byte	.LVL22
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL22
+	.8byte	.LVL27
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST1:
+	.8byte	.LVL2
+	.8byte	.LVL3
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL3
+	.8byte	.LFE276
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST2:
+	.8byte	.LVL2
+	.8byte	.LVL5
+	.2byte	0x3
+	.byte	0x9
+	.byte	0xea
+	.byte	0x9f
+	.8byte	.LVL6
+	.8byte	.LFE276
+	.2byte	0x3
+	.byte	0x9
+	.byte	0xea
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST3:
+	.8byte	.LVL4
+	.8byte	.LVL5
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST4:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL8-1
+	.8byte	.LVL11
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL11
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST5:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL8-1
+	.8byte	.LVL11
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL11
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL8-1
+	.8byte	.LVL10
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL10
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST7:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL8-1
+	.8byte	.LVL10
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL10
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST8:
+	.8byte	.LVL8
+	.8byte	.LVL9
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST9:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL14-1
+	.8byte	.LVL17
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL17
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST10:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL14-1
+	.8byte	.LVL17
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL17
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST11:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL14-1
+	.8byte	.LVL16
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL16
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST12:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL14-1
+	.8byte	.LVL16
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL16
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST13:
+	.8byte	.LVL14
+	.8byte	.LVL15
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST69:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL247-1
+	.8byte	.LVL254
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL254
+	.8byte	.LVL257
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST70:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL247-1
+	.8byte	.LVL253
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL253
+	.8byte	.LVL257
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST71:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL247-1
+	.8byte	.LVL256
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	.LVL256
+	.8byte	.LVL257
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 80
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	0
+	.8byte	0
+.LLST72:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL247-1
+	.8byte	.LVL252
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL252
+	.8byte	.LVL257
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LVL261
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL261
+	.8byte	.LVL267
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL267
+	.8byte	.LVL281
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL281
+	.8byte	.LVL283
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL283
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL287
+	.8byte	.LVL396
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL396
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST73:
+	.8byte	.LVL248
+	.8byte	.LVL249
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL249
+	.8byte	.LVL255
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST74:
+	.8byte	.LVL248
+	.8byte	.LVL256
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	.LVL256
+	.8byte	.LVL257
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 80
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	0
+	.8byte	0
+.LLST76:
+	.8byte	.LVL250
+	.8byte	.LVL251
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL257
+	.8byte	.LVL258
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL258
+	.8byte	.LVL260
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL267
+	.8byte	.LVL272
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL285
+	.8byte	.LVL286
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST77:
+	.8byte	.LVL261
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL269
+	.8byte	.LVL270
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL272
+	.8byte	.LVL278
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL286
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL288
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL394
+	.8byte	.LVL395
+	.2byte	0x3
+	.byte	0x87
+	.sleb128 1
+	.byte	0x9f
+	.8byte	.LVL396
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST78:
+	.8byte	.LVL250
+	.8byte	.LVL251
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LVL268
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL268
+	.8byte	.LVL269
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL272
+	.8byte	.LVL280
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL283
+	.8byte	.LVL315
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST79:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL288
+	.8byte	.LVL313
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL317
+	.8byte	.LVL352
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST80:
+	.8byte	.LVL262
+	.8byte	.LVL264
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL264
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST81:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST82:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST83:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL288
+	.8byte	.LVL311
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL311
+	.8byte	.LVL312
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL312
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL317
+	.8byte	.LVL318
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL318
+	.8byte	.LVL337
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL337
+	.8byte	.LVL338
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL338
+	.8byte	.LVL339
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL339
+	.8byte	.LVL340
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL340
+	.8byte	.LVL346
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL346
+	.8byte	.LVL347
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL347
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL348
+	.8byte	.LVL349
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL349
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL356
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL357
+	.8byte	.LVL358
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL358
+	.8byte	.LVL359
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL359
+	.8byte	.LVL365
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL365
+	.8byte	.LVL366
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL366
+	.8byte	.LVL367
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL367
+	.8byte	.LVL368
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL368
+	.8byte	.LVL374
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL374
+	.8byte	.LVL375
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL375
+	.8byte	.LVL376
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL376
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL377
+	.8byte	.LVL379
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL379
+	.8byte	.LVL380
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL380
+	.8byte	.LVL381
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL381
+	.8byte	.LVL382
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL382
+	.8byte	.LVL387
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL387
+	.8byte	.LVL388
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL388
+	.8byte	.LVL389
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL389
+	.8byte	.LVL390
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL392
+	.8byte	.LVL393
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL393
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST84:
+	.8byte	.LVL264
+	.8byte	.LVL265
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL265
+	.8byte	.LVL267
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 232
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 232
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 232
+	.8byte	0
+	.8byte	0
+.LLST85:
+	.8byte	.LVL289
+	.8byte	.LVL316
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST86:
+	.8byte	.LVL290
+	.8byte	.LVL316
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST87:
+	.8byte	.LVL291
+	.8byte	.LVL316
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST88:
+	.8byte	.LVL292
+	.8byte	.LVL316
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST89:
+	.8byte	.LVL293
+	.8byte	.LVL316
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65522
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65522
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST90:
+	.8byte	.LVL294
+	.8byte	.LVL316
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xf0
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xf0
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST91:
+	.8byte	.LVL295
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST92:
+	.8byte	.LVL296
+	.8byte	.LVL316
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7a
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST93:
+	.8byte	.LVL297
+	.8byte	.LVL316
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x25
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x25
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST94:
+	.8byte	.LVL298
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST95:
+	.8byte	.LVL299
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST96:
+	.8byte	.LVL300
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST97:
+	.8byte	.LVL301
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x4f
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x4f
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST98:
+	.8byte	.LVL302
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x3b
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x3b
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST99:
+	.8byte	.LVL303
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x38
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x38
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST100:
+	.8byte	.LVL304
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST101:
+	.8byte	.LVL305
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST102:
+	.8byte	.LVL306
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST103:
+	.8byte	.LVL307
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST104:
+	.8byte	.LVL308
+	.8byte	.LVL313
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL317
+	.8byte	.LVL332
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST105:
+	.8byte	.LVL309
+	.8byte	.LVL316
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST106:
+	.8byte	.LVL314
+	.8byte	.LVL316
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65533
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST107:
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16762368
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST108:
+	.8byte	.LVL319
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xf0
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST109:
+	.8byte	.LVL320
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST110:
+	.8byte	.LVL321
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST111:
+	.8byte	.LVL322
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x45
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST112:
+	.8byte	.LVL323
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xdc
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST113:
+	.8byte	.LVL324
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x92
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST114:
+	.8byte	.LVL325
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x79
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST115:
+	.8byte	.LVL326
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x81
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST116:
+	.8byte	.LVL327
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7e
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST117:
+	.8byte	.LVL328
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x21
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST118:
+	.8byte	.LVL329
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x41
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST119:
+	.8byte	.LVL330
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x9d
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST120:
+	.8byte	.LVL331
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x32
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST121:
+	.8byte	.LVL333
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST122:
+	.8byte	.LVL334
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST123:
+	.8byte	.LVL335
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST124:
+	.8byte	.LVL339
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST125:
+	.8byte	.LVL341
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65535
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST126:
+	.8byte	.LVL342
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xfb
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST127:
+	.8byte	.LVL343
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST128:
+	.8byte	.LVL344
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST129:
+	.8byte	.LVL348
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST130:
+	.8byte	.LVL350
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xc0
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST131:
+	.8byte	.LVL351
+	.8byte	.LVL354
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST132:
+	.8byte	.LVL352
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST133:
+	.8byte	.LVL353
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST134:
+	.8byte	.LVL358
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16762368
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST135:
+	.8byte	.LVL360
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65535
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST136:
+	.8byte	.LVL361
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xff
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST137:
+	.8byte	.LVL362
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x3a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST138:
+	.8byte	.LVL363
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST139:
+	.8byte	.LVL367
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST140:
+	.8byte	.LVL369
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST141:
+	.8byte	.LVL370
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xbf
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST142:
+	.8byte	.LVL371
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST143:
+	.8byte	.LVL372
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST144:
+	.8byte	.LVL381
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65535
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST145:
+	.8byte	.LVL383
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x32
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST146:
+	.8byte	.LVL384
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xbf
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST147:
+	.8byte	.LVL385
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST148:
+	.8byte	.LVL273
+	.8byte	.LVL276
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL283
+	.8byte	.LVL284
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST149:
+	.8byte	.LVL273
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST150:
+	.8byte	.LVL273
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST151:
+	.8byte	.LVL273
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST152:
+	.8byte	.LVL275
+	.8byte	.LVL276
+	.2byte	0xd
+	.byte	0x8f
+	.sleb128 254
+	.byte	0x94
+	.byte	0x2
+	.byte	0x20
+	.byte	0x87
+	.sleb128 0
+	.byte	0x8
+	.byte	0xff
+	.byte	0x1a
+	.byte	0x1a
+	.byte	0x9f
+	.8byte	.LVL283
+	.8byte	.LVL284
+	.2byte	0xf
+	.byte	0x8f
+	.sleb128 254
+	.byte	0x94
+	.byte	0x2
+	.byte	0x20
+	.byte	0x87
+	.sleb128 0
+	.byte	0x8
+	.byte	0xff
+	.byte	0x1a
+	.byte	0x38
+	.byte	0x24
+	.byte	0x1a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST153:
+	.8byte	.LVL274
+	.8byte	.LVL277
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST30:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL67-1
+	.8byte	.LFE269
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST31:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL67-1
+	.8byte	.LVL72
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL72
+	.8byte	.LVL73
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL73
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST32:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL67-1
+	.8byte	.LVL67
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL67
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL71
+	.8byte	.LVL73
+	.2byte	0x6
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x31
+	.byte	0x26
+	.byte	0x9f
+	.8byte	.LVL73
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST33:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL67-1
+	.8byte	.LVL70
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL70
+	.8byte	.LFE269
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST34:
+	.8byte	.LVL66
+	.8byte	.LVL70
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL73
+	.8byte	.LVL83
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL83
+	.8byte	.LVL84
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL87
+	.8byte	.LVL88
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL104
+	.8byte	.LVL106
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL110
+	.8byte	.LVL112
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL130
+	.8byte	.LVL132
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL137
+	.8byte	.LVL139
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL146
+	.8byte	.LVL148
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL152
+	.8byte	.LVL154
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL160
+	.8byte	.LVL162
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL167
+	.8byte	.LVL168
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL169
+	.8byte	.LVL170
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL171
+	.8byte	.LVL172
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL176
+	.8byte	.LVL177
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL178
+	.8byte	.LVL179
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL180
+	.8byte	.LVL181
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL187
+	.8byte	.LVL189
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL193
+	.8byte	.LVL195
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL198
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST35:
+	.8byte	.LVL67
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL68
+	.8byte	.LVL69
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL73
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST36:
+	.8byte	.LVL74
+	.8byte	.LVL86
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST37:
+	.8byte	.LVL75
+	.8byte	.LVL86
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL76
+	.8byte	.LVL86
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST39:
+	.8byte	.LVL77
+	.8byte	.LVL86
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST40:
+	.8byte	.LVL78
+	.8byte	.LVL86
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST41:
+	.8byte	.LVL79
+	.8byte	.LVL86
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xfc
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xfc
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL80
+	.8byte	.LVL86
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL81
+	.8byte	.LVL86
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST44:
+	.8byte	.LVL82
+	.8byte	.LVL86
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST45:
+	.8byte	.LVL102
+	.8byte	.LVL104-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL104-1
+	.8byte	.LVL165
+	.2byte	0x6
+	.byte	0x88
+	.sleb128 0
+	.byte	0x9
+	.byte	0xf7
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST46:
+	.8byte	.LVL142
+	.8byte	.LVL145
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST47:
+	.8byte	.LVL143
+	.8byte	.LVL159
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL159
+	.8byte	.LFE269
+	.2byte	0xa
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0xa
+	.2byte	0xffff
+	.byte	0x1a
+	.byte	0x38
+	.byte	0x25
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST55:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL213-1
+	.8byte	.LVL221
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL221
+	.8byte	.LVL227
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL228
+	.8byte	.LFE268
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST56:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL213-1
+	.8byte	.LVL217
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL217
+	.8byte	.LVL225
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL227
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST57:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL213-1
+	.8byte	.LVL222
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL222
+	.8byte	.LVL227
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL228
+	.8byte	.LFE268
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST58:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL213-1
+	.8byte	.LVL222
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL222
+	.8byte	.LVL226
+	.2byte	0x3
+	.byte	0x87
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL228
+	.8byte	.LVL244
+	.2byte	0x3
+	.byte	0x87
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL244
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST59:
+	.8byte	.LVL214
+	.8byte	.LVL215
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL215
+	.8byte	.LVL225
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL227
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST60:
+	.8byte	.LVL217
+	.8byte	.LVL218
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL218
+	.8byte	.LVL226
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL227
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST61:
+	.8byte	.LVL217
+	.8byte	.LVL224
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL227
+	.8byte	.LVL236
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL238
+	.8byte	.LVL241
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL241
+	.8byte	.LVL242
+	.2byte	0x3
+	.byte	0x85
+	.sleb128 1
+	.byte	0x9f
+	.8byte	.LVL242
+	.8byte	.LVL245
+	.2byte	0x3
+	.byte	0x85
+	.sleb128 2
+	.byte	0x9f
+	.8byte	.LVL245
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST62:
+	.8byte	.LVL241
+	.8byte	.LVL243
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST63:
+	.8byte	.LVL217
+	.8byte	.LVL222
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL222
+	.8byte	.LVL223
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL228
+	.8byte	.LVL234
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL234
+	.8byte	.LVL235
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL235
+	.8byte	.LVL238
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL238
+	.8byte	.LVL239
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL239
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST64:
+	.8byte	.LVL220
+	.8byte	.LVL227
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL228
+	.8byte	.LFE268
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST65:
+	.8byte	.LVL229
+	.8byte	.LVL231
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL231
+	.8byte	.LVL232
+	.2byte	0x6
+	.byte	0x84
+	.sleb128 0
+	.byte	0x6
+	.byte	0x23
+	.uleb128 0x104
+	.8byte	.LVL232
+	.8byte	.LVL236
+	.2byte	0x8
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x21
+	.byte	0x9f
+	.8byte	.LVL238
+	.8byte	.LFE268
+	.2byte	0x8
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x21
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST66:
+	.8byte	.LVL230
+	.8byte	.LVL236
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL238
+	.8byte	.LFE268
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST68:
+	.8byte	.LVL240
+	.8byte	.LVL243
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST67:
+	.8byte	.LVL236
+	.8byte	.LVL238
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST0:
+	.8byte	.LVL0
+	.8byte	.LVL1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1
+	.8byte	.LFE263
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST16:
+	.8byte	.LVL28
+	.8byte	.LVL31
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL31
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST17:
+	.8byte	.LVL28
+	.8byte	.LVL29
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL29
+	.8byte	.LVL33
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL33
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST18:
+	.8byte	.LVL28
+	.8byte	.LVL32-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL32-1
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL28
+	.8byte	.LVL32-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL32-1
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST20:
+	.8byte	.LVL35
+	.8byte	.LVL38
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL38
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL39
+	.8byte	.LVL41
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL41
+	.8byte	.LVL42
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST21:
+	.8byte	.LVL37
+	.8byte	.LVL40-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL41
+	.8byte	.LFE278
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST22:
+	.8byte	.LVL36
+	.8byte	.LVL40-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL41
+	.8byte	.LFE278
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST23:
+	.8byte	.LVL43
+	.8byte	.LVL46
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL46
+	.8byte	.LVL48
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL48
+	.8byte	.LVL50
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL51
+	.8byte	.LFE279
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST24:
+	.8byte	.LVL45
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL49
+	.8byte	.LVL50
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL51
+	.8byte	.LVL52
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL44
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL49
+	.8byte	.LVL50
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL51
+	.8byte	.LVL52
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST26:
+	.8byte	.LVL53
+	.8byte	.LVL54
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL54
+	.8byte	.LVL56
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL56
+	.8byte	.LVL58
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL58
+	.8byte	.LVL64
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL64
+	.8byte	.LFE280
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL54
+	.8byte	.LVL60
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL60
+	.8byte	.LVL61
+	.2byte	0x3
+	.byte	0x84
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL61
+	.8byte	.LVL65
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST28:
+	.8byte	.LVL55
+	.8byte	.LVL57
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL58
+	.8byte	.LVL59
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST29:
+	.8byte	.LVL56
+	.8byte	.LVL58
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST48:
+	.8byte	.LVL199
+	.8byte	.LVL205-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL205-1
+	.8byte	.LVL211
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL211
+	.8byte	.LFE267
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST49:
+	.8byte	.LVL199
+	.8byte	.LVL203
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL203
+	.8byte	.LFE267
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST50:
+	.8byte	.LVL199
+	.8byte	.LVL206
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL206
+	.8byte	.LVL208
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL208
+	.8byte	.LVL210
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL210
+	.8byte	.LVL211
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL211
+	.8byte	.LFE267
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST51:
+	.8byte	.LVL202
+	.8byte	.LVL204
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST52:
+	.8byte	.LVL204
+	.8byte	.LVL211
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST53:
+	.8byte	.LVL207
+	.8byte	.LVL209
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST54:
+	.8byte	.LVL207
+	.8byte	.LVL209
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+	.section	.debug_aranges,"",@progbits
+	.4byte	0xec
+	.2byte	0x2
+	.4byte	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.2byte	0
+	.2byte	0
+	.8byte	.LFB263
+	.8byte	.LFE263-.LFB263
+	.8byte	.LFB276
+	.8byte	.LFE276-.LFB276
+	.8byte	.LFB274
+	.8byte	.LFE274-.LFB274
+	.8byte	.LFB273
+	.8byte	.LFE273-.LFB273
+	.8byte	.LFB277
+	.8byte	.LFE277-.LFB277
+	.8byte	.LFB262
+	.8byte	.LFE262-.LFB262
+	.8byte	.LFB278
+	.8byte	.LFE278-.LFB278
+	.8byte	.LFB279
+	.8byte	.LFE279-.LFB279
+	.8byte	.LFB280
+	.8byte	.LFE280-.LFB280
+	.8byte	.LFB269
+	.8byte	.LFE269-.LFB269
+	.8byte	.LFB267
+	.8byte	.LFE267-.LFB267
+	.8byte	.LFB268
+	.8byte	.LFE268-.LFB268
+	.8byte	.LFB272
+	.8byte	.LFE272-.LFB272
+	.8byte	0
+	.8byte	0
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.8byte	.LBB48
+	.8byte	.LBE48
+	.8byte	.LBB49
+	.8byte	.LBE49
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB64
+	.8byte	.LBE64
+	.8byte	.LBB66
+	.8byte	.LBE66
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB65
+	.8byte	.LBE65
+	.8byte	.LBB67
+	.8byte	.LBE67
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB68
+	.8byte	.LBE68
+	.8byte	.LBB69
+	.8byte	.LBE69
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB73
+	.8byte	.LBE73
+	.8byte	.LBB74
+	.8byte	.LBE74
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB92
+	.8byte	.LBE92
+	.8byte	.LBB93
+	.8byte	.LBE93
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB98
+	.8byte	.LBE98
+	.8byte	.LBB99
+	.8byte	.LBE99
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB103
+	.8byte	.LBE103
+	.8byte	.LBB105
+	.8byte	.LBE105
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB104
+	.8byte	.LBE104
+	.8byte	.LBB106
+	.8byte	.LBE106
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB107
+	.8byte	.LBE107
+	.8byte	.LBB108
+	.8byte	.LBE108
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB112
+	.8byte	.LBE112
+	.8byte	.LBB113
+	.8byte	.LBE113
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB118
+	.8byte	.LBE118
+	.8byte	.LBB119
+	.8byte	.LBE119
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB123
+	.8byte	.LBE123
+	.8byte	.LBB124
+	.8byte	.LBE124
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB128
+	.8byte	.LBE128
+	.8byte	.LBB129
+	.8byte	.LBE129
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB135
+	.8byte	.LBE135
+	.8byte	.LBB136
+	.8byte	.LBE136
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB140
+	.8byte	.LBE140
+	.8byte	.LBB141
+	.8byte	.LBE141
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB144
+	.8byte	.LBE144
+	.8byte	.LBB145
+	.8byte	.LBE145
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB168
+	.8byte	.LBE168
+	.8byte	.LBB169
+	.8byte	.LBE169
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB170
+	.8byte	.LBE170
+	.8byte	.LBB171
+	.8byte	.LBE171
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB172
+	.8byte	.LBE172
+	.8byte	.LBB173
+	.8byte	.LBE173
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB174
+	.8byte	.LBE174
+	.8byte	.LBB175
+	.8byte	.LBE175
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB244
+	.8byte	.LBE244
+	.8byte	.LBB324
+	.8byte	.LBE324
+	.8byte	.LBB325
+	.8byte	.LBE325
+	.8byte	.LBB335
+	.8byte	.LBE335
+	.8byte	.LBB336
+	.8byte	.LBE336
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB264
+	.8byte	.LBE264
+	.8byte	.LBB266
+	.8byte	.LBE266
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB265
+	.8byte	.LBE265
+	.8byte	.LBB267
+	.8byte	.LBE267
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB268
+	.8byte	.LBE268
+	.8byte	.LBB269
+	.8byte	.LBE269
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB270
+	.8byte	.LBE270
+	.8byte	.LBB271
+	.8byte	.LBE271
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB288
+	.8byte	.LBE288
+	.8byte	.LBB289
+	.8byte	.LBE289
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB294
+	.8byte	.LBE294
+	.8byte	.LBB295
+	.8byte	.LBE295
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB298
+	.8byte	.LBE298
+	.8byte	.LBB300
+	.8byte	.LBE300
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB299
+	.8byte	.LBE299
+	.8byte	.LBB301
+	.8byte	.LBE301
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB302
+	.8byte	.LBE302
+	.8byte	.LBB303
+	.8byte	.LBE303
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB308
+	.8byte	.LBE308
+	.8byte	.LBB309
+	.8byte	.LBE309
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB314
+	.8byte	.LBE314
+	.8byte	.LBB315
+	.8byte	.LBE315
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB326
+	.8byte	.LBE326
+	.8byte	.LBB332
+	.8byte	.LBE332
+	.8byte	.LBB333
+	.8byte	.LBE333
+	.8byte	.LBB334
+	.8byte	.LBE334
+	.8byte	.LBB337
+	.8byte	.LBE337
+	.8byte	0
+	.8byte	0
+	.8byte	.LFB263
+	.8byte	.LFE263
+	.8byte	.LFB276
+	.8byte	.LFE276
+	.8byte	.LFB274
+	.8byte	.LFE274
+	.8byte	.LFB273
+	.8byte	.LFE273
+	.8byte	.LFB277
+	.8byte	.LFE277
+	.8byte	.LFB262
+	.8byte	.LFE262
+	.8byte	.LFB278
+	.8byte	.LFE278
+	.8byte	.LFB279
+	.8byte	.LFE279
+	.8byte	.LFB280
+	.8byte	.LFE280
+	.8byte	.LFB269
+	.8byte	.LFE269
+	.8byte	.LFB267
+	.8byte	.LFE267
+	.8byte	.LFB268
+	.8byte	.LFE268
+	.8byte	.LFB272
+	.8byte	.LFE272
+	.8byte	0
+	.8byte	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF222:
+	.string	"UCLASS_SERIAL"
+.LASF319:
+	.string	"gd_t"
+.LASF15:
+	.string	"long int"
+.LASF39:
+	.string	"uclass_node"
+.LASF422:
+	.string	"request"
+.LASF312:
+	.string	"phandle"
+.LASF53:
+	.string	"flash_id"
+.LASF404:
+	.string	"misc_ops"
+.LASF376:
+	.string	"mem_malloc_start"
+.LASF332:
+	.string	"net_hostname"
+.LASF28:
+	.string	"name"
+.LASF248:
+	.string	"UCLASS_ETH_PHY"
+.LASF229:
+	.string	"UCLASS_THERMAL"
+.LASF60:
+	.string	"base"
+.LASF354:
+	.string	"NETLOOP_RESTART"
+.LASF287:
+	.string	"new_gd"
+.LASF348:
+	.string	"net_boot_file_size"
+.LASF134:
+	.string	"fit_hdr_os"
+.LASF181:
+	.string	"UCLASS_FIRMWARE"
+.LASF457:
+	.string	"udelay"
+.LASF142:
+	.string	"fit_noffset_fdt"
+.LASF74:
+	.string	"bi_dsp_freq"
+.LASF303:
+	.string	"malloc_ptr"
+.LASF91:
+	.string	"_datarellocal_start_ofs"
+.LASF94:
+	.string	"fdt32_t"
+.LASF146:
+	.string	"rd_start"
+.LASF371:
+	.string	"property"
+.LASF265:
+	.string	"tlb_emerg"
+.LASF78:
+	.string	"bi_enetaddr"
+.LASF290:
+	.string	"uclass_root"
+.LASF188:
+	.string	"UCLASS_IRQ"
+.LASF420:
+	.string	"rockchip_secure_otp_ofdata_to_platdata"
+.LASF437:
+	.string	"buffer"
+.LASF234:
+	.string	"UCLASS_USB_HUB"
+.LASF230:
+	.string	"UCLASS_TIMER"
+.LASF42:
+	.string	"flags"
+.LASF139:
+	.string	"fit_noffset_rd"
+.LASF269:
+	.string	"baudrate"
+.LASF334:
+	.string	"net_ethaddr"
+.LASF300:
+	.string	"timebase_l"
+.LASF21:
+	.string	"errno"
+.LASF32:
+	.string	"node"
+.LASF359:
+	.string	"bind"
+.LASF455:
+	.string	"printf"
+.LASF401:
+	.string	"DECOM_ZLIB"
+.LASF8:
+	.string	"unsigned int"
+.LASF47:
+	.string	"next"
+.LASF101:
+	.string	"version"
+.LASF396:
+	.string	"per_device_platdata_auto_alloc_size"
+.LASF131:
+	.string	"legacy_hdr_os_copy"
+.LASF195:
+	.string	"UCLASS_MMC"
+.LASF289:
+	.string	"dm_root_f"
+.LASF340:
+	.string	"net_rx_packet"
+.LASF38:
+	.string	"parent_priv"
+.LASF176:
+	.string	"UCLASS_CROS_EC"
+.LASF310:
+	.string	"console_evt"
+.LASF191:
+	.string	"UCLASS_LPC"
+.LASF105:
+	.string	"size_dt_struct"
+.LASF379:
+	.string	"p_current"
+.LASF344:
+	.string	"net_our_vlan"
+.LASF22:
+	.string	"___strtok"
+.LASF67:
+	.string	"bi_memsize"
+.LASF121:
+	.string	"image_info"
+.LASF200:
+	.string	"UCLASS_NVME"
+.LASF156:
+	.string	"bootm_headers_t"
+.LASF252:
+	.string	"UCLASS_RNG"
+.LASF249:
+	.string	"UCLASS_MDIO"
+.LASF187:
+	.string	"UCLASS_IDE"
+.LASF273:
+	.string	"bus_clk"
+.LASF377:
+	.string	"mem_malloc_end"
+.LASF225:
+	.string	"UCLASS_SPI_FLASH"
+.LASF189:
+	.string	"UCLASS_KEYBOARD"
+.LASF72:
+	.string	"bi_sramsize"
+.LASF185:
+	.string	"UCLASS_I2C_MUX"
+.LASF297:
+	.string	"fdt_blob_kern"
+.LASF277:
+	.string	"env_addr"
+.LASF48:
+	.string	"prev"
+.LASF227:
+	.string	"UCLASS_SYSCON"
+.LASF171:
+	.string	"UCLASS_BLK"
+.LASF212:
+	.string	"UCLASS_PWRSEQ"
+.LASF132:
+	.string	"legacy_hdr_valid"
+.LASF264:
+	.string	"tlb_fillptr"
+.LASF82:
+	.string	"bi_arch_number"
+.LASF323:
+	.string	"load_addr"
+.LASF291:
+	.string	"fdt_blob"
+.LASF328:
+	.string	"net_gateway"
+.LASF166:
+	.string	"UCLASS_PCI_EMUL"
+.LASF424:
+	.string	"offset"
+.LASF426:
+	.string	"secure_otp_read"
+.LASF349:
+	.string	"net_boot_file_expected_size_in_blocks"
+.LASF403:
+	.string	"OTP_NS"
+.LASF414:
+	.string	"spl_rockchip_otp_start"
+.LASF206:
+	.string	"UCLASS_PHY"
+.LASF454:
+	.string	"dev_get_driver_data"
+.LASF3:
+	.string	"signed char"
+.LASF203:
+	.string	"UCLASS_PCH"
+.LASF100:
+	.string	"off_mem_rsvmap"
+.LASF163:
+	.string	"UCLASS_TEST_PROBE"
+.LASF149:
+	.string	"ft_len"
+.LASF19:
+	.string	"uint32_t"
+.LASF384:
+	.string	"udevice_id"
+.LASF325:
+	.string	"save_size"
+.LASF439:
+	.string	"read_end"
+.LASF378:
+	.string	"mem_malloc_brk"
+.LASF124:
+	.string	"load"
+.LASF143:
+	.string	"fit_hdr_setup"
+.LASF299:
+	.string	"timebase_h"
+.LASF160:
+	.string	"UCLASS_TEST"
+.LASF87:
+	.string	"IRQ_STACK_START"
+.LASF419:
+	.string	"_u_boot_list_2_driver_2_rockchip_secure_otp"
+.LASF125:
+	.string	"comp"
+.LASF70:
+	.string	"bi_flashoffset"
+.LASF201:
+	.string	"UCLASS_PANEL"
+.LASF266:
+	.string	"pre_serial"
+.LASF36:
+	.string	"uclass"
+.LASF162:
+	.string	"UCLASS_TEST_BUS"
+.LASF460:
+	.string	"/home/lxh/uboot/u-boot"
+.LASF238:
+	.string	"UCLASS_VIDEO_CONSOLE"
+.LASF360:
+	.string	"probe"
+.LASF10:
+	.string	"long long unsigned int"
+.LASF260:
+	.string	"lastinc"
+.LASF388:
+	.string	"post_bind"
+.LASF284:
+	.string	"irq_sp"
+.LASF449:
+	.string	"rk3528_spl_rockchip_otp_stop"
+.LASF197:
+	.string	"UCLASS_MTD"
+.LASF216:
+	.string	"UCLASS_RESET"
+.LASF117:
+	.string	"ih_type"
+.LASF80:
+	.string	"bi_intfreq"
+.LASF172:
+	.string	"UCLASS_CLK"
+.LASF350:
+	.string	"net_ping_ip"
+.LASF79:
+	.string	"bi_ethspeed"
+.LASF375:
+	.string	"ofnode"
+.LASF435:
+	.string	"rk3528_secure_otp_write_2_bytes_noecc"
+.LASF231:
+	.string	"UCLASS_TPM"
+.LASF315:
+	.string	"child"
+.LASF443:
+	.string	"rockchip_secure_otp_wait_flag"
+.LASF456:
+	.string	"malloc_simple"
+.LASF59:
+	.string	"lmb_property"
+.LASF268:
+	.string	"enable"
+.LASF262:
+	.string	"tlb_addr"
+.LASF373:
+	.string	"value"
+.LASF184:
+	.string	"UCLASS_I2C_GENERIC"
+.LASF99:
+	.string	"off_dt_strings"
+.LASF418:
+	.string	"rockchip_otp_ids"
+.LASF103:
+	.string	"boot_cpuid_phys"
+.LASF361:
+	.string	"remove"
+.LASF133:
+	.string	"fit_uname_cfg"
+.LASF106:
+	.string	"working_fdt"
+.LASF316:
+	.string	"sibling"
+.LASF118:
+	.string	"ih_comp"
+.LASF202:
+	.string	"UCLASS_PANEL_BACKLIGHT"
+.LASF81:
+	.string	"bi_busfreq"
+.LASF296:
+	.string	"ufdt_blob"
+.LASF279:
+	.string	"ram_top"
+.LASF271:
+	.string	"global_data"
+.LASF327:
+	.string	"s_addr"
+.LASF127:
+	.string	"arch"
+.LASF226:
+	.string	"UCLASS_SPI_GENERIC"
+.LASF317:
+	.string	"mtd_info"
+.LASF95:
+	.string	"fdt_header"
+.LASF177:
+	.string	"UCLASS_DISPLAY"
+.LASF390:
+	.string	"pre_probe"
+.LASF352:
+	.string	"net_loop_state"
+.LASF55:
+	.string	"protect"
+.LASF306:
+	.string	"video_bottom"
+.LASF438:
+	.string	"write_end"
+.LASF71:
+	.string	"bi_sramstart"
+.LASF224:
+	.string	"UCLASS_SPMI"
+.LASF220:
+	.string	"UCLASS_SCMI_AGENT"
+.LASF23:
+	.string	"_Bool"
+.LASF12:
+	.string	"phys_size_t"
+.LASF45:
+	.string	"udevice"
+.LASF37:
+	.string	"uclass_priv"
+.LASF123:
+	.string	"image_len"
+.LASF318:
+	.string	"jt_funcs"
+.LASF408:
+	.string	"call"
+.LASF330:
+	.string	"net_dns_server"
+.LASF427:
+	.string	"rk3528_secure_otp_write"
+.LASF397:
+	.string	"__invalid_size_argument_for_IOC"
+.LASF57:
+	.string	"flash_info"
+.LASF462:
+	.string	"free"
+.LASF288:
+	.string	"dm_root"
+.LASF108:
+	.string	"ih_magic"
+.LASF218:
+	.string	"UCLASS_RAMDISK"
+.LASF450:
+	.string	"rk3528_spl_rockchip_otp_start"
+.LASF26:
+	.string	"_binary_u_boot_bin_end"
+.LASF141:
+	.string	"fit_uname_fdt"
+.LASF190:
+	.string	"UCLASS_LED"
+.LASF292:
+	.string	"new_fdt"
+.LASF407:
+	.string	"ioctl"
+.LASF170:
+	.string	"UCLASS_AHCI"
+.LASF41:
+	.string	"sibling_node"
+.LASF333:
+	.string	"net_root_path"
+.LASF49:
+	.string	"block_drvr"
+.LASF9:
+	.string	"long long int"
+.LASF250:
+	.string	"UCLASS_EBC"
+.LASF324:
+	.string	"save_addr"
+.LASF35:
+	.string	"priv"
+.LASF209:
+	.string	"UCLASS_PMIC"
+.LASF302:
+	.string	"malloc_limit"
+.LASF14:
+	.string	"char"
+.LASF413:
+	.string	"secure_otp_data"
+.LASF180:
+	.string	"UCLASS_GPIO"
+.LASF44:
+	.string	"ide_bus_offset"
+.LASF254:
+	.string	"UCLASS_PD"
+.LASF52:
+	.string	"sector_count"
+.LASF145:
+	.string	"fit_noffset_setup"
+.LASF122:
+	.string	"image_start"
+.LASF56:
+	.string	"flash_info_t"
+.LASF228:
+	.string	"UCLASS_SYSRESET"
+.LASF115:
+	.string	"ih_os"
+.LASF31:
+	.string	"uclass_platdata"
+.LASF336:
+	.string	"net_ip"
+.LASF458:
+	.ascii	"GNU C11 6.3.1 201"
+	.string	"70404 -mstrict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18"
+.LASF305:
+	.string	"video_top"
+.LASF257:
+	.string	"LOGF_MAX_CATEGORIES"
+.LASF357:
+	.string	"net_state"
+.LASF459:
+	.string	"drivers/misc/rk3528-secure-otp.c"
+.LASF285:
+	.string	"start_addr_sp"
+.LASF135:
+	.string	"fit_uname_os"
+.LASF18:
+	.string	"uint8_t"
+.LASF7:
+	.string	"__u32"
+.LASF362:
+	.string	"unbind"
+.LASF283:
+	.string	"mon_len"
+.LASF356:
+	.string	"NETLOOP_FAIL"
+.LASF428:
+	.string	"data_byte"
+.LASF364:
+	.string	"child_post_bind"
+.LASF313:
+	.string	"full_name"
+.LASF214:
+	.string	"UCLASS_REGULATOR"
+.LASF183:
+	.string	"UCLASS_I2C_EEPROM"
+.LASF370:
+	.string	"per_child_platdata_auto_alloc_size"
+.LASF444:
+	.string	"rockchip_secure_otp_wait_status"
+.LASF129:
+	.string	"bootm_headers"
+.LASF275:
+	.string	"mem_clk"
+.LASF358:
+	.string	"of_match"
+.LASF351:
+	.string	"uclass_id"
+.LASF320:
+	.string	"monitor_flash_len"
+.LASF366:
+	.string	"child_post_remove"
+.LASF369:
+	.string	"per_child_auto_alloc_size"
+.LASF213:
+	.string	"UCLASS_RAM"
+.LASF293:
+	.string	"fdt_size"
+.LASF363:
+	.string	"ofdata_to_platdata"
+.LASF208:
+	.string	"UCLASS_PINCTRL"
+.LASF29:
+	.string	"platdata"
+.LASF259:
+	.string	"timer_rate_hz"
+.LASF433:
+	.string	"rk3528_secure_otp_write_byte_noecc"
+.LASF434:
+	.string	"data_2b"
+.LASF90:
+	.string	"_datarelrolocal_start_ofs"
+.LASF164:
+	.string	"UCLASS_SPI_EMUL"
+.LASF196:
+	.string	"UCLASS_MOD_EXP"
+.LASF97:
+	.string	"totalsize"
+.LASF387:
+	.string	"uclass_driver"
+.LASF73:
+	.string	"bi_arm_freq"
+.LASF199:
+	.string	"UCLASS_NORTHBRIDGE"
+.LASF235:
+	.string	"UCLASS_USB_GADGET_GENERIC"
+.LASF120:
+	.string	"image_header_t"
+.LASF68:
+	.string	"bi_flashstart"
+.LASF92:
+	.string	"_datarelro_start_ofs"
+.LASF346:
+	.string	"net_restart_wrap"
+.LASF385:
+	.string	"compatible"
+.LASF165:
+	.string	"UCLASS_I2C_EMUL"
+.LASF274:
+	.string	"pci_clk"
+.LASF173:
+	.string	"UCLASS_CPU"
+.LASF343:
+	.string	"net_null_ethaddr"
+.LASF86:
+	.string	"bd_t"
+.LASF174:
+	.string	"UCLASS_AMP"
+.LASF243:
+	.string	"UCLASS_RC"
+.LASF453:
+	.string	"dev_read_u32_default"
+.LASF337:
+	.string	"net_server_ip"
+.LASF280:
+	.string	"ram_top_ext_size"
+.LASF51:
+	.string	"size"
+.LASF58:
+	.string	"long double"
+.LASF76:
+	.string	"bi_bootflags"
+.LASF83:
+	.string	"bi_boot_params"
+.LASF441:
+	.string	"rockchip_secure_otp_check_flag"
+.LASF448:
+	.string	"mask"
+.LASF246:
+	.string	"UCLASS_IO_DOMAIN"
+.LASF25:
+	.string	"_binary_u_boot_bin_start"
+.LASF159:
+	.string	"UCLASS_DEMO"
+.LASF107:
+	.string	"image_header"
+.LASF102:
+	.string	"last_comp_version"
+.LASF321:
+	.string	"__dtb_dt_begin"
+.LASF251:
+	.string	"UCLASS_EINK_DISPLAY"
+.LASF309:
+	.string	"sys_start_tick"
+.LASF168:
+	.string	"UCLASS_SIMPLE_BUS"
+.LASF179:
+	.string	"UCLASS_ETH"
+.LASF153:
+	.string	"cmdline_end"
+.LASF75:
+	.string	"bi_ddr_freq"
+.LASF98:
+	.string	"off_dt_struct"
+.LASF440:
+	.string	"rockchip_secure_otp_ecc_enable"
+.LASF301:
+	.string	"malloc_base"
+.LASF308:
+	.string	"serial"
+.LASF386:
+	.string	"data"
+.LASF329:
+	.string	"net_netmask"
+.LASF322:
+	.string	"__dtb_dt_spl_begin"
+.LASF65:
+	.string	"bd_info"
+.LASF152:
+	.string	"cmdline_start"
+.LASF157:
+	.string	"images"
+.LASF267:
+	.string	"using_pre_serial"
+.LASF130:
+	.string	"legacy_hdr_os"
+.LASF425:
+	.string	"otp_data"
+.LASF192:
+	.string	"UCLASS_MAILBOX"
+.LASF217:
+	.string	"UCLASS_RKNAND"
+.LASF138:
+	.string	"fit_uname_rd"
+.LASF77:
+	.string	"bi_ip_addr"
+.LASF307:
+	.string	"pm_ctx_phys"
+.LASF295:
+	.string	"of_root_f"
+.LASF281:
+	.string	"relocaddr"
+.LASF33:
+	.string	"driver_data"
+.LASF0:
+	.string	"unsigned char"
+.LASF11:
+	.string	"phys_addr_t"
+.LASF389:
+	.string	"pre_unbind"
+.LASF13:
+	.string	"sizetype"
+.LASF338:
+	.string	"net_tx_packet"
+.LASF395:
+	.string	"per_device_auto_alloc_size"
+.LASF150:
+	.string	"initrd_start"
+.LASF34:
+	.string	"parent"
+.LASF380:
+	.string	"current"
+.LASF6:
+	.string	"short int"
+.LASF116:
+	.string	"ih_arch"
+.LASF400:
+	.string	"DECOM_GZIP"
+.LASF314:
+	.string	"properties"
+.LASF240:
+	.string	"UCLASS_WDT"
+.LASF442:
+	.string	"delay"
+.LASF372:
+	.string	"length"
+.LASF331:
+	.string	"net_nis_domain"
+.LASF112:
+	.string	"ih_load"
+.LASF298:
+	.string	"env_buf"
+.LASF355:
+	.string	"NETLOOP_SUCCESS"
+.LASF167:
+	.string	"UCLASS_USB_EMUL"
+.LASF429:
+	.string	"temp"
+.LASF161:
+	.string	"UCLASS_TEST_FDT"
+.LASF415:
+	.string	"spl_rockchip_otp_stop"
+.LASF445:
+	.string	"flag"
+.LASF17:
+	.string	"ulong"
+.LASF110:
+	.string	"ih_time"
+.LASF111:
+	.string	"ih_size"
+.LASF178:
+	.string	"UCLASS_DMA"
+.LASF253:
+	.string	"UCLASS_DMC"
+.LASF215:
+	.string	"UCLASS_REMOTEPROC"
+.LASF353:
+	.string	"NETLOOP_CONTINUE"
+.LASF219:
+	.string	"UCLASS_RTC"
+.LASF261:
+	.string	"timer_reset_value"
+.LASF294:
+	.string	"of_root"
+.LASF339:
+	.string	"net_rx_packets"
+.LASF194:
+	.string	"UCLASS_MISC"
+.LASF62:
+	.string	"region"
+.LASF148:
+	.string	"ft_addr"
+.LASF416:
+	.string	"rockchip_secure_otp_ops"
+.LASF405:
+	.string	"read"
+.LASF54:
+	.string	"start"
+.LASF144:
+	.string	"fit_uname_setup"
+.LASF114:
+	.string	"ih_dcrc"
+.LASF24:
+	.string	"image_base"
+.LASF392:
+	.string	"pre_remove"
+.LASF158:
+	.string	"UCLASS_ROOT"
+.LASF96:
+	.string	"magic"
+.LASF241:
+	.string	"UCLASS_FG"
+.LASF137:
+	.string	"fit_hdr_rd"
+.LASF140:
+	.string	"fit_hdr_fdt"
+.LASF113:
+	.string	"ih_ep"
+.LASF286:
+	.string	"reloc_off"
+.LASF393:
+	.string	"init"
+.LASF239:
+	.string	"UCLASS_VIDEO_CRTC"
+.LASF236:
+	.string	"UCLASS_VIDEO"
+.LASF446:
+	.string	"secure_conf"
+.LASF205:
+	.string	"UCLASS_PCI_GENERIC"
+.LASF1:
+	.string	"long unsigned int"
+.LASF5:
+	.string	"__u8"
+.LASF374:
+	.string	"of_offset"
+.LASF258:
+	.string	"arch_global_data"
+.LASF89:
+	.string	"_datarel_start_ofs"
+.LASF311:
+	.string	"device_node"
+.LASF263:
+	.string	"tlb_size"
+.LASF66:
+	.string	"bi_memstart"
+.LASF109:
+	.string	"ih_hcrc"
+.LASF104:
+	.string	"size_dt_strings"
+.LASF128:
+	.string	"image_info_t"
+.LASF63:
+	.string	"memory"
+.LASF27:
+	.string	"driver"
+.LASF147:
+	.string	"rd_end"
+.LASF193:
+	.string	"UCLASS_MASS_STORAGE"
+.LASF326:
+	.string	"in_addr"
+.LASF151:
+	.string	"initrd_end"
+.LASF210:
+	.string	"UCLASS_PWM"
+.LASF93:
+	.string	"IRQ_STACK_START_IN"
+.LASF84:
+	.string	"bi_andr_version"
+.LASF126:
+	.string	"type"
+.LASF341:
+	.string	"net_rx_packet_len"
+.LASF383:
+	.string	"u_boot_dev_head"
+.LASF431:
+	.string	"rk3528_secure_otp_write_2_bytes"
+.LASF221:
+	.string	"UCLASS_SCSI"
+.LASF16:
+	.string	"ushort"
+.LASF204:
+	.string	"UCLASS_PCI"
+.LASF198:
+	.string	"UCLASS_NOP"
+.LASF394:
+	.string	"destroy"
+.LASF447:
+	.string	"otp_cru_rst"
+.LASF247:
+	.string	"UCLASS_CRYPTO"
+.LASF452:
+	.string	"dev_read_addr_ptr"
+.LASF276:
+	.string	"have_console"
+.LASF399:
+	.string	"DECOM_LZ4"
+.LASF175:
+	.string	"UCLASS_CODEC"
+.LASF381:
+	.string	"uc_drv"
+.LASF232:
+	.string	"UCLASS_USB"
+.LASF304:
+	.string	"cur_serial_dev"
+.LASF270:
+	.string	"addr"
+.LASF46:
+	.string	"list_head"
+.LASF155:
+	.string	"state"
+.LASF20:
+	.string	"__be32"
+.LASF207:
+	.string	"UCLASS_PINCONFIG"
+.LASF233:
+	.string	"UCLASS_USB_DEV_GENERIC"
+.LASF342:
+	.string	"net_bcast_ethaddr"
+.LASF136:
+	.string	"fit_noffset_os"
+.LASF223:
+	.string	"UCLASS_SPI"
+.LASF436:
+	.string	"rk3528_secure_otp_read"
+.LASF335:
+	.string	"net_server_ethaddr"
+.LASF255:
+	.string	"UCLASS_COUNT"
+.LASF278:
+	.string	"env_valid"
+.LASF245:
+	.string	"UCLASS_DVFS"
+.LASF412:
+	.string	"otp_cru_rst_base"
+.LASF40:
+	.string	"child_head"
+.LASF50:
+	.string	"select_hwpart"
+.LASF4:
+	.string	"uchar"
+.LASF69:
+	.string	"bi_flashsize"
+.LASF382:
+	.string	"dev_head"
+.LASF409:
+	.string	"rockchip_otp_platdata"
+.LASF2:
+	.string	"short unsigned int"
+.LASF391:
+	.string	"post_probe"
+.LASF365:
+	.string	"child_pre_probe"
+.LASF421:
+	.string	"secure_otp_ioctl"
+.LASF347:
+	.string	"net_boot_file_name"
+.LASF406:
+	.string	"write"
+.LASF244:
+	.string	"UCLASS_CHARGE_DISPLAY"
+.LASF256:
+	.string	"UCLASS_INVALID"
+.LASF402:
+	.string	"OTP_S"
+.LASF432:
+	.string	"__func__"
+.LASF64:
+	.string	"reserved"
+.LASF417:
+	.string	"rk3528_data"
+.LASF182:
+	.string	"UCLASS_I2C"
+.LASF119:
+	.string	"ih_name"
+.LASF461:
+	.string	"ofnode_union"
+.LASF411:
+	.string	"otp_mask_base"
+.LASF169:
+	.string	"UCLASS_ADC"
+.LASF43:
+	.string	"req_seq"
+.LASF282:
+	.string	"ram_size"
+.LASF451:
+	.string	"dev_get_platdata"
+.LASF186:
+	.string	"UCLASS_I2S"
+.LASF367:
+	.string	"priv_auto_alloc_size"
+.LASF30:
+	.string	"parent_platdata"
+.LASF410:
+	.string	"secure_conf_base"
+.LASF154:
+	.string	"verify"
+.LASF88:
+	.string	"FIQ_STACK_START"
+.LASF85:
+	.string	"bi_dram"
+.LASF430:
+	.string	"rockchip_secure_otp_capability"
+.LASF345:
+	.string	"net_native_vlan"
+.LASF423:
+	.string	"secure_otp_write"
+.LASF211:
+	.string	"UCLASS_POWER_DOMAIN"
+.LASF398:
+	.string	"misc_mode"
+.LASF272:
+	.string	"cpu_clk"
+.LASF237:
+	.string	"UCLASS_VIDEO_BRIDGE"
+.LASF368:
+	.string	"platdata_auto_alloc_size"
+.LASF61:
+	.string	"lmb_region"
+.LASF242:
+	.string	"UCLASS_KEY"
+	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/u-boot/drivers/misc/rk3562-secure-otp.S b/u-boot/drivers/misc/rk3562-secure-otp.S
new file mode 100644
index 0000000..e3b3f34
--- /dev/null
+++ b/u-boot/drivers/misc/rk3562-secure-otp.S
@@ -0,0 +1,15906 @@
+	.arch armv8-a+nosimd
+	.file	"rk3562-secure-otp.c"
+	.text
+.Ltext0:
+	.cfi_sections	.debug_frame
+	.section	.text.rk3562_spl_rockchip_otp_stop,"ax",@progbits
+	.align	2
+	.type	rk3562_spl_rockchip_otp_stop, %function
+rk3562_spl_rockchip_otp_stop:
+.LFB263:
+	.file 1 "drivers/misc/rk3562-secure-otp.c"
+	.loc 1 81 0
+	.cfi_startproc
+.LVL0:
+.LBB22:
+	.loc 1 82 0
+#APP
+// 82 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w1, 524288
+.LVL1:
+	str	w1, [x0]
+	ret
+.LBE22:
+	.cfi_endproc
+.LFE263:
+	.size	rk3562_spl_rockchip_otp_stop, .-rk3562_spl_rockchip_otp_stop
+	.section	.text.secure_otp_ioctl,"ax",@progbits
+	.align	2
+	.type	secure_otp_ioctl, %function
+secure_otp_ioctl:
+.LFB276:
+	.loc 1 697 0
+	.cfi_startproc
+.LVL2:
+	.loc 1 700 0
+	mov	x0, 27908
+.LVL3:
+	cmp	x1, x0
+	bne	.L6
+.LVL4:
+.LBB23:
+.LBB24:
+	.loc 1 689 0
+	mov	w0, 8
+	str	w0, [x2]
+.LVL5:
+.LBE24:
+.LBE23:
+	.loc 1 702 0
+	mov	w0, 0
+	.loc 1 703 0
+	ret
+.LVL6:
+.L6:
+	.loc 1 698 0
+	mov	w0, -22
+	.loc 1 709 0
+	ret
+	.cfi_endproc
+.LFE276:
+	.size	secure_otp_ioctl, .-secure_otp_ioctl
+	.section	.text.secure_otp_write,"ax",@progbits
+	.align	2
+	.type	secure_otp_write, %function
+secure_otp_write:
+.LFB274:
+	.loc 1 681 0
+	.cfi_startproc
+.LVL7:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	mov	x19, x0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.loc 1 681 0
+	mov	w20, w1
+	mov	x21, x2
+	mov	w22, w3
+	.loc 1 682 0
+	bl	dev_get_driver_data
+.LVL8:
+	.loc 1 684 0
+	ldr	x4, [x0, 8]
+	mov	w3, w22
+	mov	x2, x21
+	mov	w1, w20
+	mov	x0, x19
+.LVL9:
+	.loc 1 685 0
+	ldp	x21, x22, [sp, 32]
+.LVL10:
+	ldp	x19, x20, [sp, 16]
+.LVL11:
+	ldp	x29, x30, [sp], 48
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	.loc 1 684 0
+	br	x4
+.LVL12:
+	.cfi_endproc
+.LFE274:
+	.size	secure_otp_write, .-secure_otp_write
+	.section	.text.secure_otp_read,"ax",@progbits
+	.align	2
+	.type	secure_otp_read, %function
+secure_otp_read:
+.LFB273:
+	.loc 1 673 0
+	.cfi_startproc
+.LVL13:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	mov	x19, x0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.loc 1 673 0
+	mov	w20, w1
+	mov	x21, x2
+	mov	w22, w3
+	.loc 1 674 0
+	bl	dev_get_driver_data
+.LVL14:
+	.loc 1 676 0
+	ldr	x4, [x0]
+	mov	w3, w22
+	mov	x2, x21
+	mov	w1, w20
+	mov	x0, x19
+.LVL15:
+	.loc 1 677 0
+	ldp	x21, x22, [sp, 32]
+.LVL16:
+	ldp	x19, x20, [sp, 16]
+.LVL17:
+	ldp	x29, x30, [sp], 48
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	.loc 1 676 0
+	br	x4
+.LVL18:
+	.cfi_endproc
+.LFE273:
+	.size	secure_otp_read, .-secure_otp_read
+	.section	.text.rockchip_secure_otp_ofdata_to_platdata,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_ofdata_to_platdata, %function
+rockchip_secure_otp_ofdata_to_platdata:
+.LFB277:
+	.loc 1 718 0
+	.cfi_startproc
+.LVL19:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 718 0
+	mov	x20, x0
+	.loc 1 719 0
+	bl	dev_get_platdata
+.LVL20:
+	mov	x19, x0
+.LVL21:
+	.loc 1 721 0
+	mov	x0, x20
+.LVL22:
+	bl	dev_read_addr_ptr
+.LVL23:
+	.loc 1 722 0
+	mov	w2, 0
+	adrp	x1, .LC0
+	.loc 1 721 0
+	str	x0, [x19]
+	.loc 1 722 0
+	add	x1, x1, :lo12:.LC0
+	mov	x0, x20
+	bl	dev_read_u32_default
+.LVL24:
+	.loc 1 723 0
+	uxtw	x0, w0
+	str	x0, [x19, 8]
+	.loc 1 724 0
+	mov	w2, 0
+	mov	x0, x20
+	adrp	x1, .LC1
+	add	x1, x1, :lo12:.LC1
+	bl	dev_read_u32_default
+.LVL25:
+	.loc 1 725 0
+	uxtw	x0, w0
+	str	x0, [x19, 16]
+	.loc 1 726 0
+	mov	w2, 0
+	mov	x0, x20
+	adrp	x1, .LC2
+	add	x1, x1, :lo12:.LC2
+	bl	dev_read_u32_default
+.LVL26:
+	.loc 1 727 0
+	uxtw	x0, w0
+	str	x0, [x19, 24]
+	.loc 1 730 0
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+.LVL27:
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE277:
+	.size	rockchip_secure_otp_ofdata_to_platdata, .-rockchip_secure_otp_ofdata_to_platdata
+	.section	.text.rk3562_spl_rockchip_otp_start,"ax",@progbits
+	.align	2
+	.type	rk3562_spl_rockchip_otp_start, %function
+rk3562_spl_rockchip_otp_start:
+.LFB262:
+	.loc 1 69 0
+	.cfi_startproc
+.LVL28:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	.loc 1 69 0
+	mov	x19, x1
+.LBB25:
+	.loc 1 71 0
+#APP
+// 71 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w1, 524296
+.LVL29:
+	str	w1, [x0]
+.LVL30:
+.LBE25:
+.LBB26:
+	.loc 1 72 0
+#APP
+// 72 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w0, 1048592
+.LVL31:
+	str	w0, [x19]
+.LBE26:
+	.loc 1 73 0
+	mov	x0, 2
+	bl	udelay
+.LVL32:
+.LBB27:
+	.loc 1 74 0
+#APP
+// 74 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	mov	w0, 1048576
+	str	w0, [x19]
+.LBE27:
+	.loc 1 76 0
+	ldr	x19, [sp, 16]
+.LVL33:
+	.loc 1 75 0
+	mov	x0, 1
+	.loc 1 76 0
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	.loc 1 75 0
+	b	udelay
+.LVL34:
+	.cfi_endproc
+.LFE262:
+	.size	rk3562_spl_rockchip_otp_start, .-rk3562_spl_rockchip_otp_start
+	.section	.text.rockchip_secure_otp_check_flag.isra.0,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_check_flag.isra.0, %function
+rockchip_secure_otp_check_flag.isra.0:
+.LFB278:
+	.loc 1 129 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 129 0
+	mov	w19, 34465
+	mov	x20, x0
+	movk	w19, 0x1, lsl 16
+.L17:
+.LVL35:
+.LBB28:
+	.loc 1 136 0
+	ldr	x0, [x20]
+	ldr	w1, [x0, 44]
+.LVL36:
+#APP
+// 136 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+.LVL37:
+#NO_APP
+.LBE28:
+	.loc 1 137 0
+	and	w0, w1, 16
+	tbz	x1, 4, .L15
+	.loc 1 140 0
+	subs	w19, w19, #1
+.LVL38:
+	beq	.L18
+.LVL39:
+	.loc 1 146 0
+	mov	x0, 1
+	bl	udelay
+.LVL40:
+	b	.L17
+.LVL41:
+.L18:
+	.loc 1 141 0
+	mov	w0, -1
+.LVL42:
+.L15:
+	.loc 1 150 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE278:
+	.size	rockchip_secure_otp_check_flag.isra.0, .-rockchip_secure_otp_check_flag.isra.0
+	.section	.text.rockchip_secure_otp_wait_flag.isra.1,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_wait_flag.isra.1, %function
+rockchip_secure_otp_wait_flag.isra.1:
+.LFB279:
+	.loc 1 106 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 106 0
+	mov	x20, x0
+	mov	w19, 20001
+.L25:
+.LVL43:
+.LBB29:
+	.loc 1 113 0
+	ldr	x0, [x20]
+	ldr	w0, [x0, 44]
+.LVL44:
+#APP
+// 113 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+.LVL45:
+#NO_APP
+.LBE29:
+	.loc 1 114 0
+	tbnz	x0, 4, .L26
+	.loc 1 117 0
+	subs	w19, w19, #1
+.LVL46:
+	beq	.L27
+	.loc 1 122 0
+	mov	x0, 1
+.LVL47:
+	bl	udelay
+.LVL48:
+	b	.L25
+.LVL49:
+.L26:
+	.loc 1 110 0
+	mov	w0, 0
+.LVL50:
+.L23:
+	.loc 1 127 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL51:
+.L27:
+	.cfi_restore_state
+	.loc 1 118 0
+	mov	w0, -1
+.LVL52:
+	b	.L23
+	.cfi_endproc
+.LFE279:
+	.size	rockchip_secure_otp_wait_flag.isra.1, .-rockchip_secure_otp_wait_flag.isra.1
+	.section	.text.rockchip_secure_otp_wait_status.isra.2,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_wait_status.isra.2, %function
+rockchip_secure_otp_wait_status.isra.2:
+.LFB280:
+	.loc 1 86 0
+	.cfi_startproc
+.LVL53:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	mov	w19, w1
+	str	x21, [sp, 32]
+	.cfi_offset 21, -16
+	.loc 1 86 0
+	mov	x21, x0
+	mov	w20, 10000
+.LVL54:
+.L30:
+.LBB36:
+	.loc 1 91 0
+	ldr	x0, [x21]
+	ldr	w0, [x0, 772]
+.LVL55:
+#APP
+// 91 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+.LBE36:
+	tst	w0, w19
+	beq	.L32
+.LBB37:
+	.loc 1 101 0
+	orr	w19, w19, -65536
+.LVL56:
+#APP
+// 101 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x21]
+.LVL57:
+	str	w19, [x0, 772]
+.LBE37:
+	.loc 1 103 0
+	mov	w0, 0
+	b	.L29
+.LVL58:
+.L32:
+	.loc 1 92 0
+	mov	x0, 1
+.LVL59:
+	bl	udelay
+.LVL60:
+	.loc 1 94 0
+	subs	w20, w20, #1
+.LVL61:
+	bne	.L30
+.LVL62:
+.LBB38:
+.LBB39:
+	.loc 1 95 0
+	adrp	x1, .LANCHOR0
+	adrp	x0, .LC3
+	add	x1, x1, :lo12:.LANCHOR0
+	add	x0, x0, :lo12:.LC3
+	bl	printf
+.LVL63:
+	mov	w0, -110
+.LVL64:
+.L29:
+.LBE39:
+.LBE38:
+	.loc 1 104 0
+	ldp	x19, x20, [sp, 16]
+.LVL65:
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE280:
+	.size	rockchip_secure_otp_wait_status.isra.2, .-rockchip_secure_otp_wait_status.isra.2
+	.section	.text.rk3562_secure_otp_write_2_bytes_noecc,"ax",@progbits
+	.align	2
+	.type	rk3562_secure_otp_write_2_bytes_noecc, %function
+rk3562_secure_otp_write_2_bytes_noecc:
+.LFB269:
+	.loc 1 240 0
+	.cfi_startproc
+.LVL66:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	mov	w24, w2
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	.loc 1 244 0
+	asr	w20, w24, 1
+	.loc 1 240 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	and	w21, w3, 65535
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	mov	x26, x1
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 27, -16
+	.cfi_offset 28, -8
+	.loc 1 242 0
+	bl	dev_get_driver_data
+.LVL67:
+	.loc 1 245 0
+	cmp	w20, 447
+	bgt	.L43
+	mov	x23, x0
+	.loc 1 249 0
+	sub	w0, w20, #416
+.LVL68:
+	cmp	w0, 15
+	ccmp	w20, 16, 4, hi
+	beq	.L37
+	.loc 1 252 0
+	adrp	x0, .LC4
+	and	w1, w24, -2
+	add	x0, x0, :lo12:.LC4
+	bl	printf
+.LVL69:
+.L43:
+	.loc 1 246 0
+	mov	w0, -1
+.LVL70:
+.L35:
+	.loc 1 446 0
+	ldp	x19, x20, [sp, 16]
+.LVL71:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+.LVL72:
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 27
+	.cfi_restore 28
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL73:
+.L37:
+	.cfi_restore_state
+	.loc 1 256 0
+	cbz	w21, .L44
+	.loc 1 259 0
+	ldr	x6, [x23, 16]
+	mov	w3, w20
+	ldp	x0, x2, [x26, 8]
+	ldr	x1, [x26, 24]
+	blr	x6
+.LVL74:
+.LBB40:
+	.loc 1 262 0
+#APP
+// 262 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 65536
+	str	w1, [x0, 256]
+.LVL75:
+.LBE40:
+.LBB41:
+	.loc 1 263 0
+#APP
+// 263 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 262148
+	str	w1, [x0, 32]
+.LVL76:
+.LBE41:
+.LBB42:
+	.loc 1 264 0
+#APP
+// 264 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, -65536
+	str	w1, [x0, 40]
+.LVL77:
+.LBE42:
+.LBB43:
+	.loc 1 265 0
+#APP
+// 265 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL78:
+.LBE43:
+.LBB44:
+	.loc 1 266 0
+#APP
+// 266 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w22, -65534
+	str	w22, [x0, 36]
+.LVL79:
+.LBE44:
+.LBB45:
+	.loc 1 267 0
+#APP
+// 267 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 252
+	str	w1, [x0, 4096]
+.LVL80:
+.LBE45:
+.LBB46:
+	.loc 1 268 0
+#APP
+// 268 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4100]
+.LVL81:
+.LBE46:
+.LBB47:
+	.loc 1 269 0
+#APP
+// 269 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4104]
+.LVL82:
+.LBE47:
+.LBB48:
+	.loc 1 270 0
+#APP
+// 270 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w19, 65537
+.LBE48:
+	.loc 1 271 0
+	mov	w1, 2
+.LBB49:
+	.loc 1 270 0
+	str	w19, [x0, 32]
+.LBE49:
+	.loc 1 271 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL83:
+	.loc 1 272 0
+	tbz	w0, #31, .L38
+.L40:
+	.loc 1 273 0
+	adrp	x1, .LANCHOR1
+	adrp	x0, .LC5
+.LVL84:
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x0, x0, :lo12:.LC5
+.L46:
+	.loc 1 406 0
+	bl	printf
+.LVL85:
+.L39:
+	.loc 1 442 0
+	ldr	x5, [x23, 24]
+	mov	w3, w20
+	ldp	x0, x2, [x26, 8]
+	ldr	x1, [x26, 24]
+	blr	x5
+.LVL86:
+.L44:
+	.loc 1 257 0
+	mov	w0, 0
+	b	.L35
+.LVL87:
+.L38:
+.LBB50:
+	.loc 1 277 0
+#APP
+// 277 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL88:
+	mov	w28, -65522
+	str	w28, [x0, 36]
+.LVL89:
+.LBE50:
+.LBB51:
+	.loc 1 278 0
+#APP
+// 278 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w27, 240
+	str	w27, [x0, 4096]
+.LVL90:
+.LBE51:
+.LBB52:
+	.loc 1 279 0
+#APP
+// 279 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL91:
+.LBE52:
+.LBB53:
+	.loc 1 280 0
+#APP
+// 280 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w25, 122
+	str	w25, [x0, 4104]
+.LVL92:
+.LBE53:
+.LBB54:
+	.loc 1 281 0
+#APP
+// 281 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 37
+	str	w1, [x0, 4108]
+.LVL93:
+.LBE54:
+.LBB55:
+	.loc 1 282 0
+#APP
+// 282 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4112]
+.LVL94:
+.LBE55:
+.LBB56:
+	.loc 1 283 0
+#APP
+// 283 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4116]
+.LVL95:
+.LBE56:
+.LBB57:
+	.loc 1 284 0
+#APP
+// 284 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4120]
+.LVL96:
+.LBE57:
+.LBB58:
+	.loc 1 285 0
+#APP
+// 285 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 31
+	str	w1, [x0, 4124]
+.LVL97:
+.LBE58:
+.LBB59:
+	.loc 1 286 0
+#APP
+// 286 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 11
+	str	w1, [x0, 4128]
+.LVL98:
+.LBE59:
+.LBB60:
+	.loc 1 287 0
+#APP
+// 287 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 8
+	str	w1, [x0, 4132]
+.LVL99:
+.LBE60:
+.LBB61:
+	.loc 1 288 0
+#APP
+// 288 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4136]
+.LVL100:
+.LBE61:
+.LBB62:
+	.loc 1 289 0
+#APP
+// 289 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4140]
+.LVL101:
+.LBE62:
+.LBB63:
+	.loc 1 290 0
+#APP
+// 290 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4144]
+.LBE63:
+.LBB64:
+	.loc 1 291 0
+	and	w0, w20, 255
+#APP
+// 291 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x26]
+.LBE64:
+.LBB65:
+	.loc 1 292 0
+	ubfx	x5, x24, 9, 8
+.LVL102:
+.LBE65:
+.LBB66:
+	.loc 1 291 0
+	str	w0, [x1, 4148]
+.LBE66:
+.LBB67:
+	.loc 1 292 0
+#APP
+// 292 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w5, [x0, 4152]
+.LVL103:
+.LBE67:
+.LBB68:
+	.loc 1 293 0
+#APP
+// 293 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE68:
+	.loc 1 294 0
+	mov	w1, 2
+.LBB69:
+	.loc 1 293 0
+	str	w19, [x0, 32]
+.LBE69:
+	.loc 1 294 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL104:
+	.loc 1 295 0
+	tbnz	w0, #31, .L40
+.LVL105:
+.LBB70:
+	.loc 1 300 0
+#APP
+// 300 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL106:
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL107:
+.LBE70:
+.LBB71:
+	.loc 1 301 0
+#APP
+// 301 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 250
+	str	w1, [x0, 4096]
+.LVL108:
+.LBE71:
+.LBB72:
+	.loc 1 302 0
+#APP
+// 302 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 9
+	str	w1, [x0, 4100]
+.LVL109:
+.LBE72:
+.LBB73:
+	.loc 1 303 0
+#APP
+// 303 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE73:
+	.loc 1 304 0
+	mov	w1, 2
+.LBB74:
+	.loc 1 303 0
+	str	w19, [x0, 32]
+.LBE74:
+	.loc 1 304 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL110:
+	.loc 1 305 0
+	tbnz	w0, #31, .L40
+.LVL111:
+.LBB75:
+	.loc 1 310 0
+#APP
+// 310 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL112:
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL113:
+.LBE75:
+.LBB76:
+	.loc 1 311 0
+#APP
+// 311 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w28, [x0, 36]
+.LVL114:
+.LBE76:
+.LBB77:
+	.loc 1 312 0
+#APP
+// 312 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w27, [x0, 4096]
+.LVL115:
+.LBE77:
+.LBB78:
+	.loc 1 313 0
+#APP
+// 313 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL116:
+.LBE78:
+.LBB79:
+	.loc 1 314 0
+#APP
+// 314 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w25, [x0, 4104]
+.LVL117:
+.LBE79:
+.LBB80:
+	.loc 1 315 0
+#APP
+// 315 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 21
+	str	w1, [x0, 4108]
+.LVL118:
+.LBE80:
+.LBB81:
+	.loc 1 316 0
+#APP
+// 316 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 220
+	str	w1, [x0, 4112]
+.LVL119:
+.LBE81:
+.LBB82:
+	.loc 1 317 0
+#APP
+// 317 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 146
+	str	w1, [x0, 4116]
+.LVL120:
+.LBE82:
+.LBB83:
+	.loc 1 318 0
+#APP
+// 318 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 121
+	str	w1, [x0, 4120]
+.LVL121:
+.LBE83:
+.LBB84:
+	.loc 1 319 0
+#APP
+// 319 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 129
+	str	w1, [x0, 4124]
+.LVL122:
+.LBE84:
+.LBB85:
+	.loc 1 320 0
+#APP
+// 320 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 126
+	str	w1, [x0, 4128]
+.LVL123:
+.LBE85:
+.LBB86:
+	.loc 1 321 0
+#APP
+// 321 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 33
+	str	w1, [x0, 4132]
+.LVL124:
+.LBE86:
+.LBB87:
+	.loc 1 322 0
+#APP
+// 322 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 17
+	str	w1, [x0, 4136]
+.LVL125:
+.LBE87:
+.LBB88:
+	.loc 1 323 0
+#APP
+// 323 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 157
+	str	w1, [x0, 4140]
+.LVL126:
+.LBE88:
+.LBB89:
+	.loc 1 324 0
+#APP
+// 324 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w25, 2
+	str	w25, [x0, 4144]
+.LVL127:
+.LBE89:
+.LBB90:
+	.loc 1 325 0
+#APP
+// 325 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4148]
+.LVL128:
+.LBE90:
+.LBB91:
+	.loc 1 326 0
+#APP
+// 326 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 64
+	str	w1, [x0, 4152]
+.LVL129:
+.LBE91:
+.LBB92:
+	.loc 1 327 0
+#APP
+// 327 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE92:
+	.loc 1 328 0
+	mov	w1, w25
+.LBB93:
+	.loc 1 327 0
+	str	w19, [x0, 32]
+.LBE93:
+	.loc 1 328 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL130:
+	.loc 1 329 0
+	tbnz	w0, #31, .L40
+.LVL131:
+.LBB94:
+	.loc 1 334 0
+#APP
+// 334 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL132:
+	str	w22, [x0, 36]
+.LVL133:
+.LBE94:
+.LBB95:
+	.loc 1 335 0
+#APP
+// 335 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 252
+	str	w1, [x0, 4096]
+.LVL134:
+.LBE95:
+.LBB96:
+	.loc 1 336 0
+#APP
+// 336 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 10
+	str	w1, [x0, 4100]
+.LVL135:
+.LBE96:
+.LBB97:
+	.loc 1 337 0
+#APP
+// 337 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 112
+	str	w1, [x0, 4104]
+.LVL136:
+.LBE97:
+.LBB98:
+	.loc 1 338 0
+#APP
+// 338 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE98:
+	.loc 1 339 0
+	mov	w1, w25
+.LBB99:
+	.loc 1 338 0
+	str	w19, [x0, 32]
+.LBE99:
+	.loc 1 339 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL137:
+	.loc 1 340 0
+	tbnz	w0, #31, .L40
+.LVL138:
+.LBB100:
+	.loc 1 345 0
+#APP
+// 345 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL139:
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL140:
+.LBE100:
+.LBB101:
+	.loc 1 346 0
+#APP
+// 346 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w22, [x0, 36]
+.LVL141:
+.LBE101:
+.LBB102:
+	.loc 1 347 0
+#APP
+// 347 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 192
+	str	w1, [x0, 4096]
+.LBE102:
+.LBB103:
+	.loc 1 348 0
+	and	w1, w21, 255
+.LVL142:
+#APP
+// 348 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE103:
+.LBB104:
+	.loc 1 349 0
+	lsr	w21, w21, 8
+.LVL143:
+.LBE104:
+.LBB105:
+	.loc 1 348 0
+	str	w1, [x0, 4100]
+.LBE105:
+.LBB106:
+	.loc 1 349 0
+#APP
+// 349 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w21, [x0, 4104]
+.LVL144:
+.LBE106:
+.LBB107:
+	.loc 1 350 0
+#APP
+// 350 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE107:
+	.loc 1 351 0
+	mov	w1, w25
+.LVL145:
+.LBB108:
+	.loc 1 350 0
+	str	w19, [x0, 32]
+.LBE108:
+	.loc 1 351 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL146:
+	.loc 1 352 0
+	tbnz	w0, #31, .L40
+.LVL147:
+.LBB109:
+	.loc 1 357 0
+#APP
+// 357 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL148:
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL149:
+.LBE109:
+.LBB110:
+	.loc 1 358 0
+#APP
+// 358 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 224
+	str	w1, [x0, 4096]
+.LVL150:
+.LBE110:
+.LBB111:
+	.loc 1 359 0
+#APP
+// 359 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4100]
+.LVL151:
+.LBE111:
+.LBB112:
+	.loc 1 360 0
+#APP
+// 360 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE112:
+	.loc 1 361 0
+	mov	w1, w25
+.LBB113:
+	.loc 1 360 0
+	str	w19, [x0, 32]
+.LBE113:
+	.loc 1 361 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL152:
+	.loc 1 362 0
+	tbnz	w0, #31, .L40
+.LVL153:
+.LBB114:
+	.loc 1 367 0
+#APP
+// 367 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL154:
+	mov	w22, -65535
+	str	w22, [x0, 36]
+.LVL155:
+.LBE114:
+.LBB115:
+	.loc 1 368 0
+#APP
+// 368 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL156:
+.LBE115:
+.LBB116:
+	.loc 1 369 0
+#APP
+// 369 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 255
+	str	w1, [x0, 4096]
+.LVL157:
+.LBE116:
+.LBB117:
+	.loc 1 370 0
+#APP
+// 370 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 10
+	str	w1, [x0, 4100]
+.LVL158:
+.LBE117:
+.LBB118:
+	.loc 1 371 0
+#APP
+// 371 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w21, 65537
+.LVL159:
+.LBE118:
+	.loc 1 372 0
+	mov	w1, w25
+.LBB119:
+	.loc 1 371 0
+	str	w21, [x0, 32]
+.LBE119:
+	.loc 1 372 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL160:
+	.loc 1 373 0
+	tbnz	w0, #31, .L40
+.LVL161:
+.LBB120:
+	.loc 1 378 0
+#APP
+// 378 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL162:
+	str	w22, [x0, 36]
+.LVL163:
+.LBE120:
+.LBB121:
+	.loc 1 379 0
+#APP
+// 379 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 1
+	str	w1, [x0, 4096]
+.LVL164:
+.LBE121:
+.LBB122:
+	.loc 1 380 0
+#APP
+// 380 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w24, 191
+.LVL165:
+	str	w24, [x0, 4100]
+.LVL166:
+.LBE122:
+.LBB123:
+	.loc 1 381 0
+#APP
+// 381 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE123:
+	.loc 1 382 0
+	mov	w1, w25
+.LBB124:
+	.loc 1 381 0
+	str	w21, [x0, 32]
+.LBE124:
+	.loc 1 382 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL167:
+	.loc 1 383 0
+	tbnz	w0, #31, .L40
+	.loc 1 388 0
+	mov	x0, x26
+.LVL168:
+	bl	rockchip_secure_otp_check_flag.isra.0
+.LVL169:
+	.loc 1 389 0
+	tbz	w0, #31, .L41
+	.loc 1 390 0
+	adrp	x1, .LANCHOR1
+	adrp	x0, .LC6
+.LVL170:
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x0, x0, :lo12:.LC6
+	b	.L46
+.LVL171:
+.L41:
+.LBB125:
+	.loc 1 394 0
+#APP
+// 394 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL172:
+	str	w22, [x0, 36]
+.LVL173:
+.LBE125:
+.LBB126:
+	.loc 1 395 0
+#APP
+// 395 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w19, 2
+	str	w19, [x0, 4096]
+.LVL174:
+.LBE126:
+.LBB127:
+	.loc 1 396 0
+#APP
+// 396 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w24, [x0, 4100]
+.LVL175:
+.LBE127:
+.LBB128:
+	.loc 1 397 0
+#APP
+// 397 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE128:
+	.loc 1 398 0
+	mov	w1, w19
+.LBB129:
+	.loc 1 397 0
+	str	w21, [x0, 32]
+.LBE129:
+	.loc 1 398 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL176:
+	.loc 1 399 0
+	tbnz	w0, #31, .L40
+	.loc 1 404 0
+	mov	x0, x26
+.LVL177:
+	bl	rockchip_secure_otp_wait_flag.isra.1
+.LVL178:
+	.loc 1 405 0
+	tbz	w0, #31, .L42
+	.loc 1 406 0
+	adrp	x1, .LANCHOR1
+	adrp	x0, .LC7
+.LVL179:
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x0, x0, :lo12:.LC7
+	b	.L46
+.LVL180:
+.L42:
+.LBB130:
+	.loc 1 410 0
+#APP
+// 410 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL181:
+	mov	w1, -65533
+	str	w1, [x0, 772]
+.LVL182:
+.LBE130:
+.LBB131:
+	.loc 1 411 0
+#APP
+// 411 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL183:
+.LBE131:
+.LBB132:
+	.loc 1 412 0
+#APP
+// 412 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w22, [x0, 36]
+.LVL184:
+.LBE132:
+.LBB133:
+	.loc 1 413 0
+#APP
+// 413 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	w19, [x0, 4096]
+.LVL185:
+.LBE133:
+.LBB134:
+	.loc 1 414 0
+#APP
+// 414 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 128
+	str	w1, [x0, 4100]
+.LVL186:
+.LBE134:
+.LBB135:
+	.loc 1 415 0
+#APP
+// 415 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE135:
+	.loc 1 416 0
+	mov	w1, w19
+.LBB136:
+	.loc 1 415 0
+	str	w21, [x0, 32]
+.LBE136:
+	.loc 1 416 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL187:
+	.loc 1 417 0
+	tbnz	w0, #31, .L40
+.LVL188:
+.LBB137:
+	.loc 1 422 0
+#APP
+// 422 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL189:
+	str	w22, [x0, 36]
+.LVL190:
+.LBE137:
+.LBB138:
+	.loc 1 423 0
+#APP
+// 423 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 160
+	str	w1, [x0, 4096]
+.LVL191:
+.LBE138:
+.LBB139:
+	.loc 1 424 0
+#APP
+// 424 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	str	wzr, [x0, 4100]
+.LVL192:
+.LBE139:
+.LBB140:
+	.loc 1 425 0
+#APP
+// 425 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE140:
+	.loc 1 426 0
+	mov	w1, w19
+.LBB141:
+	.loc 1 425 0
+	str	w21, [x0, 32]
+.LBE141:
+	.loc 1 426 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL193:
+	.loc 1 427 0
+	tbnz	w0, #31, .L40
+.LVL194:
+.LBB142:
+	.loc 1 432 0
+#APP
+// 432 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LVL195:
+	mov	w1, 250
+	str	w1, [x0, 4096]
+.LVL196:
+.LBE142:
+.LBB143:
+	.loc 1 433 0
+#APP
+// 433 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+	mov	w1, 9
+	str	w1, [x0, 4100]
+.LVL197:
+.LBE143:
+.LBB144:
+	.loc 1 434 0
+#APP
+// 434 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x26]
+.LBE144:
+	.loc 1 435 0
+	mov	w1, w19
+.LBB145:
+	.loc 1 434 0
+	str	w21, [x0, 32]
+.LBE145:
+	.loc 1 435 0
+	mov	x0, x26
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL198:
+	.loc 1 436 0
+	tbz	w0, #31, .L39
+	b	.L40
+	.cfi_endproc
+.LFE269:
+	.size	rk3562_secure_otp_write_2_bytes_noecc, .-rk3562_secure_otp_write_2_bytes_noecc
+	.section	.text.rockchip_secure_otp_ecc_enable,"ax",@progbits
+	.align	2
+	.type	rockchip_secure_otp_ecc_enable, %function
+rockchip_secure_otp_ecc_enable:
+.LFB267:
+	.loc 1 154 0
+	.cfi_startproc
+.LVL199:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	and	w1, w1, 255
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+.LBB160:
+	.loc 1 157 0
+#APP
+// 157 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x2, [x0]
+	mov	w3, 512
+	movk	w3, 0xff00, lsl 16
+	str	w3, [x2, 32]
+.LVL200:
+.LBE160:
+.LBB161:
+	.loc 1 158 0
+#APP
+// 158 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x2, [x0]
+	mov	w3, -65535
+	str	w3, [x2, 36]
+.LVL201:
+.LBE161:
+.LBB162:
+	.loc 1 159 0
+#APP
+// 159 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x2, [x0]
+	mov	w3, 250
+	str	w3, [x2, 4096]
+.LBE162:
+	.loc 1 160 0
+	cbz	w1, .L48
+.LVL202:
+.LBB163:
+	.loc 1 161 0
+#APP
+// 161 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x0]
+.LVL203:
+	str	wzr, [x1, 4100]
+.LVL204:
+.L49:
+.LBE163:
+.LBB164:
+	.loc 1 165 0
+#APP
+// 165 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x0]
+	mov	w2, 65537
+	str	w2, [x1, 32]
+.LBE164:
+	.loc 1 167 0
+	mov	w1, 2
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL205:
+	mov	w19, w0
+.LVL206:
+	.loc 1 168 0
+	tbz	w0, #31, .L47
+.LVL207:
+.LBB165:
+.LBB166:
+	.loc 1 169 0
+	adrp	x1, .LANCHOR2
+	adrp	x0, .LC8
+.LVL208:
+	add	x1, x1, :lo12:.LANCHOR2
+	add	x0, x0, :lo12:.LC8
+	bl	printf
+.LVL209:
+.L47:
+.LBE166:
+.LBE165:
+	.loc 1 172 0
+	mov	w0, w19
+	ldr	x19, [sp, 16]
+.LVL210:
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+.LVL211:
+.L48:
+	.cfi_restore_state
+.LBB167:
+	.loc 1 163 0
+#APP
+// 163 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x1, [x0]
+	mov	w2, 9
+	str	w2, [x1, 4100]
+	b	.L49
+.LBE167:
+	.cfi_endproc
+.LFE267:
+	.size	rockchip_secure_otp_ecc_enable, .-rockchip_secure_otp_ecc_enable
+	.section	.text.rk3562_secure_otp_read,"ax",@progbits
+	.align	2
+	.type	rk3562_secure_otp_read, %function
+rk3562_secure_otp_read:
+.LFB268:
+	.loc 1 176 0
+	.cfi_startproc
+.LVL212:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.loc 1 183 0
+	asr	w19, w1, 1
+	.loc 1 176 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	mov	x21, x2
+	stp	x23, x24, [sp, 48]
+	mov	x22, x0
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	mov	w23, w3
+	str	x25, [sp, 64]
+	.cfi_offset 25, -16
+	.loc 1 177 0
+	bl	dev_get_platdata
+.LVL213:
+	mov	x20, x0
+.LVL214:
+	.loc 1 178 0
+	mov	x0, x22
+.LVL215:
+	bl	dev_get_driver_data
+.LVL216:
+	.loc 1 184 0
+	ldr	x4, [x0, 16]
+	.loc 1 178 0
+	mov	x24, x0
+.LVL217:
+	.loc 1 184 0
+	ldr	x1, [x20, 24]
+	mov	w3, w19
+	ldp	x0, x2, [x20, 8]
+.LVL218:
+	blr	x4
+.LVL219:
+	.loc 1 187 0
+	sub	w1, w19, #16
+	sub	w0, w19, #416
+	cmp	w1, 15
+	ccmp	w0, 31, 0, hi
+	bhi	.L53
+	.loc 1 188 0
+	mov	w1, 0
+.L65:
+	.loc 1 190 0
+	mov	x0, x20
+	bl	rockchip_secure_otp_ecc_enable
+.LVL220:
+.LBB168:
+	.loc 1 192 0
+#APP
+// 192 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+	mov	w25, 65537
+.LBE168:
+	.loc 1 181 0
+	mov	w22, 0
+.LVL221:
+.LBB169:
+	.loc 1 192 0
+	str	w25, [x0, 256]
+.LBE169:
+	.loc 1 193 0
+	mov	x0, 50
+	bl	udelay
+.LVL222:
+.L55:
+	.loc 1 194 0
+	cbz	w23, .L60
+	.loc 1 196 0
+	cmp	w19, 447
+	ble	.L56
+	.loc 1 197 0
+	adrp	x0, .LC9
+	mov	w1, w19
+	add	x0, x0, :lo12:.LC9
+.L66:
+	.loc 1 205 0
+	mov	w22, -1
+.LVL223:
+	.loc 1 204 0
+	bl	printf
+.LVL224:
+.L52:
+	.loc 1 235 0
+	mov	w0, w22
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+.LVL225:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL226:
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL227:
+.L53:
+	.cfi_restore_state
+	.loc 1 190 0
+	mov	w1, 1
+	b	.L65
+.LVL228:
+.L56:
+	.loc 1 201 0
+	sub	w0, w19, #192
+	cmp	w0, 31
+	ccmp	w19, 16, 4, hi
+	beq	.L58
+	.loc 1 201 0 is_stmt 0 discriminator 1
+	sub	w0, w19, #416
+	cmp	w0, 15
+	bls	.L58
+	.loc 1 204 0 is_stmt 1
+	adrp	x0, .LC10
+	lsl	w1, w19, 1
+	add	x0, x0, :lo12:.LC10
+	b	.L66
+.L58:
+.LBB170:
+	.loc 1 208 0
+	orr	w1, w19, -65536
+.LVL229:
+#APP
+// 208 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+.LBE170:
+	.loc 1 209 0
+	add	w19, w19, 1
+.LVL230:
+.LBB171:
+	.loc 1 208 0
+	str	w1, [x0, 260]
+.LBE171:
+.LBB172:
+	.loc 1 210 0
+#APP
+// 210 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+.LBE172:
+	.loc 1 212 0
+	mov	w1, 4
+.LVL231:
+.LBB173:
+	.loc 1 210 0
+	str	w25, [x0, 264]
+.LVL232:
+.LBE173:
+	.loc 1 212 0
+	mov	x0, x20
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL233:
+	mov	w22, w0
+.LVL234:
+	.loc 1 213 0
+	tbz	w0, #31, .L59
+	.loc 1 214 0
+	adrp	x1, .LANCHOR3
+	adrp	x0, .LC11
+.LVL235:
+	add	x1, x1, :lo12:.LANCHOR3
+	add	x0, x0, :lo12:.LC11
+	bl	printf
+.LVL236:
+.L60:
+.LBB174:
+	.loc 1 228 0
+#APP
+// 228 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x20]
+	mov	w1, 65536
+.LBE174:
+	.loc 1 230 0
+	ldr	x2, [x20, 16]
+	mov	w3, w19
+	ldr	x4, [x24, 24]
+.LBB175:
+	.loc 1 228 0
+	str	w1, [x0, 256]
+.LBE175:
+	.loc 1 230 0
+	ldr	x0, [x20, 8]
+	ldr	x1, [x20, 24]
+	blr	x4
+.LVL237:
+	.loc 1 234 0
+	b	.L52
+.LVL238:
+.L59:
+.LBB176:
+	.loc 1 218 0
+	ldr	x0, [x20]
+.LVL239:
+	ldrh	w0, [x0, 292]
+	and	w0, w0, 65535
+.LVL240:
+#APP
+// 218 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+.LVL241:
+#NO_APP
+.LBE176:
+	.loc 1 220 0
+	strb	w0, [x21]
+	.loc 1 221 0
+	cmp	w23, 1
+	beq	.L60
+.LVL242:
+	.loc 1 222 0
+	lsr	w0, w0, 8
+.LVL243:
+	.loc 1 223 0
+	sub	w23, w23, #2
+.LVL244:
+	.loc 1 222 0
+	strb	w0, [x21, 1]
+	add	x21, x21, 2
+.LVL245:
+	b	.L55
+	.cfi_endproc
+.LFE268:
+	.size	rk3562_secure_otp_read, .-rk3562_secure_otp_read
+	.section	.text.rk3562_secure_otp_write,"ax",@progbits
+	.align	2
+	.type	rk3562_secure_otp_write, %function
+rk3562_secure_otp_write:
+.LFB272:
+	.loc 1 621 0
+	.cfi_startproc
+.LVL246:
+	stp	x29, x30, [sp, -144]!
+	.cfi_def_cfa_offset 144
+	.cfi_offset 29, -144
+	.cfi_offset 30, -136
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -128
+	.cfi_offset 20, -120
+	mov	w20, w1
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -112
+	.cfi_offset 22, -104
+	mov	w21, w3
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -96
+	.cfi_offset 24, -88
+	mov	x24, x0
+	stp	x27, x28, [sp, 80]
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 27, -64
+	.cfi_offset 28, -56
+	.cfi_offset 25, -80
+	.cfi_offset 26, -72
+	.loc 1 621 0
+	str	x2, [x29, 112]
+	.loc 1 622 0
+	bl	dev_get_platdata
+.LVL247:
+	mov	x28, x0
+.LVL248:
+	.loc 1 625 0
+	sxtw	x0, w21
+.LVL249:
+	bl	malloc_simple
+.LVL250:
+	.loc 1 628 0
+	cbnz	x0, .L68
+.LVL251:
+.L115:
+	.loc 1 643 0
+	mov	w27, -1
+.LVL252:
+.L67:
+	.loc 1 669 0
+	mov	w0, w27
+	ldp	x19, x20, [sp, 16]
+.LVL253:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL254:
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+.LVL255:
+	ldp	x29, x30, [sp], 144
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 27
+	.cfi_restore 28
+	.cfi_restore 25
+	.cfi_restore 26
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+.LVL256:
+	ret
+.LVL257:
+.L68:
+	.cfi_restore_state
+	mov	x19, x0
+	.loc 1 631 0
+	sub	w0, w20, #384
+.LVL258:
+	cmp	w0, 63
+	bls	.L70
+.LVL259:
+.L77:
+	.loc 1 649 0
+	sub	w1, w20, #832
+	sub	w0, w20, #32
+	cmp	w1, 63
+	ccmp	w0, 31, 0, hi
+	bls	.L71
+	.loc 1 659 0
+	mov	w0, 2
+.LBB244:
+.LBB245:
+	.loc 1 607 0
+	adrp	x19, .LANCHOR4
+.LVL260:
+	add	x19, x19, :lo12:.LANCHOR4
+.LBE245:
+.LBE244:
+	.loc 1 659 0
+	mov	x23, 0
+	sdiv	w0, w21, w0
+	str	w0, [x29, 108]
+.LVL261:
+.L78:
+	.loc 1 659 0 is_stmt 0 discriminator 1
+	ldr	w0, [x29, 108]
+	cmp	w0, w23
+	ble	.L97
+	.loc 1 660 0 is_stmt 1
+	ldr	x0, [x29, 112]
+	add	w21, w20, w23, lsl 1
+.LBB324:
+.LBB320:
+	.loc 1 477 0
+	asr	w25, w21, 1
+.LBE320:
+.LBE324:
+	.loc 1 660 0
+	ldrh	w26, [x0, x23, lsl 1]
+.LVL262:
+.LBB325:
+.LBB321:
+	.loc 1 475 0
+	mov	x0, x24
+	bl	dev_get_driver_data
+.LVL263:
+	str	x0, [x29, 120]
+.LVL264:
+	.loc 1 478 0
+	cmp	w25, 447
+	bgt	.L99
+	.loc 1 482 0
+	sub	w0, w25, #192
+.LVL265:
+	cmp	w0, 31
+	bls	.L85
+	.loc 1 485 0
+	adrp	x0, .LC4
+	and	w1, w21, -2
+	add	x0, x0, :lo12:.LC4
+	bl	printf
+.LVL266:
+.L99:
+	.loc 1 478 0
+	mov	w27, -1
+	b	.L84
+.LVL267:
+.L70:
+.LBE321:
+.LBE325:
+	.loc 1 633 0
+	mov	w3, w21
+	mov	x2, x19
+	mov	w1, w20
+	mov	x0, x24
+	bl	rk3562_secure_otp_read
+.LVL268:
+	.loc 1 634 0
+	cbnz	w0, .L115
+	mov	x0, 0
+.LVL269:
+.L75:
+	.loc 1 639 0 discriminator 1
+	cmp	w21, w0
+	ble	.L77
+	add	x0, x0, 1
+.LVL270:
+	.loc 1 640 0
+	add	x1, x19, x0
+	ldrb	w1, [x1, -1]
+	cbz	w1, .L75
+	.loc 1 641 0
+	adrp	x0, .LC12
+	add	x0, x0, :lo12:.LC12
+	bl	printf
+.LVL271:
+	b	.L115
+.LVL272:
+.L83:
+.LBB326:
+.LBB327:
+	.loc 1 455 0
+	adds	w25, w20, w19
+.LBE327:
+.LBE326:
+	.loc 1 652 0
+	ldr	x0, [x29, 112]
+.LBB332:
+.LBB328:
+	.loc 1 455 0
+	and	w26, w25, 1
+	mov	w3, 2
+	csneg	w22, w26, w26, pl
+	add	x2, x29, 142
+	sub	w22, w25, w22
+.LBE328:
+.LBE332:
+	.loc 1 652 0
+	ldrb	w23, [x0, x19]
+.LVL273:
+.LBB333:
+.LBB329:
+	.loc 1 455 0
+	mov	w1, w22
+	mov	x0, x24
+	bl	rk3562_secure_otp_read
+.LVL274:
+	.loc 1 456 0
+	cbnz	w0, .L79
+	ldrh	w3, [x29, 142]
+	.loc 1 459 0
+	cbnz	w26, .L80
+.LVL275:
+	.loc 1 461 0
+	bic	w3, w23, w3
+	mov	w2, w25
+.LVL276:
+.L112:
+	.loc 1 464 0
+	mov	x1, x28
+	mov	x0, x24
+.LVL277:
+	add	x19, x19, 1
+.LVL278:
+	bl	rk3562_secure_otp_write_2_bytes_noecc
+.LVL279:
+	mov	w27, w0
+.LVL280:
+.LBE329:
+.LBE333:
+	.loc 1 653 0
+	cbz	w0, .L82
+.L98:
+	.loc 1 654 0
+	adrp	x0, .LC13
+	add	x0, x0, :lo12:.LC13
+.LVL281:
+.L114:
+	.loc 1 662 0
+	bl	printf
+.LVL282:
+	.loc 1 663 0
+	b	.L67
+.LVL283:
+.L80:
+.LBB334:
+.LBB330:
+	.loc 1 463 0
+	lsl	w23, w23, 8
+.LVL284:
+	.loc 1 464 0
+	mov	w2, w22
+	bic	w3, w23, w3
+	b	.L112
+.LVL285:
+.L71:
+.LBE330:
+.LBE334:
+	mov	x19, 0
+.LVL286:
+.L82:
+	.loc 1 651 0 discriminator 1
+	cmp	w21, w19
+	bgt	.L83
+.LVL287:
+.L97:
+	.loc 1 629 0
+	mov	w27, 0
+	b	.L67
+.LVL288:
+.L85:
+.LBB335:
+.LBB322:
+	.loc 1 489 0
+	cbz	w26, .L86
+	.loc 1 492 0
+	ldr	x0, [x29, 120]
+	mov	w3, w25
+	ldp	x2, x1, [x28, 16]
+	ldr	x5, [x0, 16]
+	ldr	x0, [x28, 8]
+	blr	x5
+.LVL289:
+.LBB246:
+	.loc 1 495 0
+#APP
+// 495 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 65536
+	str	w1, [x0, 256]
+.LVL290:
+.LBE246:
+.LBB247:
+	.loc 1 496 0
+#APP
+// 496 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 262148
+	str	w1, [x0, 32]
+.LVL291:
+.LBE247:
+.LBB248:
+	.loc 1 497 0
+#APP
+// 497 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65536
+	str	w1, [x0, 40]
+.LVL292:
+.LBE248:
+.LBB249:
+	.loc 1 498 0
+#APP
+// 498 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL293:
+.LBE249:
+.LBB250:
+	.loc 1 499 0
+#APP
+// 499 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65522
+	str	w1, [x0, 36]
+.LVL294:
+.LBE250:
+.LBB251:
+	.loc 1 500 0
+#APP
+// 500 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w3, 240
+	str	w3, [x29, 100]
+.LVL295:
+	str	w3, [x0, 4096]
+.LBE251:
+.LBB252:
+	.loc 1 501 0
+#APP
+// 501 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL296:
+.LBE252:
+.LBB253:
+	.loc 1 502 0
+#APP
+// 502 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w2, 122
+	str	w2, [x29, 104]
+.LVL297:
+	str	w2, [x0, 4104]
+.LBE253:
+.LBB254:
+	.loc 1 503 0
+#APP
+// 503 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 37
+	str	w1, [x0, 4108]
+.LVL298:
+.LBE254:
+.LBB255:
+	.loc 1 504 0
+#APP
+// 504 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4112]
+.LVL299:
+.LBE255:
+.LBB256:
+	.loc 1 505 0
+#APP
+// 505 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4116]
+.LVL300:
+.LBE256:
+.LBB257:
+	.loc 1 506 0
+#APP
+// 506 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4120]
+.LVL301:
+.LBE257:
+.LBB258:
+	.loc 1 507 0
+#APP
+// 507 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 31
+	str	w1, [x0, 4124]
+.LVL302:
+.LBE258:
+.LBB259:
+	.loc 1 508 0
+#APP
+// 508 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 11
+	str	w1, [x0, 4128]
+.LVL303:
+.LBE259:
+.LBB260:
+	.loc 1 509 0
+#APP
+// 509 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 8
+	str	w1, [x0, 4132]
+.LVL304:
+.LBE260:
+.LBB261:
+	.loc 1 510 0
+#APP
+// 510 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4136]
+.LVL305:
+.LBE261:
+.LBB262:
+	.loc 1 511 0
+#APP
+// 511 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4140]
+.LVL306:
+.LBE262:
+.LBB263:
+	.loc 1 512 0
+#APP
+// 512 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4144]
+.LVL307:
+.LBE263:
+.LBB264:
+	.loc 1 513 0
+#APP
+// 513 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE264:
+.LBB265:
+	.loc 1 514 0
+	ubfx	x21, x21, 9, 8
+.LVL308:
+.LBE265:
+.LBB266:
+	.loc 1 513 0
+	str	w25, [x0, 4148]
+.LBE266:
+.LBB267:
+	.loc 1 514 0
+#APP
+// 514 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w21, [x0, 4152]
+.LVL309:
+.LBE267:
+.LBB268:
+	.loc 1 515 0
+#APP
+// 515 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w22, 65537
+.LBE268:
+	.loc 1 516 0
+	mov	w1, 2
+.LBB269:
+	.loc 1 515 0
+	str	w22, [x0, 32]
+.LBE269:
+	.loc 1 516 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL310:
+	mov	w27, w0
+.LVL311:
+	.loc 1 517 0
+	ldp	w3, w2, [x29, 100]
+	tbz	w0, #31, .L87
+	.loc 1 518 0
+	adrp	x0, .LC5
+.LVL312:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC5
+.LVL313:
+.L113:
+	.loc 1 607 0
+	bl	printf
+.LVL314:
+.L88:
+.LBB270:
+	.loc 1 612 0
+#APP
+// 612 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65533
+.LBE270:
+	.loc 1 613 0
+	ldr	x2, [x28, 16]
+	mov	w3, w25
+.LBB271:
+	.loc 1 612 0
+	str	w1, [x0, 772]
+.LBE271:
+	.loc 1 613 0
+	ldr	x0, [x29, 120]
+	ldr	x1, [x28, 24]
+	ldr	x6, [x0, 24]
+	ldr	x0, [x28, 8]
+	blr	x6
+.LVL315:
+.LBE322:
+.LBE335:
+	.loc 1 661 0
+	cbz	w27, .L86
+.LVL316:
+.L84:
+	.loc 1 662 0
+	adrp	x0, .LC20
+	add	x0, x0, :lo12:.LC20
+	b	.L114
+.LVL317:
+.L87:
+.LBB336:
+.LBB323:
+.LBB272:
+	.loc 1 522 0
+#APP
+// 522 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL318:
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL319:
+.LBE272:
+.LBB273:
+	.loc 1 523 0
+#APP
+// 523 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w3, [x0, 4096]
+.LVL320:
+.LBE273:
+.LBB274:
+	.loc 1 524 0
+#APP
+// 524 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 1
+	str	w1, [x0, 4100]
+.LVL321:
+.LBE274:
+.LBB275:
+	.loc 1 525 0
+#APP
+// 525 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w2, [x0, 4104]
+.LVL322:
+.LBE275:
+.LBB276:
+	.loc 1 526 0
+#APP
+// 526 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 21
+	str	w1, [x0, 4108]
+.LVL323:
+.LBE276:
+.LBB277:
+	.loc 1 527 0
+#APP
+// 527 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 220
+	str	w1, [x0, 4112]
+.LVL324:
+.LBE277:
+.LBB278:
+	.loc 1 528 0
+#APP
+// 528 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 146
+	str	w1, [x0, 4116]
+.LVL325:
+.LBE278:
+.LBB279:
+	.loc 1 529 0
+#APP
+// 529 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 121
+	str	w1, [x0, 4120]
+.LVL326:
+.LBE279:
+.LBB280:
+	.loc 1 530 0
+#APP
+// 530 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 129
+	str	w1, [x0, 4124]
+.LVL327:
+.LBE280:
+.LBB281:
+	.loc 1 531 0
+#APP
+// 531 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 126
+	str	w1, [x0, 4128]
+.LVL328:
+.LBE281:
+.LBB282:
+	.loc 1 532 0
+#APP
+// 532 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 33
+	str	w1, [x0, 4132]
+.LVL329:
+.LBE282:
+.LBB283:
+	.loc 1 533 0
+#APP
+// 533 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 17
+	str	w1, [x0, 4136]
+.LVL330:
+.LBE283:
+.LBB284:
+	.loc 1 534 0
+#APP
+// 534 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 157
+	str	w1, [x0, 4140]
+.LVL331:
+.LBE284:
+.LBB285:
+	.loc 1 535 0
+#APP
+// 535 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w21, 2
+.LVL332:
+	str	w21, [x0, 4144]
+.LVL333:
+.LBE285:
+.LBB286:
+	.loc 1 536 0
+#APP
+// 536 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4148]
+.LVL334:
+.LBE286:
+.LBB287:
+	.loc 1 537 0
+#APP
+// 537 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4152]
+.LVL335:
+.LBE287:
+.LBB288:
+	.loc 1 538 0
+#APP
+// 538 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE288:
+	.loc 1 539 0
+	mov	w1, w21
+.LBB289:
+	.loc 1 538 0
+	str	w22, [x0, 32]
+.LBE289:
+	.loc 1 539 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL336:
+	mov	w27, w0
+.LVL337:
+	.loc 1 540 0
+	tbz	w0, #31, .L89
+	.loc 1 541 0
+	adrp	x0, .LC14
+.LVL338:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC14
+	b	.L113
+.LVL339:
+.L89:
+.LBB290:
+	.loc 1 545 0
+#APP
+// 545 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL340:
+	mov	w1, 512
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL341:
+.LBE290:
+.LBB291:
+	.loc 1 546 0
+#APP
+// 546 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL342:
+.LBE291:
+.LBB292:
+	.loc 1 547 0
+#APP
+// 547 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 251
+	str	w1, [x0, 4096]
+.LVL343:
+.LBE292:
+.LBB293:
+	.loc 1 548 0
+#APP
+// 548 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4100]
+.LVL344:
+.LBE293:
+.LBB294:
+	.loc 1 549 0
+#APP
+// 549 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE294:
+	.loc 1 550 0
+	mov	w1, w21
+.LBB295:
+	.loc 1 549 0
+	str	w22, [x0, 32]
+.LBE295:
+	.loc 1 550 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL345:
+	mov	w27, w0
+.LVL346:
+	.loc 1 551 0
+	tbz	w0, #31, .L90
+	.loc 1 552 0
+	adrp	x0, .LC15
+.LVL347:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC15
+	b	.L113
+.LVL348:
+.L90:
+.LBB296:
+	.loc 1 556 0
+#APP
+// 556 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL349:
+	mov	w1, -65534
+	str	w1, [x0, 36]
+.LVL350:
+.LBE296:
+.LBB297:
+	.loc 1 557 0
+#APP
+// 557 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 192
+	str	w1, [x0, 4096]
+.LBE297:
+.LBB298:
+	.loc 1 558 0
+	and	w1, w26, 255
+.LVL351:
+#APP
+// 558 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE298:
+.LBB299:
+	.loc 1 559 0
+	lsr	w26, w26, 8
+.LVL352:
+.LBE299:
+.LBB300:
+	.loc 1 558 0
+	str	w1, [x0, 4100]
+.LBE300:
+.LBB301:
+	.loc 1 559 0
+#APP
+// 559 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	w26, [x0, 4104]
+.LVL353:
+.LBE301:
+.LBB302:
+	.loc 1 560 0
+#APP
+// 560 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE302:
+	.loc 1 561 0
+	mov	w1, w21
+.LVL354:
+.LBB303:
+	.loc 1 560 0
+	str	w22, [x0, 32]
+.LBE303:
+	.loc 1 561 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL355:
+	mov	w27, w0
+.LVL356:
+	.loc 1 562 0
+	tbz	w0, #31, .L91
+	.loc 1 563 0
+	adrp	x0, .LC16
+.LVL357:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC16
+	b	.L113
+.LVL358:
+.L91:
+.LBB304:
+	.loc 1 567 0
+#APP
+// 567 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL359:
+	mov	w1, 14848
+	movk	w1, 0xff00, lsl 16
+	str	w1, [x0, 32]
+.LVL360:
+.LBE304:
+.LBB305:
+	.loc 1 568 0
+#APP
+// 568 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL361:
+.LBE305:
+.LBB306:
+	.loc 1 569 0
+#APP
+// 569 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 255
+	str	w1, [x0, 4096]
+.LVL362:
+.LBE306:
+.LBB307:
+	.loc 1 570 0
+#APP
+// 570 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 10
+	str	w1, [x0, 4100]
+.LVL363:
+.LBE307:
+.LBB308:
+	.loc 1 571 0
+#APP
+// 571 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE308:
+	.loc 1 572 0
+	mov	w1, w21
+.LBB309:
+	.loc 1 571 0
+	str	w22, [x0, 32]
+.LBE309:
+	.loc 1 572 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL364:
+	mov	w27, w0
+.LVL365:
+	.loc 1 573 0
+	tbz	w0, #31, .L92
+	.loc 1 574 0
+	adrp	x0, .LC17
+.LVL366:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC17
+	b	.L113
+.LVL367:
+.L92:
+.LBB310:
+	.loc 1 578 0
+#APP
+// 578 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL368:
+	mov	w1, -65534
+	str	w1, [x0, 36]
+.LVL369:
+.LBE310:
+.LBB311:
+	.loc 1 579 0
+#APP
+// 579 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 1
+	str	w1, [x0, 4096]
+.LVL370:
+.LBE311:
+.LBB312:
+	.loc 1 580 0
+#APP
+// 580 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 191
+	str	w1, [x0, 4100]
+.LVL371:
+.LBE312:
+.LBB313:
+	.loc 1 581 0
+#APP
+// 581 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	str	wzr, [x0, 4104]
+.LVL372:
+.LBE313:
+.LBB314:
+	.loc 1 582 0
+#APP
+// 582 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LBE314:
+	.loc 1 583 0
+	mov	w1, w21
+.LBB315:
+	.loc 1 582 0
+	str	w22, [x0, 32]
+.LBE315:
+	.loc 1 583 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL373:
+	mov	w27, w0
+.LVL374:
+	.loc 1 584 0
+	tbz	w0, #31, .L93
+	.loc 1 585 0
+	adrp	x0, .LC18
+.LVL375:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC18
+	b	.L113
+.LVL376:
+.L93:
+	.loc 1 589 0
+	mov	x0, x28
+.LVL377:
+	bl	rockchip_secure_otp_check_flag.isra.0
+.LVL378:
+	mov	w27, w0
+.LVL379:
+	.loc 1 590 0
+	tbz	w0, #31, .L94
+	.loc 1 591 0
+	adrp	x0, .LC6
+.LVL380:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC6
+	b	.L113
+.LVL381:
+.L94:
+.LBB316:
+	.loc 1 595 0
+#APP
+// 595 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+.LVL382:
+	mov	w1, -65535
+	str	w1, [x0, 36]
+.LVL383:
+.LBE316:
+.LBB317:
+	.loc 1 596 0
+#APP
+// 596 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w1, 2
+	str	w1, [x0, 4096]
+.LVL384:
+.LBE317:
+.LBB318:
+	.loc 1 597 0
+#APP
+// 597 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w2, 191
+	str	w2, [x0, 4100]
+.LVL385:
+.LBE318:
+.LBB319:
+	.loc 1 598 0
+#APP
+// 598 "drivers/misc/rk3562-secure-otp.c" 1
+	dmb sy
+// 0 "" 2
+#NO_APP
+	ldr	x0, [x28]
+	mov	w2, 65537
+	str	w2, [x0, 32]
+.LBE319:
+	.loc 1 599 0
+	mov	x0, x28
+	bl	rockchip_secure_otp_wait_status.isra.2
+.LVL386:
+	mov	w27, w0
+.LVL387:
+	.loc 1 600 0
+	tbz	w0, #31, .L95
+	.loc 1 601 0
+	adrp	x0, .LC19
+.LVL388:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC19
+	b	.L113
+.LVL389:
+.L95:
+	.loc 1 605 0
+	mov	x0, x28
+.LVL390:
+	bl	rockchip_secure_otp_wait_flag.isra.1
+.LVL391:
+	mov	w27, w0
+.LVL392:
+	.loc 1 606 0
+	tbz	w0, #31, .L88
+	.loc 1 607 0
+	adrp	x0, .LC7
+.LVL393:
+	mov	x1, x19
+	add	x0, x0, :lo12:.LC7
+	b	.L113
+.LVL394:
+.L86:
+	add	x23, x23, 1
+.LVL395:
+	b	.L78
+.LVL396:
+.L79:
+.LBE323:
+.LBE336:
+.LBB337:
+.LBB331:
+	.loc 1 457 0
+	mov	w27, -1
+	b	.L98
+.LBE331:
+.LBE337:
+	.cfi_endproc
+.LFE272:
+	.size	rk3562_secure_otp_write, .-rk3562_secure_otp_write
+	.global	_u_boot_list_2_driver_2_rockchip_secure_otp
+	.section	.rodata.__func__.7582,"a",@progbits
+	.align	3
+	.set	.LANCHOR0,. + 0
+	.type	__func__.7582, %object
+	.size	__func__.7582, 32
+__func__.7582:
+	.string	"rockchip_secure_otp_wait_status"
+	.section	.rodata.__func__.7625,"a",@progbits
+	.align	3
+	.set	.LANCHOR2,. + 0
+	.type	__func__.7625, %object
+	.size	__func__.7625, 31
+__func__.7625:
+	.string	"rockchip_secure_otp_ecc_enable"
+	.section	.rodata.__func__.7643,"a",@progbits
+	.align	3
+	.set	.LANCHOR3,. + 0
+	.type	__func__.7643, %object
+	.size	__func__.7643, 23
+__func__.7643:
+	.string	"rk3562_secure_otp_read"
+	.section	.rodata.__func__.7678,"a",@progbits
+	.align	3
+	.set	.LANCHOR1,. + 0
+	.type	__func__.7678, %object
+	.size	__func__.7678, 38
+__func__.7678:
+	.string	"rk3562_secure_otp_write_2_bytes_noecc"
+	.section	.rodata.__func__.7899,"a",@progbits
+	.align	3
+	.set	.LANCHOR4,. + 0
+	.type	__func__.7899, %object
+	.size	__func__.7899, 32
+__func__.7899:
+	.string	"rk3562_secure_otp_write_2_bytes"
+	.section	.rodata.rk3562_data,"a",@progbits
+	.align	3
+	.type	rk3562_data, %object
+	.size	rk3562_data, 32
+rk3562_data:
+	.xword	rk3562_secure_otp_read
+	.xword	rk3562_secure_otp_write
+	.xword	rk3562_spl_rockchip_otp_start
+	.xword	rk3562_spl_rockchip_otp_stop
+	.section	.rodata.rk3562_secure_otp_read.str1.1,"aMS",@progbits,1
+.LC9:
+	.string	"do not access non secure area, half word offset = %d\n"
+.LC10:
+	.string	"Please input correct addr, offset(bytes) is 0x%x\n"
+.LC11:
+	.string	"%s timeout during read setup\n"
+	.section	.rodata.rk3562_secure_otp_write.str1.1,"aMS",@progbits,1
+.LC12:
+	.string	"The zone is written.\n"
+.LC13:
+	.string	"rk3562_secure_otp_write_byte_noecc error\n"
+.LC14:
+	.string	"%s timeout during write setup 2\n"
+.LC15:
+	.string	"%s timeout during write setup 3\n"
+.LC16:
+	.string	"%s timeout during write setup 4\n"
+.LC17:
+	.string	"%s timeout during write setup 5\n"
+.LC18:
+	.string	"%s timeout during write setup 6\n"
+.LC19:
+	.string	"%s timeout during write setup 8\n"
+.LC20:
+	.string	"rk3562_secure_otp_write_2_bytes error\n"
+	.section	.rodata.rk3562_secure_otp_write_2_bytes_noecc.str1.1,"aMS",@progbits,1
+.LC4:
+	.string	"Please input correct addr, offset is 0x%x\n"
+.LC5:
+	.string	"%s timeout during write setup 1\n"
+.LC6:
+	.string	"%s timeout during write setup 7\n"
+.LC7:
+	.string	"%s timeout during write setup 9\n"
+	.section	.rodata.rockchip_otp_ids,"a",@progbits
+	.align	3
+	.type	rockchip_otp_ids, %object
+	.size	rockchip_otp_ids, 32
+rockchip_otp_ids:
+	.xword	.LC22
+	.xword	rk3562_data
+	.zero	16
+	.section	.rodata.rockchip_secure_otp_ecc_enable.str1.1,"aMS",@progbits,1
+.LC8:
+	.string	"%s timeout during ecc_enable\n"
+	.section	.rodata.rockchip_secure_otp_ofdata_to_platdata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"secure_conf"
+.LC1:
+	.string	"mask_addr"
+.LC2:
+	.string	"cru_rst_addr"
+	.section	.rodata.rockchip_secure_otp_ops,"a",@progbits
+	.align	3
+	.type	rockchip_secure_otp_ops, %object
+	.size	rockchip_secure_otp_ops, 32
+rockchip_secure_otp_ops:
+	.xword	secure_otp_read
+	.xword	secure_otp_write
+	.xword	secure_otp_ioctl
+	.zero	8
+	.section	.rodata.rockchip_secure_otp_wait_status.isra.2.str1.1,"aMS",@progbits,1
+.LC3:
+	.string	"%s: wait init status timeout\n"
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC21:
+	.string	"rockchip_secure_otp"
+.LC22:
+	.string	"rockchip,rk3562-secure-otp"
+	.section	.u_boot_list_2_driver_2_rockchip_secure_otp,"aw",@progbits
+	.align	2
+	.type	_u_boot_list_2_driver_2_rockchip_secure_otp, %object
+	.size	_u_boot_list_2_driver_2_rockchip_secure_otp, 120
+_u_boot_list_2_driver_2_rockchip_secure_otp:
+	.8byte	.LC21
+	.word	36
+	.zero	4
+	.8byte	rockchip_otp_ids
+	.zero	32
+	.8byte	rockchip_secure_otp_ofdata_to_platdata
+	.zero	28
+	.word	32
+	.zero	8
+	.8byte	rockchip_secure_otp_ops
+	.zero	8
+	.text
+.Letext0:
+	.file 2 "include/common.h"
+	.file 3 "./arch/arm/include/asm/types.h"
+	.file 4 "include/linux/types.h"
+	.file 5 "include/errno.h"
+	.file 6 "include/linux/string.h"
+	.file 7 "include/efi.h"
+	.file 8 "include/dm/device.h"
+	.file 9 "include/ide.h"
+	.file 10 "include/linux/list.h"
+	.file 11 "include/part.h"
+	.file 12 "include/flash.h"
+	.file 13 "include/lmb.h"
+	.file 14 "include/asm-generic/u-boot.h"
+	.file 15 "./arch/arm/include/asm/u-boot-arm.h"
+	.file 16 "include/linux/libfdt_env.h"
+	.file 17 "include/linux/../../scripts/dtc/libfdt/fdt.h"
+	.file 18 "include/linux/libfdt.h"
+	.file 19 "include/image.h"
+	.file 20 "./arch/arm/include/asm/global_data.h"
+	.file 21 "include/asm-generic/global_data.h"
+	.file 22 "include/dm/of.h"
+	.file 23 "include/net.h"
+	.file 24 "include/dm/uclass-id.h"
+	.file 25 "include/dm/ofnode.h"
+	.file 26 "include/malloc.h"
+	.file 27 "include/linux/compat.h"
+	.file 28 "include/dm/uclass.h"
+	.file 29 "include/asm-generic/ioctl.h"
+	.file 30 "include/misc.h"
+	.file 31 "include/rockchip-otp.h"
+	.file 32 "include/dm/read.h"
+	.file 33 "include/stdio.h"
+	.file 34 "include/linux/delay.h"
+	.file 35 "include/log.h"
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.4byte	0x42d6
+	.2byte	0x4
+	.4byte	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.4byte	.LASF459
+	.byte	0xc
+	.4byte	.LASF460
+	.4byte	.LASF461
+	.4byte	.Ldebug_ranges0+0x6c0
+	.8byte	0
+	.4byte	.Ldebug_line0
+	.uleb128 0x2
+	.4byte	.LASF4
+	.byte	0x2
+	.byte	0xd
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF0
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF1
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x7
+	.4byte	.LASF2
+	.uleb128 0x4
+	.4byte	.LASF21
+	.byte	0x5
+	.byte	0xc
+	.4byte	0x54
+	.uleb128 0x5
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x6
+	.4byte	.LASF3
+	.uleb128 0x2
+	.4byte	.LASF5
+	.byte	0x3
+	.byte	0xc
+	.4byte	0x34
+	.uleb128 0x3
+	.byte	0x2
+	.byte	0x5
+	.4byte	.LASF6
+	.uleb128 0x2
+	.4byte	.LASF7
+	.byte	0x3
+	.byte	0x12
+	.4byte	0x7f
+	.uleb128 0x3
+	.byte	0x4
+	.byte	0x7
+	.4byte	.LASF8
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF9
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF10
+	.uleb128 0x6
+	.string	"u8"
+	.byte	0x3
+	.byte	0x1f
+	.4byte	0x34
+	.uleb128 0x7
+	.4byte	0x94
+	.uleb128 0x6
+	.string	"u16"
+	.byte	0x3
+	.byte	0x22
+	.4byte	0x42
+	.uleb128 0x6
+	.string	"u32"
+	.byte	0x3
+	.byte	0x25
+	.4byte	0x7f
+	.uleb128 0x6
+	.string	"u64"
+	.byte	0x3
+	.byte	0x28
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF11
+	.byte	0x3
+	.byte	0x31
+	.4byte	0x8d
+	.uleb128 0x2
+	.4byte	.LASF12
+	.byte	0x3
+	.byte	0x32
+	.4byte	0x8d
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF13
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xee
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF14
+	.uleb128 0x7
+	.4byte	0xe7
+	.uleb128 0x3
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF15
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xe7
+	.uleb128 0x2
+	.4byte	.LASF16
+	.byte	0x4
+	.byte	0x59
+	.4byte	0x42
+	.uleb128 0x2
+	.4byte	.LASF17
+	.byte	0x4
+	.byte	0x5b
+	.4byte	0x3b
+	.uleb128 0x2
+	.4byte	.LASF18
+	.byte	0x4
+	.byte	0x69
+	.4byte	0x62
+	.uleb128 0x2
+	.4byte	.LASF19
+	.byte	0x4
+	.byte	0x6b
+	.4byte	0x74
+	.uleb128 0x2
+	.4byte	.LASF20
+	.byte	0x4
+	.byte	0x97
+	.4byte	0x74
+	.uleb128 0x9
+	.byte	0x8
+	.uleb128 0x4
+	.4byte	.LASF22
+	.byte	0x6
+	.byte	0xb
+	.4byte	0xfa
+	.uleb128 0x3
+	.byte	0x1
+	.byte	0x2
+	.4byte	.LASF23
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0x156
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF24
+	.byte	0x7
+	.2byte	0x140
+	.4byte	0x14b
+	.uleb128 0xc
+	.4byte	.LASF25
+	.byte	0x7
+	.2byte	0x143
+	.4byte	0x14b
+	.uleb128 0xc
+	.4byte	.LASF26
+	.byte	0x7
+	.2byte	0x143
+	.4byte	0x14b
+	.uleb128 0xd
+	.4byte	.LASF45
+	.byte	0xa0
+	.byte	0x8
+	.byte	0x83
+	.4byte	0x25f
+	.uleb128 0xe
+	.4byte	.LASF27
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x139d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x8
+	.byte	0x85
+	.4byte	0xe1
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF29
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x137
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF30
+	.byte	0x8
+	.byte	0x87
+	.4byte	0x137
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF31
+	.byte	0x8
+	.byte	0x88
+	.4byte	0x137
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF32
+	.byte	0x8
+	.byte	0x89
+	.4byte	0x1344
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF33
+	.byte	0x8
+	.byte	0x8a
+	.4byte	0x10b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF34
+	.byte	0x8
+	.byte	0x8b
+	.4byte	0x25f
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF35
+	.byte	0x8
+	.byte	0x8c
+	.4byte	0x137
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF36
+	.byte	0x8
+	.byte	0x8d
+	.4byte	0x13ec
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF37
+	.byte	0x8
+	.byte	0x8e
+	.4byte	0x137
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF38
+	.byte	0x8
+	.byte	0x8f
+	.4byte	0x137
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF39
+	.byte	0x8
+	.byte	0x90
+	.4byte	0x292
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF40
+	.byte	0x8
+	.byte	0x91
+	.4byte	0x292
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF41
+	.byte	0x8
+	.byte	0x92
+	.4byte	0x292
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF42
+	.byte	0x8
+	.byte	0x93
+	.4byte	0x121
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF43
+	.byte	0x8
+	.byte	0x94
+	.4byte	0x54
+	.byte	0x94
+	.uleb128 0xf
+	.string	"seq"
+	.byte	0x8
+	.byte	0x95
+	.4byte	0x54
+	.byte	0x98
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x17a
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x26b
+	.uleb128 0x10
+	.uleb128 0xa
+	.4byte	0x10b
+	.4byte	0x277
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF44
+	.byte	0x9
+	.byte	0x10
+	.4byte	0x26c
+	.uleb128 0xa
+	.4byte	0x34
+	.4byte	0x292
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x5
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF46
+	.byte	0x10
+	.byte	0xa
+	.byte	0x16
+	.4byte	0x2b7
+	.uleb128 0xe
+	.4byte	.LASF47
+	.byte	0xa
+	.byte	0x17
+	.4byte	0x2b7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF48
+	.byte	0xa
+	.byte	0x17
+	.4byte	0x2b7
+	.byte	0x8
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x292
+	.uleb128 0xd
+	.4byte	.LASF49
+	.byte	0x10
+	.byte	0xb
+	.byte	0xf
+	.4byte	0x2e2
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0xb
+	.byte	0x10
+	.4byte	0xfa
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF50
+	.byte	0xb
+	.byte	0x11
+	.4byte	0x2fb
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x2bd
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x2fb
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x2e7
+	.uleb128 0xa
+	.4byte	0x2e2
+	.4byte	0x30c
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x301
+	.uleb128 0x4
+	.4byte	.LASF49
+	.byte	0xb
+	.byte	0xe1
+	.4byte	0x30c
+	.uleb128 0x14
+	.2byte	0x1220
+	.byte	0xc
+	.byte	0x13
+	.4byte	0x370
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xc
+	.byte	0x14
+	.4byte	0x10b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF52
+	.byte	0xc
+	.byte	0x15
+	.4byte	0x100
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF53
+	.byte	0xc
+	.byte	0x16
+	.4byte	0x10b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF54
+	.byte	0xc
+	.byte	0x17
+	.4byte	0x370
+	.byte	0x18
+	.uleb128 0x15
+	.4byte	.LASF55
+	.byte	0xc
+	.byte	0x18
+	.4byte	0x381
+	.2byte	0x1018
+	.uleb128 0x16
+	.string	"mtd"
+	.byte	0xc
+	.byte	0x31
+	.4byte	0x397
+	.2byte	0x1218
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x10b
+	.4byte	0x381
+	.uleb128 0x17
+	.4byte	0xda
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x29
+	.4byte	0x392
+	.uleb128 0x17
+	.4byte	0xda
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0x18
+	.4byte	.LASF318
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x392
+	.uleb128 0x2
+	.4byte	.LASF56
+	.byte	0xc
+	.byte	0x37
+	.4byte	0x31c
+	.uleb128 0xa
+	.4byte	0x39d
+	.4byte	0x3b3
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF57
+	.byte	0xc
+	.byte	0x39
+	.4byte	0x3a8
+	.uleb128 0x3
+	.byte	0x10
+	.byte	0x4
+	.4byte	.LASF58
+	.uleb128 0xd
+	.4byte	.LASF59
+	.byte	0x10
+	.byte	0xd
+	.byte	0x10
+	.4byte	0x3ea
+	.uleb128 0xe
+	.4byte	.LASF60
+	.byte	0xd
+	.byte	0x11
+	.4byte	0xc4
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xd
+	.byte	0x12
+	.4byte	0xcf
+	.byte	0x8
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF61
+	.2byte	0x120
+	.byte	0xd
+	.byte	0x15
+	.4byte	0x41c
+	.uleb128 0xf
+	.string	"cnt"
+	.byte	0xd
+	.byte	0x16
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xd
+	.byte	0x17
+	.4byte	0xcf
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF62
+	.byte	0xd
+	.byte	0x18
+	.4byte	0x41c
+	.byte	0x10
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x3c5
+	.4byte	0x42c
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x10
+	.byte	0
+	.uleb128 0x1a
+	.string	"lmb"
+	.2byte	0x240
+	.byte	0xd
+	.byte	0x1b
+	.4byte	0x453
+	.uleb128 0xe
+	.4byte	.LASF63
+	.byte	0xd
+	.byte	0x1c
+	.4byte	0x3ea
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF64
+	.byte	0xd
+	.byte	0x1d
+	.4byte	0x3ea
+	.2byte	0x120
+	.byte	0
+	.uleb128 0x1b
+	.string	"lmb"
+	.byte	0xd
+	.byte	0x20
+	.4byte	0x42c
+	.uleb128 0x1c
+	.byte	0x10
+	.byte	0xe
+	.byte	0x5d
+	.4byte	0x47f
+	.uleb128 0xe
+	.4byte	.LASF54
+	.byte	0xe
+	.byte	0x5e
+	.4byte	0xb9
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF51
+	.byte	0xe
+	.byte	0x5f
+	.4byte	0xb9
+	.byte	0x8
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF65
+	.byte	0xb0
+	.byte	0xe
+	.byte	0x1b
+	.4byte	0x57c
+	.uleb128 0xe
+	.4byte	.LASF66
+	.byte	0xe
+	.byte	0x1c
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF67
+	.byte	0xe
+	.byte	0x1d
+	.4byte	0xcf
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF68
+	.byte	0xe
+	.byte	0x1e
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF69
+	.byte	0xe
+	.byte	0x1f
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF70
+	.byte	0xe
+	.byte	0x20
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF71
+	.byte	0xe
+	.byte	0x21
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF72
+	.byte	0xe
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF73
+	.byte	0xe
+	.byte	0x24
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF74
+	.byte	0xe
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF75
+	.byte	0xe
+	.byte	0x26
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF76
+	.byte	0xe
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF77
+	.byte	0xe
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF78
+	.byte	0xe
+	.byte	0x33
+	.4byte	0x282
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF79
+	.byte	0xe
+	.byte	0x34
+	.4byte	0x42
+	.byte	0x66
+	.uleb128 0xe
+	.4byte	.LASF80
+	.byte	0xe
+	.byte	0x35
+	.4byte	0x3b
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF81
+	.byte	0xe
+	.byte	0x36
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF82
+	.byte	0xe
+	.byte	0x57
+	.4byte	0x10b
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF83
+	.byte	0xe
+	.byte	0x58
+	.4byte	0x10b
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF84
+	.byte	0xe
+	.byte	0x5b
+	.4byte	0x7f
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF85
+	.byte	0xe
+	.byte	0x60
+	.4byte	0x57c
+	.byte	0x90
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x45e
+	.4byte	0x58c
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF86
+	.byte	0xe
+	.byte	0x62
+	.4byte	0x47f
+	.uleb128 0x4
+	.4byte	.LASF87
+	.byte	0xf
+	.byte	0x13
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF88
+	.byte	0xf
+	.byte	0x14
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF89
+	.byte	0xf
+	.byte	0x15
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF90
+	.byte	0xf
+	.byte	0x16
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF91
+	.byte	0xf
+	.byte	0x17
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF92
+	.byte	0xf
+	.byte	0x18
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF93
+	.byte	0xf
+	.byte	0x19
+	.4byte	0x10b
+	.uleb128 0x2
+	.4byte	.LASF94
+	.byte	0x10
+	.byte	0x11
+	.4byte	0x12c
+	.uleb128 0xd
+	.4byte	.LASF95
+	.byte	0x28
+	.byte	0x11
+	.byte	0x39
+	.4byte	0x674
+	.uleb128 0xe
+	.4byte	.LASF96
+	.byte	0x11
+	.byte	0x3a
+	.4byte	0x5e4
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF97
+	.byte	0x11
+	.byte	0x3b
+	.4byte	0x5e4
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF98
+	.byte	0x11
+	.byte	0x3c
+	.4byte	0x5e4
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF99
+	.byte	0x11
+	.byte	0x3d
+	.4byte	0x5e4
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF100
+	.byte	0x11
+	.byte	0x3e
+	.4byte	0x5e4
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF101
+	.byte	0x11
+	.byte	0x3f
+	.4byte	0x5e4
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF102
+	.byte	0x11
+	.byte	0x40
+	.4byte	0x5e4
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF103
+	.byte	0x11
+	.byte	0x43
+	.4byte	0x5e4
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF104
+	.byte	0x11
+	.byte	0x46
+	.4byte	0x5e4
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF105
+	.byte	0x11
+	.byte	0x49
+	.4byte	0x5e4
+	.byte	0x24
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF106
+	.byte	0x12
+	.2byte	0x136
+	.4byte	0x680
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x5ef
+	.uleb128 0x1d
+	.4byte	.LASF107
+	.byte	0x40
+	.byte	0x13
+	.2byte	0x137
+	.4byte	0x730
+	.uleb128 0x1e
+	.4byte	.LASF108
+	.byte	0x13
+	.2byte	0x138
+	.4byte	0x12c
+	.byte	0
+	.uleb128 0x1e
+	.4byte	.LASF109
+	.byte	0x13
+	.2byte	0x139
+	.4byte	0x12c
+	.byte	0x4
+	.uleb128 0x1e
+	.4byte	.LASF110
+	.byte	0x13
+	.2byte	0x13a
+	.4byte	0x12c
+	.byte	0x8
+	.uleb128 0x1e
+	.4byte	.LASF111
+	.byte	0x13
+	.2byte	0x13b
+	.4byte	0x12c
+	.byte	0xc
+	.uleb128 0x1e
+	.4byte	.LASF112
+	.byte	0x13
+	.2byte	0x13c
+	.4byte	0x12c
+	.byte	0x10
+	.uleb128 0x1e
+	.4byte	.LASF113
+	.byte	0x13
+	.2byte	0x13d
+	.4byte	0x12c
+	.byte	0x14
+	.uleb128 0x1e
+	.4byte	.LASF114
+	.byte	0x13
+	.2byte	0x13e
+	.4byte	0x12c
+	.byte	0x18
+	.uleb128 0x1e
+	.4byte	.LASF115
+	.byte	0x13
+	.2byte	0x13f
+	.4byte	0x116
+	.byte	0x1c
+	.uleb128 0x1e
+	.4byte	.LASF116
+	.byte	0x13
+	.2byte	0x140
+	.4byte	0x116
+	.byte	0x1d
+	.uleb128 0x1e
+	.4byte	.LASF117
+	.byte	0x13
+	.2byte	0x141
+	.4byte	0x116
+	.byte	0x1e
+	.uleb128 0x1e
+	.4byte	.LASF118
+	.byte	0x13
+	.2byte	0x142
+	.4byte	0x116
+	.byte	0x1f
+	.uleb128 0x1e
+	.4byte	.LASF119
+	.byte	0x13
+	.2byte	0x143
+	.4byte	0x730
+	.byte	0x20
+	.byte	0
+	.uleb128 0xa
+	.4byte	0x116
+	.4byte	0x740
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF120
+	.byte	0x13
+	.2byte	0x144
+	.4byte	0x686
+	.uleb128 0x1d
+	.4byte	.LASF121
+	.byte	0x30
+	.byte	0x13
+	.2byte	0x146
+	.4byte	0x7ce
+	.uleb128 0x1e
+	.4byte	.LASF54
+	.byte	0x13
+	.2byte	0x147
+	.4byte	0x10b
+	.byte	0
+	.uleb128 0x20
+	.string	"end"
+	.byte	0x13
+	.2byte	0x147
+	.4byte	0x10b
+	.byte	0x8
+	.uleb128 0x1e
+	.4byte	.LASF122
+	.byte	0x13
+	.2byte	0x148
+	.4byte	0x10b
+	.byte	0x10
+	.uleb128 0x1e
+	.4byte	.LASF123
+	.byte	0x13
+	.2byte	0x148
+	.4byte	0x10b
+	.byte	0x18
+	.uleb128 0x1e
+	.4byte	.LASF124
+	.byte	0x13
+	.2byte	0x149
+	.4byte	0x10b
+	.byte	0x20
+	.uleb128 0x1e
+	.4byte	.LASF125
+	.byte	0x13
+	.2byte	0x14a
+	.4byte	0x116
+	.byte	0x28
+	.uleb128 0x1e
+	.4byte	.LASF126
+	.byte	0x13
+	.2byte	0x14a
+	.4byte	0x116
+	.byte	0x29
+	.uleb128 0x20
+	.string	"os"
+	.byte	0x13
+	.2byte	0x14a
+	.4byte	0x116
+	.byte	0x2a
+	.uleb128 0x1e
+	.4byte	.LASF127
+	.byte	0x13
+	.2byte	0x14b
+	.4byte	0x116
+	.byte	0x2b
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF128
+	.byte	0x13
+	.2byte	0x14c
+	.4byte	0x74c
+	.uleb128 0x21
+	.4byte	.LASF129
+	.2byte	0x380
+	.byte	0x13
+	.2byte	0x152
+	.4byte	0x977
+	.uleb128 0x1e
+	.4byte	.LASF130
+	.byte	0x13
+	.2byte	0x158
+	.4byte	0x977
+	.byte	0
+	.uleb128 0x1e
+	.4byte	.LASF131
+	.byte	0x13
+	.2byte	0x159
+	.4byte	0x740
+	.byte	0x8
+	.uleb128 0x1e
+	.4byte	.LASF132
+	.byte	0x13
+	.2byte	0x15a
+	.4byte	0x10b
+	.byte	0x48
+	.uleb128 0x1e
+	.4byte	.LASF133
+	.byte	0x13
+	.2byte	0x15d
+	.4byte	0xe1
+	.byte	0x50
+	.uleb128 0x1e
+	.4byte	.LASF134
+	.byte	0x13
+	.2byte	0x15f
+	.4byte	0x137
+	.byte	0x58
+	.uleb128 0x1e
+	.4byte	.LASF135
+	.byte	0x13
+	.2byte	0x160
+	.4byte	0xe1
+	.byte	0x60
+	.uleb128 0x1e
+	.4byte	.LASF136
+	.byte	0x13
+	.2byte	0x161
+	.4byte	0x54
+	.byte	0x68
+	.uleb128 0x1e
+	.4byte	.LASF137
+	.byte	0x13
+	.2byte	0x163
+	.4byte	0x137
+	.byte	0x70
+	.uleb128 0x1e
+	.4byte	.LASF138
+	.byte	0x13
+	.2byte	0x164
+	.4byte	0xe1
+	.byte	0x78
+	.uleb128 0x1e
+	.4byte	.LASF139
+	.byte	0x13
+	.2byte	0x165
+	.4byte	0x54
+	.byte	0x80
+	.uleb128 0x1e
+	.4byte	.LASF140
+	.byte	0x13
+	.2byte	0x167
+	.4byte	0x137
+	.byte	0x88
+	.uleb128 0x1e
+	.4byte	.LASF141
+	.byte	0x13
+	.2byte	0x168
+	.4byte	0xe1
+	.byte	0x90
+	.uleb128 0x1e
+	.4byte	.LASF142
+	.byte	0x13
+	.2byte	0x169
+	.4byte	0x54
+	.byte	0x98
+	.uleb128 0x1e
+	.4byte	.LASF143
+	.byte	0x13
+	.2byte	0x16b
+	.4byte	0x137
+	.byte	0xa0
+	.uleb128 0x1e
+	.4byte	.LASF144
+	.byte	0x13
+	.2byte	0x16c
+	.4byte	0xe1
+	.byte	0xa8
+	.uleb128 0x1e
+	.4byte	.LASF145
+	.byte	0x13
+	.2byte	0x16d
+	.4byte	0x54
+	.byte	0xb0
+	.uleb128 0x20
+	.string	"os"
+	.byte	0x13
+	.2byte	0x171
+	.4byte	0x7ce
+	.byte	0xb8
+	.uleb128 0x20
+	.string	"ep"
+	.byte	0x13
+	.2byte	0x172
+	.4byte	0x10b
+	.byte	0xe8
+	.uleb128 0x1e
+	.4byte	.LASF146
+	.byte	0x13
+	.2byte	0x174
+	.4byte	0x10b
+	.byte	0xf0
+	.uleb128 0x1e
+	.4byte	.LASF147
+	.byte	0x13
+	.2byte	0x174
+	.4byte	0x10b
+	.byte	0xf8
+	.uleb128 0x22
+	.4byte	.LASF148
+	.byte	0x13
+	.2byte	0x176
+	.4byte	0xfa
+	.2byte	0x100
+	.uleb128 0x22
+	.4byte	.LASF149
+	.byte	0x13
+	.2byte	0x177
+	.4byte	0x10b
+	.2byte	0x108
+	.uleb128 0x22
+	.4byte	.LASF150
+	.byte	0x13
+	.2byte	0x179
+	.4byte	0x10b
+	.2byte	0x110
+	.uleb128 0x22
+	.4byte	.LASF151
+	.byte	0x13
+	.2byte	0x17a
+	.4byte	0x10b
+	.2byte	0x118
+	.uleb128 0x22
+	.4byte	.LASF152
+	.byte	0x13
+	.2byte	0x17b
+	.4byte	0x10b
+	.2byte	0x120
+	.uleb128 0x22
+	.4byte	.LASF153
+	.byte	0x13
+	.2byte	0x17c
+	.4byte	0x10b
+	.2byte	0x128
+	.uleb128 0x23
+	.string	"kbd"
+	.byte	0x13
+	.2byte	0x17d
+	.4byte	0x97d
+	.2byte	0x130
+	.uleb128 0x22
+	.4byte	.LASF154
+	.byte	0x13
+	.2byte	0x180
+	.4byte	0x54
+	.2byte	0x138
+	.uleb128 0x22
+	.4byte	.LASF155
+	.byte	0x13
+	.2byte	0x18d
+	.4byte	0x54
+	.2byte	0x13c
+	.uleb128 0x23
+	.string	"lmb"
+	.byte	0x13
+	.2byte	0x190
+	.4byte	0x42c
+	.2byte	0x140
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x740
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x58c
+	.uleb128 0x1f
+	.4byte	.LASF156
+	.byte	0x13
+	.2byte	0x196
+	.4byte	0x7da
+	.uleb128 0xc
+	.4byte	.LASF157
+	.byte	0x13
+	.2byte	0x198
+	.4byte	0x983
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0x9ac
+	.uleb128 0x17
+	.4byte	0xda
+	.2byte	0x3ff
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF352
+	.byte	0x4
+	.4byte	0x54
+	.byte	0x18
+	.byte	0xe
+	.4byte	0xc15
+	.uleb128 0x25
+	.4byte	.LASF158
+	.byte	0
+	.uleb128 0x25
+	.4byte	.LASF159
+	.byte	0x1
+	.uleb128 0x25
+	.4byte	.LASF160
+	.byte	0x2
+	.uleb128 0x25
+	.4byte	.LASF161
+	.byte	0x3
+	.uleb128 0x25
+	.4byte	.LASF162
+	.byte	0x4
+	.uleb128 0x25
+	.4byte	.LASF163
+	.byte	0x5
+	.uleb128 0x25
+	.4byte	.LASF164
+	.byte	0x6
+	.uleb128 0x25
+	.4byte	.LASF165
+	.byte	0x7
+	.uleb128 0x25
+	.4byte	.LASF166
+	.byte	0x8
+	.uleb128 0x25
+	.4byte	.LASF167
+	.byte	0x9
+	.uleb128 0x25
+	.4byte	.LASF168
+	.byte	0xa
+	.uleb128 0x25
+	.4byte	.LASF169
+	.byte	0xb
+	.uleb128 0x25
+	.4byte	.LASF170
+	.byte	0xc
+	.uleb128 0x25
+	.4byte	.LASF171
+	.byte	0xd
+	.uleb128 0x25
+	.4byte	.LASF172
+	.byte	0xe
+	.uleb128 0x25
+	.4byte	.LASF173
+	.byte	0xf
+	.uleb128 0x25
+	.4byte	.LASF174
+	.byte	0x10
+	.uleb128 0x25
+	.4byte	.LASF175
+	.byte	0x11
+	.uleb128 0x25
+	.4byte	.LASF176
+	.byte	0x12
+	.uleb128 0x25
+	.4byte	.LASF177
+	.byte	0x13
+	.uleb128 0x25
+	.4byte	.LASF178
+	.byte	0x14
+	.uleb128 0x25
+	.4byte	.LASF179
+	.byte	0x15
+	.uleb128 0x25
+	.4byte	.LASF180
+	.byte	0x16
+	.uleb128 0x25
+	.4byte	.LASF181
+	.byte	0x17
+	.uleb128 0x25
+	.4byte	.LASF182
+	.byte	0x18
+	.uleb128 0x25
+	.4byte	.LASF183
+	.byte	0x19
+	.uleb128 0x25
+	.4byte	.LASF184
+	.byte	0x1a
+	.uleb128 0x25
+	.4byte	.LASF185
+	.byte	0x1b
+	.uleb128 0x25
+	.4byte	.LASF186
+	.byte	0x1c
+	.uleb128 0x25
+	.4byte	.LASF187
+	.byte	0x1d
+	.uleb128 0x25
+	.4byte	.LASF188
+	.byte	0x1e
+	.uleb128 0x25
+	.4byte	.LASF189
+	.byte	0x1f
+	.uleb128 0x25
+	.4byte	.LASF190
+	.byte	0x20
+	.uleb128 0x25
+	.4byte	.LASF191
+	.byte	0x21
+	.uleb128 0x25
+	.4byte	.LASF192
+	.byte	0x22
+	.uleb128 0x25
+	.4byte	.LASF193
+	.byte	0x23
+	.uleb128 0x25
+	.4byte	.LASF194
+	.byte	0x24
+	.uleb128 0x25
+	.4byte	.LASF195
+	.byte	0x25
+	.uleb128 0x25
+	.4byte	.LASF196
+	.byte	0x26
+	.uleb128 0x25
+	.4byte	.LASF197
+	.byte	0x27
+	.uleb128 0x25
+	.4byte	.LASF198
+	.byte	0x28
+	.uleb128 0x25
+	.4byte	.LASF199
+	.byte	0x29
+	.uleb128 0x25
+	.4byte	.LASF200
+	.byte	0x2a
+	.uleb128 0x25
+	.4byte	.LASF201
+	.byte	0x2b
+	.uleb128 0x25
+	.4byte	.LASF202
+	.byte	0x2c
+	.uleb128 0x25
+	.4byte	.LASF203
+	.byte	0x2d
+	.uleb128 0x25
+	.4byte	.LASF204
+	.byte	0x2e
+	.uleb128 0x25
+	.4byte	.LASF205
+	.byte	0x2f
+	.uleb128 0x25
+	.4byte	.LASF206
+	.byte	0x30
+	.uleb128 0x25
+	.4byte	.LASF207
+	.byte	0x31
+	.uleb128 0x25
+	.4byte	.LASF208
+	.byte	0x32
+	.uleb128 0x25
+	.4byte	.LASF209
+	.byte	0x33
+	.uleb128 0x25
+	.4byte	.LASF210
+	.byte	0x34
+	.uleb128 0x25
+	.4byte	.LASF211
+	.byte	0x35
+	.uleb128 0x25
+	.4byte	.LASF212
+	.byte	0x36
+	.uleb128 0x25
+	.4byte	.LASF213
+	.byte	0x37
+	.uleb128 0x25
+	.4byte	.LASF214
+	.byte	0x38
+	.uleb128 0x25
+	.4byte	.LASF215
+	.byte	0x39
+	.uleb128 0x25
+	.4byte	.LASF216
+	.byte	0x3a
+	.uleb128 0x25
+	.4byte	.LASF217
+	.byte	0x3b
+	.uleb128 0x25
+	.4byte	.LASF218
+	.byte	0x3c
+	.uleb128 0x25
+	.4byte	.LASF219
+	.byte	0x3d
+	.uleb128 0x25
+	.4byte	.LASF220
+	.byte	0x3e
+	.uleb128 0x25
+	.4byte	.LASF221
+	.byte	0x3f
+	.uleb128 0x25
+	.4byte	.LASF222
+	.byte	0x40
+	.uleb128 0x25
+	.4byte	.LASF223
+	.byte	0x41
+	.uleb128 0x25
+	.4byte	.LASF224
+	.byte	0x42
+	.uleb128 0x25
+	.4byte	.LASF225
+	.byte	0x43
+	.uleb128 0x25
+	.4byte	.LASF226
+	.byte	0x44
+	.uleb128 0x25
+	.4byte	.LASF227
+	.byte	0x45
+	.uleb128 0x25
+	.4byte	.LASF228
+	.byte	0x46
+	.uleb128 0x25
+	.4byte	.LASF229
+	.byte	0x47
+	.uleb128 0x25
+	.4byte	.LASF230
+	.byte	0x48
+	.uleb128 0x25
+	.4byte	.LASF231
+	.byte	0x49
+	.uleb128 0x25
+	.4byte	.LASF232
+	.byte	0x4a
+	.uleb128 0x25
+	.4byte	.LASF233
+	.byte	0x4b
+	.uleb128 0x25
+	.4byte	.LASF234
+	.byte	0x4c
+	.uleb128 0x25
+	.4byte	.LASF235
+	.byte	0x4d
+	.uleb128 0x25
+	.4byte	.LASF236
+	.byte	0x4e
+	.uleb128 0x25
+	.4byte	.LASF237
+	.byte	0x4f
+	.uleb128 0x25
+	.4byte	.LASF238
+	.byte	0x50
+	.uleb128 0x25
+	.4byte	.LASF239
+	.byte	0x51
+	.uleb128 0x25
+	.4byte	.LASF240
+	.byte	0x52
+	.uleb128 0x25
+	.4byte	.LASF241
+	.byte	0x53
+	.uleb128 0x25
+	.4byte	.LASF242
+	.byte	0x54
+	.uleb128 0x25
+	.4byte	.LASF243
+	.byte	0x55
+	.uleb128 0x25
+	.4byte	.LASF244
+	.byte	0x56
+	.uleb128 0x25
+	.4byte	.LASF245
+	.byte	0x57
+	.uleb128 0x25
+	.4byte	.LASF246
+	.byte	0x58
+	.uleb128 0x25
+	.4byte	.LASF247
+	.byte	0x59
+	.uleb128 0x25
+	.4byte	.LASF248
+	.byte	0x5a
+	.uleb128 0x25
+	.4byte	.LASF249
+	.byte	0x5b
+	.uleb128 0x25
+	.4byte	.LASF250
+	.byte	0x5c
+	.uleb128 0x25
+	.4byte	.LASF251
+	.byte	0x5d
+	.uleb128 0x25
+	.4byte	.LASF252
+	.byte	0x5e
+	.uleb128 0x25
+	.4byte	.LASF253
+	.byte	0x5f
+	.uleb128 0x25
+	.4byte	.LASF254
+	.byte	0x60
+	.uleb128 0x25
+	.4byte	.LASF255
+	.byte	0x61
+	.uleb128 0x25
+	.4byte	.LASF256
+	.byte	0x62
+	.uleb128 0x26
+	.4byte	.LASF257
+	.sleb128 -1
+	.byte	0
+	.uleb128 0x27
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x23
+	.byte	0xf6
+	.4byte	0xc28
+	.uleb128 0x25
+	.4byte	.LASF258
+	.byte	0x5
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF259
+	.byte	0x40
+	.byte	0x14
+	.byte	0xc
+	.4byte	0xca1
+	.uleb128 0xe
+	.4byte	.LASF260
+	.byte	0x14
+	.byte	0x22
+	.4byte	0x3b
+	.byte	0
+	.uleb128 0xf
+	.string	"tbu"
+	.byte	0x14
+	.byte	0x23
+	.4byte	0x7f
+	.byte	0x8
+	.uleb128 0xf
+	.string	"tbl"
+	.byte	0x14
+	.byte	0x24
+	.4byte	0x7f
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF261
+	.byte	0x14
+	.byte	0x25
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF262
+	.byte	0x14
+	.byte	0x26
+	.4byte	0x8d
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF263
+	.byte	0x14
+	.byte	0x29
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF264
+	.byte	0x14
+	.byte	0x2a
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x14
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF266
+	.byte	0x14
+	.byte	0x2d
+	.4byte	0x3b
+	.byte	0x38
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF267
+	.byte	0x18
+	.byte	0x15
+	.byte	0x22
+	.4byte	0xce9
+	.uleb128 0xe
+	.4byte	.LASF268
+	.byte	0x15
+	.byte	0x23
+	.4byte	0xae
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF269
+	.byte	0x15
+	.byte	0x24
+	.4byte	0xae
+	.byte	0x4
+	.uleb128 0xf
+	.string	"id"
+	.byte	0x15
+	.byte	0x25
+	.4byte	0xae
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF270
+	.byte	0x15
+	.byte	0x26
+	.4byte	0xae
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF271
+	.byte	0x15
+	.byte	0x27
+	.4byte	0x10b
+	.byte	0x10
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF272
+	.2byte	0x1c0
+	.byte	0x15
+	.byte	0x2a
+	.4byte	0xf12
+	.uleb128 0xf
+	.string	"bd"
+	.byte	0x15
+	.byte	0x2b
+	.4byte	0x97d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF42
+	.byte	0x15
+	.byte	0x2c
+	.4byte	0x3b
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF270
+	.byte	0x15
+	.byte	0x2d
+	.4byte	0x7f
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF273
+	.byte	0x15
+	.byte	0x2e
+	.4byte	0x3b
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF274
+	.byte	0x15
+	.byte	0x2f
+	.4byte	0x3b
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF275
+	.byte	0x15
+	.byte	0x31
+	.4byte	0x3b
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF276
+	.byte	0x15
+	.byte	0x32
+	.4byte	0x3b
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF277
+	.byte	0x15
+	.byte	0x3e
+	.4byte	0x3b
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF278
+	.byte	0x15
+	.byte	0x42
+	.4byte	0x3b
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF279
+	.byte	0x15
+	.byte	0x43
+	.4byte	0x3b
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF280
+	.byte	0x15
+	.byte	0x45
+	.4byte	0x3b
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF281
+	.byte	0x15
+	.byte	0x46
+	.4byte	0x3b
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF282
+	.byte	0x15
+	.byte	0x47
+	.4byte	0x3b
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF283
+	.byte	0x15
+	.byte	0x48
+	.4byte	0xcf
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF284
+	.byte	0x15
+	.byte	0x49
+	.4byte	0x3b
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF285
+	.byte	0x15
+	.byte	0x4a
+	.4byte	0x3b
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF286
+	.byte	0x15
+	.byte	0x4b
+	.4byte	0x3b
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF287
+	.byte	0x15
+	.byte	0x4c
+	.4byte	0x3b
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF288
+	.byte	0x15
+	.byte	0x4d
+	.4byte	0xf12
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF289
+	.byte	0x15
+	.byte	0x50
+	.4byte	0x25f
+	.byte	0x98
+	.uleb128 0xe
+	.4byte	.LASF290
+	.byte	0x15
+	.byte	0x51
+	.4byte	0x25f
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF291
+	.byte	0x15
+	.byte	0x52
+	.4byte	0x292
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF292
+	.byte	0x15
+	.byte	0x57
+	.4byte	0x265
+	.byte	0xb8
+	.uleb128 0xe
+	.4byte	.LASF293
+	.byte	0x15
+	.byte	0x58
+	.4byte	0x137
+	.byte	0xc0
+	.uleb128 0xe
+	.4byte	.LASF294
+	.byte	0x15
+	.byte	0x59
+	.4byte	0x3b
+	.byte	0xc8
+	.uleb128 0xe
+	.4byte	.LASF295
+	.byte	0x15
+	.byte	0x5b
+	.4byte	0xf8a
+	.byte	0xd0
+	.uleb128 0xe
+	.4byte	.LASF296
+	.byte	0x15
+	.byte	0x5c
+	.4byte	0xf8a
+	.byte	0xd8
+	.uleb128 0xe
+	.4byte	.LASF297
+	.byte	0x15
+	.byte	0x5e
+	.4byte	0x265
+	.byte	0xe0
+	.uleb128 0xe
+	.4byte	.LASF298
+	.byte	0x15
+	.byte	0x5f
+	.4byte	0x265
+	.byte	0xe8
+	.uleb128 0xf
+	.string	"jt"
+	.byte	0x15
+	.byte	0x60
+	.4byte	0xf95
+	.byte	0xf0
+	.uleb128 0xe
+	.4byte	.LASF299
+	.byte	0x15
+	.byte	0x61
+	.4byte	0xf9b
+	.byte	0xf8
+	.uleb128 0x15
+	.4byte	.LASF300
+	.byte	0x15
+	.byte	0x6b
+	.4byte	0x7f
+	.2byte	0x118
+	.uleb128 0x15
+	.4byte	.LASF301
+	.byte	0x15
+	.byte	0x6c
+	.4byte	0x7f
+	.2byte	0x11c
+	.uleb128 0x15
+	.4byte	.LASF302
+	.byte	0x15
+	.byte	0x6e
+	.4byte	0x3b
+	.2byte	0x120
+	.uleb128 0x15
+	.4byte	.LASF303
+	.byte	0x15
+	.byte	0x6f
+	.4byte	0x3b
+	.2byte	0x128
+	.uleb128 0x15
+	.4byte	.LASF304
+	.byte	0x15
+	.byte	0x70
+	.4byte	0x3b
+	.2byte	0x130
+	.uleb128 0x15
+	.4byte	.LASF305
+	.byte	0x15
+	.byte	0x79
+	.4byte	0x25f
+	.2byte	0x138
+	.uleb128 0x15
+	.4byte	.LASF127
+	.byte	0x15
+	.byte	0x7a
+	.4byte	0xc28
+	.2byte	0x140
+	.uleb128 0x15
+	.4byte	.LASF306
+	.byte	0x15
+	.byte	0x80
+	.4byte	0x10b
+	.2byte	0x180
+	.uleb128 0x15
+	.4byte	.LASF307
+	.byte	0x15
+	.byte	0x81
+	.4byte	0x10b
+	.2byte	0x188
+	.uleb128 0x15
+	.4byte	.LASF308
+	.byte	0x15
+	.byte	0x87
+	.4byte	0xc4
+	.2byte	0x190
+	.uleb128 0x15
+	.4byte	.LASF309
+	.byte	0x15
+	.byte	0x8c
+	.4byte	0xca1
+	.2byte	0x198
+	.uleb128 0x15
+	.4byte	.LASF310
+	.byte	0x15
+	.byte	0x8d
+	.4byte	0x10b
+	.2byte	0x1b0
+	.uleb128 0x15
+	.4byte	.LASF311
+	.byte	0x15
+	.byte	0x8e
+	.4byte	0x54
+	.2byte	0x1b8
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xce9
+	.uleb128 0xd
+	.4byte	.LASF312
+	.byte	0x40
+	.byte	0x16
+	.byte	0x2c
+	.4byte	0xf85
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x16
+	.byte	0x2d
+	.4byte	0xe1
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF126
+	.byte	0x16
+	.byte	0x2e
+	.4byte	0xe1
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF313
+	.byte	0x16
+	.byte	0x2f
+	.4byte	0x12be
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF314
+	.byte	0x16
+	.byte	0x30
+	.4byte	0xe1
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF315
+	.byte	0x16
+	.byte	0x32
+	.4byte	0x1306
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF34
+	.byte	0x16
+	.byte	0x33
+	.4byte	0xf8a
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF316
+	.byte	0x16
+	.byte	0x34
+	.4byte	0xf8a
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF317
+	.byte	0x16
+	.byte	0x35
+	.4byte	0xf8a
+	.byte	0x38
+	.byte	0
+	.uleb128 0x7
+	.4byte	0xf18
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xf18
+	.uleb128 0x18
+	.4byte	.LASF319
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xf90
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0xfab
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x2
+	.4byte	.LASF320
+	.byte	0x15
+	.byte	0x9b
+	.4byte	0xce9
+	.uleb128 0x28
+	.4byte	0xfab
+	.uleb128 0x4
+	.4byte	.LASF321
+	.byte	0x2
+	.byte	0xad
+	.4byte	0x10b
+	.uleb128 0xa
+	.4byte	0x94
+	.4byte	0xfd1
+	.uleb128 0xb
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF322
+	.byte	0x2
+	.byte	0xaf
+	.4byte	0xfc6
+	.uleb128 0x4
+	.4byte	.LASF323
+	.byte	0x2
+	.byte	0xb0
+	.4byte	0xfc6
+	.uleb128 0x4
+	.4byte	.LASF324
+	.byte	0x2
+	.byte	0xfe
+	.4byte	0x10b
+	.uleb128 0x4
+	.4byte	.LASF325
+	.byte	0x2
+	.byte	0xff
+	.4byte	0x10b
+	.uleb128 0xc
+	.4byte	.LASF326
+	.byte	0x2
+	.2byte	0x100
+	.4byte	0x10b
+	.uleb128 0xd
+	.4byte	.LASF327
+	.byte	0x4
+	.byte	0x17
+	.byte	0x2e
+	.4byte	0x1022
+	.uleb128 0xe
+	.4byte	.LASF328
+	.byte	0x17
+	.byte	0x2f
+	.4byte	0x12c
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x29
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x1037
+	.uleb128 0x13
+	.4byte	0x25f
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1028
+	.uleb128 0xa
+	.4byte	0x94
+	.4byte	0x104d
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x5
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF329
+	.byte	0x17
+	.2byte	0x1fd
+	.4byte	0x1009
+	.uleb128 0xc
+	.4byte	.LASF330
+	.byte	0x17
+	.2byte	0x1fe
+	.4byte	0x1009
+	.uleb128 0xc
+	.4byte	.LASF331
+	.byte	0x17
+	.2byte	0x200
+	.4byte	0x1009
+	.uleb128 0xc
+	.4byte	.LASF332
+	.byte	0x17
+	.2byte	0x205
+	.4byte	0xf9b
+	.uleb128 0xc
+	.4byte	.LASF333
+	.byte	0x17
+	.2byte	0x206
+	.4byte	0xf9b
+	.uleb128 0xa
+	.4byte	0xe7
+	.4byte	0x1099
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x3f
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF334
+	.byte	0x17
+	.2byte	0x207
+	.4byte	0x1089
+	.uleb128 0xc
+	.4byte	.LASF335
+	.byte	0x17
+	.2byte	0x209
+	.4byte	0x103d
+	.uleb128 0xc
+	.4byte	.LASF336
+	.byte	0x17
+	.2byte	0x20a
+	.4byte	0x103d
+	.uleb128 0xc
+	.4byte	.LASF337
+	.byte	0x17
+	.2byte	0x20b
+	.4byte	0x1009
+	.uleb128 0xc
+	.4byte	.LASF338
+	.byte	0x17
+	.2byte	0x20c
+	.4byte	0x1009
+	.uleb128 0xc
+	.4byte	.LASF339
+	.byte	0x17
+	.2byte	0x20d
+	.4byte	0x1022
+	.uleb128 0xa
+	.4byte	0x1022
+	.4byte	0x10f1
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x3
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF340
+	.byte	0x17
+	.2byte	0x20e
+	.4byte	0x10e1
+	.uleb128 0xc
+	.4byte	.LASF341
+	.byte	0x17
+	.2byte	0x20f
+	.4byte	0x1022
+	.uleb128 0xc
+	.4byte	.LASF342
+	.byte	0x17
+	.2byte	0x210
+	.4byte	0x54
+	.uleb128 0xa
+	.4byte	0x9e
+	.4byte	0x1125
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x5
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x1115
+	.uleb128 0xc
+	.4byte	.LASF343
+	.byte	0x17
+	.2byte	0x211
+	.4byte	0x1125
+	.uleb128 0xc
+	.4byte	.LASF344
+	.byte	0x17
+	.2byte	0x212
+	.4byte	0x1125
+	.uleb128 0xc
+	.4byte	.LASF345
+	.byte	0x17
+	.2byte	0x216
+	.4byte	0x100
+	.uleb128 0xc
+	.4byte	.LASF346
+	.byte	0x17
+	.2byte	0x217
+	.4byte	0x100
+	.uleb128 0xc
+	.4byte	.LASF347
+	.byte	0x17
+	.2byte	0x219
+	.4byte	0x54
+	.uleb128 0xc
+	.4byte	.LASF348
+	.byte	0x17
+	.2byte	0x220
+	.4byte	0x99b
+	.uleb128 0xc
+	.4byte	.LASF349
+	.byte	0x17
+	.2byte	0x222
+	.4byte	0xae
+	.uleb128 0xc
+	.4byte	.LASF350
+	.byte	0x17
+	.2byte	0x224
+	.4byte	0xae
+	.uleb128 0xc
+	.4byte	.LASF351
+	.byte	0x17
+	.2byte	0x230
+	.4byte	0x1009
+	.uleb128 0x29
+	.4byte	.LASF353
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x17
+	.2byte	0x286
+	.4byte	0x11c0
+	.uleb128 0x25
+	.4byte	.LASF354
+	.byte	0
+	.uleb128 0x25
+	.4byte	.LASF355
+	.byte	0x1
+	.uleb128 0x25
+	.4byte	.LASF356
+	.byte	0x2
+	.uleb128 0x25
+	.4byte	.LASF357
+	.byte	0x3
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF358
+	.byte	0x17
+	.2byte	0x28c
+	.4byte	0x1196
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x94
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xa3
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xae
+	.uleb128 0xd
+	.4byte	.LASF27
+	.byte	0x78
+	.byte	0x8
+	.byte	0xf1
+	.4byte	0x12b9
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x8
+	.byte	0xf2
+	.4byte	0xfa
+	.byte	0
+	.uleb128 0xf
+	.string	"id"
+	.byte	0x8
+	.byte	0xf3
+	.4byte	0x9ac
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF359
+	.byte	0x8
+	.byte	0xf4
+	.4byte	0x141c
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF360
+	.byte	0x8
+	.byte	0xf5
+	.4byte	0x1037
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF361
+	.byte	0x8
+	.byte	0xf6
+	.4byte	0x1037
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF362
+	.byte	0x8
+	.byte	0xf7
+	.4byte	0x1037
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF363
+	.byte	0x8
+	.byte	0xf8
+	.4byte	0x1037
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF364
+	.byte	0x8
+	.byte	0xf9
+	.4byte	0x1037
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF365
+	.byte	0x8
+	.byte	0xfa
+	.4byte	0x1037
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF366
+	.byte	0x8
+	.byte	0xfb
+	.4byte	0x1037
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF367
+	.byte	0x8
+	.byte	0xfc
+	.4byte	0x1037
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF368
+	.byte	0x8
+	.byte	0xfd
+	.4byte	0x54
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF369
+	.byte	0x8
+	.byte	0xfe
+	.4byte	0x54
+	.byte	0x5c
+	.uleb128 0xe
+	.4byte	.LASF370
+	.byte	0x8
+	.byte	0xff
+	.4byte	0x54
+	.byte	0x60
+	.uleb128 0x1e
+	.4byte	.LASF371
+	.byte	0x8
+	.2byte	0x100
+	.4byte	0x54
+	.byte	0x64
+	.uleb128 0x20
+	.string	"ops"
+	.byte	0x8
+	.2byte	0x101
+	.4byte	0x265
+	.byte	0x68
+	.uleb128 0x1e
+	.4byte	.LASF42
+	.byte	0x8
+	.2byte	0x102
+	.4byte	0x121
+	.byte	0x70
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x11de
+	.uleb128 0x2
+	.4byte	.LASF313
+	.byte	0x16
+	.byte	0xf
+	.4byte	0xae
+	.uleb128 0xd
+	.4byte	.LASF372
+	.byte	0x20
+	.byte	0x16
+	.byte	0x19
+	.4byte	0x1306
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x16
+	.byte	0x1a
+	.4byte	0xfa
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF373
+	.byte	0x16
+	.byte	0x1b
+	.4byte	0x54
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF374
+	.byte	0x16
+	.byte	0x1c
+	.4byte	0x137
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF47
+	.byte	0x16
+	.byte	0x1d
+	.4byte	0x1306
+	.byte	0x18
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x12c9
+	.uleb128 0x2a
+	.string	"gd"
+	.byte	0x16
+	.byte	0x57
+	.4byte	0x1316
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xfb6
+	.uleb128 0x2b
+	.4byte	.LASF462
+	.byte	0x8
+	.byte	0x19
+	.byte	0x33
+	.4byte	0x133e
+	.uleb128 0x2c
+	.string	"np"
+	.byte	0x19
+	.byte	0x34
+	.4byte	0x133e
+	.uleb128 0x2d
+	.4byte	.LASF375
+	.byte	0x19
+	.byte	0x35
+	.4byte	0xf3
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0xf85
+	.uleb128 0x2
+	.4byte	.LASF376
+	.byte	0x19
+	.byte	0x36
+	.4byte	0x131c
+	.uleb128 0xc
+	.4byte	.LASF377
+	.byte	0x1a
+	.2byte	0x3ba
+	.4byte	0x10b
+	.uleb128 0xc
+	.4byte	.LASF378
+	.byte	0x1a
+	.2byte	0x3bb
+	.4byte	0x10b
+	.uleb128 0xc
+	.4byte	.LASF379
+	.byte	0x1a
+	.2byte	0x3bc
+	.4byte	0x10b
+	.uleb128 0xd
+	.4byte	.LASF380
+	.byte	0x4
+	.byte	0x1b
+	.byte	0xd
+	.4byte	0x138c
+	.uleb128 0xf
+	.string	"pid"
+	.byte	0x1b
+	.byte	0xe
+	.4byte	0x54
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.4byte	.LASF381
+	.byte	0x1b
+	.byte	0x11
+	.4byte	0x1397
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1373
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x12b9
+	.uleb128 0xd
+	.4byte	.LASF36
+	.byte	0x38
+	.byte	0x1c
+	.byte	0x23
+	.4byte	0x13ec
+	.uleb128 0xe
+	.4byte	.LASF35
+	.byte	0x1c
+	.byte	0x24
+	.4byte	0x137
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF382
+	.byte	0x1c
+	.byte	0x25
+	.4byte	0x1506
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x1c
+	.byte	0x26
+	.4byte	0x292
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF41
+	.byte	0x1c
+	.byte	0x27
+	.4byte	0x292
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF384
+	.byte	0x1c
+	.byte	0x29
+	.4byte	0x2b7
+	.byte	0x30
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x13a3
+	.uleb128 0xd
+	.4byte	.LASF385
+	.byte	0x10
+	.byte	0x8
+	.byte	0xb8
+	.4byte	0x1417
+	.uleb128 0xe
+	.4byte	.LASF386
+	.byte	0x8
+	.byte	0xb9
+	.4byte	0xe1
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF387
+	.byte	0x8
+	.byte	0xba
+	.4byte	0x10b
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x13f2
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1417
+	.uleb128 0xd
+	.4byte	.LASF388
+	.byte	0x80
+	.byte	0x1c
+	.byte	0x57
+	.4byte	0x1506
+	.uleb128 0xe
+	.4byte	.LASF28
+	.byte	0x1c
+	.byte	0x58
+	.4byte	0xe1
+	.byte	0
+	.uleb128 0xf
+	.string	"id"
+	.byte	0x1c
+	.byte	0x59
+	.4byte	0x9ac
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF389
+	.byte	0x1c
+	.byte	0x5a
+	.4byte	0x1037
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF390
+	.byte	0x1c
+	.byte	0x5b
+	.4byte	0x1037
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF391
+	.byte	0x1c
+	.byte	0x5c
+	.4byte	0x1037
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF392
+	.byte	0x1c
+	.byte	0x5d
+	.4byte	0x1037
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF393
+	.byte	0x1c
+	.byte	0x5e
+	.4byte	0x1037
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF365
+	.byte	0x1c
+	.byte	0x5f
+	.4byte	0x1037
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF366
+	.byte	0x1c
+	.byte	0x60
+	.4byte	0x1037
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF394
+	.byte	0x1c
+	.byte	0x61
+	.4byte	0x151b
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF395
+	.byte	0x1c
+	.byte	0x62
+	.4byte	0x151b
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF368
+	.byte	0x1c
+	.byte	0x63
+	.4byte	0x54
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF396
+	.byte	0x1c
+	.byte	0x64
+	.4byte	0x54
+	.byte	0x5c
+	.uleb128 0xe
+	.4byte	.LASF397
+	.byte	0x1c
+	.byte	0x65
+	.4byte	0x54
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF370
+	.byte	0x1c
+	.byte	0x66
+	.4byte	0x54
+	.byte	0x64
+	.uleb128 0xe
+	.4byte	.LASF371
+	.byte	0x1c
+	.byte	0x67
+	.4byte	0x54
+	.byte	0x68
+	.uleb128 0xf
+	.string	"ops"
+	.byte	0x1c
+	.byte	0x68
+	.4byte	0x265
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF42
+	.byte	0x1c
+	.byte	0x69
+	.4byte	0x121
+	.byte	0x78
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1422
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x151b
+	.uleb128 0x13
+	.4byte	0x13ec
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x150c
+	.uleb128 0x4
+	.4byte	.LASF398
+	.byte	0x1d
+	.byte	0x49
+	.4byte	0x7f
+	.uleb128 0x24
+	.4byte	.LASF399
+	.byte	0x4
+	.4byte	0x7f
+	.byte	0x1e
+	.byte	0x15
+	.4byte	0x155b
+	.uleb128 0x25
+	.4byte	.LASF400
+	.byte	0x1
+	.uleb128 0x25
+	.4byte	.LASF401
+	.byte	0x2
+	.uleb128 0x25
+	.4byte	.LASF402
+	.byte	0x4
+	.uleb128 0x25
+	.4byte	.LASF403
+	.byte	0x8
+	.uleb128 0x25
+	.4byte	.LASF404
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF405
+	.byte	0x20
+	.byte	0x1e
+	.byte	0x61
+	.4byte	0x1598
+	.uleb128 0xe
+	.4byte	.LASF406
+	.byte	0x1e
+	.byte	0x6b
+	.4byte	0x15bb
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF407
+	.byte	0x1e
+	.byte	0x75
+	.4byte	0x15df
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF408
+	.byte	0x1e
+	.byte	0x7f
+	.4byte	0x15fe
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF409
+	.byte	0x1e
+	.byte	0x8c
+	.4byte	0x162c
+	.byte	0x18
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x155b
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x15bb
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x137
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x159d
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x15df
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x265
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x15c1
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x15fe
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x3b
+	.uleb128 0x13
+	.4byte	0x137
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x15e5
+	.uleb128 0x12
+	.4byte	0x54
+	.4byte	0x162c
+	.uleb128 0x13
+	.4byte	0x25f
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x137
+	.uleb128 0x13
+	.4byte	0x54
+	.uleb128 0x13
+	.4byte	0x137
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1604
+	.uleb128 0xd
+	.4byte	.LASF410
+	.byte	0x20
+	.byte	0x1f
+	.byte	0x5e
+	.4byte	0x166f
+	.uleb128 0xe
+	.4byte	.LASF60
+	.byte	0x1f
+	.byte	0x5f
+	.4byte	0x137
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF411
+	.byte	0x1f
+	.byte	0x60
+	.4byte	0x3b
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF412
+	.byte	0x1f
+	.byte	0x61
+	.4byte	0x3b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF413
+	.byte	0x1f
+	.byte	0x62
+	.4byte	0x3b
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF414
+	.byte	0x20
+	.byte	0x1
+	.byte	0xf
+	.4byte	0x16ac
+	.uleb128 0xe
+	.4byte	.LASF406
+	.byte	0x1
+	.byte	0x10
+	.4byte	0x15bb
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF407
+	.byte	0x1
+	.byte	0x11
+	.4byte	0x15df
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF415
+	.byte	0x1
+	.byte	0x12
+	.4byte	0x16cb
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF416
+	.byte	0x1
+	.byte	0x15
+	.4byte	0x16cb
+	.byte	0x18
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x166f
+	.uleb128 0x2e
+	.4byte	0x16cb
+	.uleb128 0x13
+	.4byte	0x11d8
+	.uleb128 0x13
+	.4byte	0x11d8
+	.uleb128 0x13
+	.4byte	0x3b
+	.uleb128 0x13
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x16b1
+	.uleb128 0x2f
+	.4byte	.LASF417
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x1598
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	rockchip_secure_otp_ops
+	.uleb128 0x2f
+	.4byte	.LASF418
+	.byte	0x1
+	.2byte	0x2dc
+	.4byte	0x16ac
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	rk3562_data
+	.uleb128 0xa
+	.4byte	0x1417
+	.4byte	0x170d
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x16fd
+	.uleb128 0x2f
+	.4byte	.LASF419
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x170d
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	rockchip_otp_ids
+	.uleb128 0x30
+	.4byte	.LASF420
+	.byte	0x1
+	.2byte	0x2eb
+	.4byte	0x11de
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	_u_boot_list_2_driver_2_rockchip_secure_otp
+	.uleb128 0x31
+	.4byte	.LASF421
+	.byte	0x1
+	.2byte	0x2cd
+	.4byte	0x54
+	.8byte	.LFB277
+	.8byte	.LFE277-.LFB277
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x182b
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x2cd
+	.4byte	0x25f
+	.4byte	.LLST14
+	.uleb128 0x33
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x2cf
+	.4byte	0x182b
+	.4byte	.LLST15
+	.uleb128 0x34
+	.8byte	.LVL20
+	.4byte	0x4289
+	.4byte	0x1798
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL23
+	.4byte	0x4295
+	.4byte	0x17b0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL24
+	.4byte	0x42a0
+	.4byte	0x17da
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x1
+	.byte	0x30
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL25
+	.4byte	0x42a0
+	.4byte	0x1804
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC1
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x1
+	.byte	0x30
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL26
+	.4byte	0x42a0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC2
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x1
+	.byte	0x30
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x1632
+	.uleb128 0x31
+	.4byte	.LASF422
+	.byte	0x1
+	.2byte	0x2b6
+	.4byte	0x54
+	.8byte	.LFB276
+	.8byte	.LFE276-.LFB276
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x18b2
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x2b6
+	.4byte	0x25f
+	.4byte	.LLST1
+	.uleb128 0x37
+	.4byte	.LASF423
+	.byte	0x1
+	.2byte	0x2b7
+	.4byte	0x3b
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x38
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2b8
+	.4byte	0x137
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x33
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x2ba
+	.4byte	0x54
+	.4byte	.LLST2
+	.uleb128 0x39
+	.4byte	0x18b2
+	.8byte	.LBB23
+	.8byte	.LBE23-.LBB23
+	.byte	0x1
+	.2byte	0x2be
+	.uleb128 0x3a
+	.4byte	0x18c3
+	.4byte	.LLST3
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.4byte	.LASF431
+	.byte	0x1
+	.2byte	0x2af
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x18d0
+	.uleb128 0x3c
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2af
+	.4byte	0x11d8
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF424
+	.byte	0x1
+	.2byte	0x2a7
+	.4byte	0x54
+	.8byte	.LFB274
+	.8byte	.LFE274-.LFB274
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1981
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x2a7
+	.4byte	0x25f
+	.4byte	.LLST4
+	.uleb128 0x3d
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x2a7
+	.4byte	0x54
+	.4byte	.LLST5
+	.uleb128 0x32
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2a8
+	.4byte	0x265
+	.4byte	.LLST6
+	.uleb128 0x3d
+	.4byte	.LASF51
+	.byte	0x1
+	.2byte	0x2a8
+	.4byte	0x54
+	.4byte	.LLST7
+	.uleb128 0x3e
+	.4byte	.LASF426
+	.byte	0x1
+	.2byte	0x2aa
+	.4byte	0x1981
+	.4byte	.LLST8
+	.uleb128 0x34
+	.8byte	.LVL8
+	.4byte	0x42ab
+	.4byte	0x195a
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3f
+	.8byte	.LVL12
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.byte	0x8
+	.4byte	0x166f
+	.uleb128 0x31
+	.4byte	.LASF427
+	.byte	0x1
+	.2byte	0x29f
+	.4byte	0x54
+	.8byte	.LFB273
+	.8byte	.LFE273-.LFB273
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1a38
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x29f
+	.4byte	0x25f
+	.4byte	.LLST9
+	.uleb128 0x3d
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x29f
+	.4byte	0x54
+	.4byte	.LLST10
+	.uleb128 0x32
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x2a0
+	.4byte	0x137
+	.4byte	.LLST11
+	.uleb128 0x3d
+	.4byte	.LASF51
+	.byte	0x1
+	.2byte	0x2a0
+	.4byte	0x54
+	.4byte	.LLST12
+	.uleb128 0x3e
+	.4byte	.LASF426
+	.byte	0x1
+	.2byte	0x2a2
+	.4byte	0x1981
+	.4byte	.LLST13
+	.uleb128 0x34
+	.8byte	.LVL14
+	.4byte	0x42ab
+	.4byte	0x1a11
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x3f
+	.8byte	.LVL18
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.4byte	.LASF428
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x54
+	.8byte	.LFB272
+	.8byte	.LFE272-.LFB272
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x2564
+	.uleb128 0x32
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x25f
+	.4byte	.LLST69
+	.uleb128 0x3d
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x54
+	.4byte	.LLST70
+	.uleb128 0x32
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x265
+	.4byte	.LLST71
+	.uleb128 0x3d
+	.4byte	.LASF51
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0x54
+	.4byte	.LLST72
+	.uleb128 0x33
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x26e
+	.4byte	0x182b
+	.4byte	.LLST73
+	.uleb128 0x3e
+	.4byte	.LASF387
+	.byte	0x1
+	.2byte	0x26f
+	.4byte	0x11d2
+	.4byte	.LLST74
+	.uleb128 0x3e
+	.4byte	.LASF429
+	.byte	0x1
+	.2byte	0x270
+	.4byte	0xfa
+	.4byte	.LLST74
+	.uleb128 0x3e
+	.4byte	.LASF430
+	.byte	0x1
+	.2byte	0x271
+	.4byte	0xfa
+	.4byte	.LLST76
+	.uleb128 0x33
+	.string	"i"
+	.byte	0x1
+	.2byte	0x272
+	.4byte	0x54
+	.4byte	.LLST77
+	.uleb128 0x33
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x272
+	.4byte	0x54
+	.4byte	.LLST78
+	.uleb128 0x40
+	.4byte	0x2564
+	.8byte	.LBB244
+	.4byte	.Ldebug_ranges0+0x3f0
+	.byte	0x1
+	.2byte	0x294
+	.4byte	0x2436
+	.uleb128 0x3a
+	.4byte	0x2599
+	.4byte	.LLST79
+	.uleb128 0x3a
+	.4byte	0x258d
+	.4byte	.LLST80
+	.uleb128 0x3a
+	.4byte	0x2581
+	.4byte	.LLST81
+	.uleb128 0x3a
+	.4byte	0x2575
+	.4byte	.LLST82
+	.uleb128 0x41
+	.4byte	.Ldebug_ranges0+0x3f0
+	.uleb128 0x42
+	.4byte	0x25a5
+	.4byte	.LLST83
+	.uleb128 0x42
+	.4byte	0x25b1
+	.4byte	.LLST84
+	.uleb128 0x43
+	.4byte	0x25ca
+	.8byte	.L88
+	.uleb128 0x44
+	.4byte	0x25bd
+	.uleb128 0x45
+	.8byte	.LBB246
+	.8byte	.LBE246-.LBB246
+	.4byte	0x1b7c
+	.uleb128 0x42
+	.4byte	0x25d7
+	.4byte	.LLST85
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB247
+	.8byte	.LBE247-.LBB247
+	.4byte	0x1b9b
+	.uleb128 0x42
+	.4byte	0x25e9
+	.4byte	.LLST86
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB248
+	.8byte	.LBE248-.LBB248
+	.4byte	0x1bba
+	.uleb128 0x42
+	.4byte	0x25fb
+	.4byte	.LLST87
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB249
+	.8byte	.LBE249-.LBB249
+	.4byte	0x1bd9
+	.uleb128 0x42
+	.4byte	0x260d
+	.4byte	.LLST88
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB250
+	.8byte	.LBE250-.LBB250
+	.4byte	0x1bf8
+	.uleb128 0x42
+	.4byte	0x261f
+	.4byte	.LLST89
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB251
+	.8byte	.LBE251-.LBB251
+	.4byte	0x1c17
+	.uleb128 0x42
+	.4byte	0x2631
+	.4byte	.LLST90
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB252
+	.8byte	.LBE252-.LBB252
+	.4byte	0x1c36
+	.uleb128 0x42
+	.4byte	0x2643
+	.4byte	.LLST91
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB253
+	.8byte	.LBE253-.LBB253
+	.4byte	0x1c55
+	.uleb128 0x42
+	.4byte	0x2655
+	.4byte	.LLST92
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB254
+	.8byte	.LBE254-.LBB254
+	.4byte	0x1c74
+	.uleb128 0x42
+	.4byte	0x2667
+	.4byte	.LLST93
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB255
+	.8byte	.LBE255-.LBB255
+	.4byte	0x1c93
+	.uleb128 0x42
+	.4byte	0x2679
+	.4byte	.LLST94
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB256
+	.8byte	.LBE256-.LBB256
+	.4byte	0x1cb2
+	.uleb128 0x42
+	.4byte	0x268b
+	.4byte	.LLST95
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB257
+	.8byte	.LBE257-.LBB257
+	.4byte	0x1cd1
+	.uleb128 0x42
+	.4byte	0x269d
+	.4byte	.LLST96
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB258
+	.8byte	.LBE258-.LBB258
+	.4byte	0x1cf0
+	.uleb128 0x42
+	.4byte	0x26af
+	.4byte	.LLST97
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB259
+	.8byte	.LBE259-.LBB259
+	.4byte	0x1d0f
+	.uleb128 0x42
+	.4byte	0x26c1
+	.4byte	.LLST98
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB260
+	.8byte	.LBE260-.LBB260
+	.4byte	0x1d2e
+	.uleb128 0x42
+	.4byte	0x26d3
+	.4byte	.LLST99
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB261
+	.8byte	.LBE261-.LBB261
+	.4byte	0x1d4d
+	.uleb128 0x42
+	.4byte	0x26e5
+	.4byte	.LLST100
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB262
+	.8byte	.LBE262-.LBB262
+	.4byte	0x1d6c
+	.uleb128 0x42
+	.4byte	0x26f7
+	.4byte	.LLST101
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB263
+	.8byte	.LBE263-.LBB263
+	.4byte	0x1d8b
+	.uleb128 0x42
+	.4byte	0x2709
+	.4byte	.LLST102
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x450
+	.4byte	0x1d9e
+	.uleb128 0x42
+	.4byte	0x271b
+	.4byte	.LLST103
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x480
+	.4byte	0x1db1
+	.uleb128 0x42
+	.4byte	0x272d
+	.4byte	.LLST104
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x4b0
+	.4byte	0x1dc4
+	.uleb128 0x42
+	.4byte	0x273f
+	.4byte	.LLST105
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x4e0
+	.4byte	0x1dd7
+	.uleb128 0x42
+	.4byte	0x2a2f
+	.4byte	.LLST106
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB272
+	.8byte	.LBE272-.LBB272
+	.4byte	0x1df6
+	.uleb128 0x42
+	.4byte	0x2751
+	.4byte	.LLST107
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB273
+	.8byte	.LBE273-.LBB273
+	.4byte	0x1e15
+	.uleb128 0x42
+	.4byte	0x2763
+	.4byte	.LLST108
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB274
+	.8byte	.LBE274-.LBB274
+	.4byte	0x1e34
+	.uleb128 0x42
+	.4byte	0x2775
+	.4byte	.LLST109
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB275
+	.8byte	.LBE275-.LBB275
+	.4byte	0x1e53
+	.uleb128 0x42
+	.4byte	0x2787
+	.4byte	.LLST110
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB276
+	.8byte	.LBE276-.LBB276
+	.4byte	0x1e72
+	.uleb128 0x42
+	.4byte	0x2799
+	.4byte	.LLST111
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB277
+	.8byte	.LBE277-.LBB277
+	.4byte	0x1e91
+	.uleb128 0x42
+	.4byte	0x27ab
+	.4byte	.LLST112
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB278
+	.8byte	.LBE278-.LBB278
+	.4byte	0x1eb0
+	.uleb128 0x42
+	.4byte	0x27bd
+	.4byte	.LLST113
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB279
+	.8byte	.LBE279-.LBB279
+	.4byte	0x1ecf
+	.uleb128 0x42
+	.4byte	0x27cf
+	.4byte	.LLST114
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB280
+	.8byte	.LBE280-.LBB280
+	.4byte	0x1eee
+	.uleb128 0x42
+	.4byte	0x27e1
+	.4byte	.LLST115
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB281
+	.8byte	.LBE281-.LBB281
+	.4byte	0x1f0d
+	.uleb128 0x42
+	.4byte	0x27f3
+	.4byte	.LLST116
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB282
+	.8byte	.LBE282-.LBB282
+	.4byte	0x1f2c
+	.uleb128 0x42
+	.4byte	0x2805
+	.4byte	.LLST117
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB283
+	.8byte	.LBE283-.LBB283
+	.4byte	0x1f4b
+	.uleb128 0x42
+	.4byte	0x2817
+	.4byte	.LLST118
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB284
+	.8byte	.LBE284-.LBB284
+	.4byte	0x1f6a
+	.uleb128 0x42
+	.4byte	0x2829
+	.4byte	.LLST119
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB285
+	.8byte	.LBE285-.LBB285
+	.4byte	0x1f89
+	.uleb128 0x42
+	.4byte	0x283b
+	.4byte	.LLST120
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB286
+	.8byte	.LBE286-.LBB286
+	.4byte	0x1fa8
+	.uleb128 0x42
+	.4byte	0x284d
+	.4byte	.LLST121
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB287
+	.8byte	.LBE287-.LBB287
+	.4byte	0x1fc7
+	.uleb128 0x42
+	.4byte	0x285f
+	.4byte	.LLST122
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x510
+	.4byte	0x1fda
+	.uleb128 0x42
+	.4byte	0x2871
+	.4byte	.LLST123
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB290
+	.8byte	.LBE290-.LBB290
+	.4byte	0x1ff9
+	.uleb128 0x42
+	.4byte	0x2883
+	.4byte	.LLST124
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB291
+	.8byte	.LBE291-.LBB291
+	.4byte	0x2018
+	.uleb128 0x42
+	.4byte	0x2895
+	.4byte	.LLST125
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB292
+	.8byte	.LBE292-.LBB292
+	.4byte	0x2037
+	.uleb128 0x42
+	.4byte	0x28a7
+	.4byte	.LLST126
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB293
+	.8byte	.LBE293-.LBB293
+	.4byte	0x2056
+	.uleb128 0x42
+	.4byte	0x28b9
+	.4byte	.LLST127
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x540
+	.4byte	0x2069
+	.uleb128 0x42
+	.4byte	0x28cb
+	.4byte	.LLST128
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB296
+	.8byte	.LBE296-.LBB296
+	.4byte	0x2088
+	.uleb128 0x42
+	.4byte	0x28dd
+	.4byte	.LLST129
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB297
+	.8byte	.LBE297-.LBB297
+	.4byte	0x20a7
+	.uleb128 0x42
+	.4byte	0x28ef
+	.4byte	.LLST130
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x570
+	.4byte	0x20ba
+	.uleb128 0x42
+	.4byte	0x2901
+	.4byte	.LLST131
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x5a0
+	.4byte	0x20cd
+	.uleb128 0x42
+	.4byte	0x2913
+	.4byte	.LLST132
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x5d0
+	.4byte	0x20e0
+	.uleb128 0x42
+	.4byte	0x2925
+	.4byte	.LLST133
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB304
+	.8byte	.LBE304-.LBB304
+	.4byte	0x20ff
+	.uleb128 0x42
+	.4byte	0x2937
+	.4byte	.LLST134
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB305
+	.8byte	.LBE305-.LBB305
+	.4byte	0x211e
+	.uleb128 0x42
+	.4byte	0x2949
+	.4byte	.LLST135
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB306
+	.8byte	.LBE306-.LBB306
+	.4byte	0x213d
+	.uleb128 0x42
+	.4byte	0x295b
+	.4byte	.LLST136
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB307
+	.8byte	.LBE307-.LBB307
+	.4byte	0x215c
+	.uleb128 0x42
+	.4byte	0x296d
+	.4byte	.LLST137
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x600
+	.4byte	0x216f
+	.uleb128 0x42
+	.4byte	0x297f
+	.4byte	.LLST138
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB310
+	.8byte	.LBE310-.LBB310
+	.4byte	0x218e
+	.uleb128 0x42
+	.4byte	0x2991
+	.4byte	.LLST139
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB311
+	.8byte	.LBE311-.LBB311
+	.4byte	0x21ad
+	.uleb128 0x42
+	.4byte	0x29a3
+	.4byte	.LLST140
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB312
+	.8byte	.LBE312-.LBB312
+	.4byte	0x21cc
+	.uleb128 0x42
+	.4byte	0x29b5
+	.4byte	.LLST141
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB313
+	.8byte	.LBE313-.LBB313
+	.4byte	0x21eb
+	.uleb128 0x42
+	.4byte	0x29c7
+	.4byte	.LLST142
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x630
+	.4byte	0x21fe
+	.uleb128 0x42
+	.4byte	0x29d9
+	.4byte	.LLST143
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB316
+	.8byte	.LBE316-.LBB316
+	.4byte	0x221d
+	.uleb128 0x42
+	.4byte	0x29eb
+	.4byte	.LLST144
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB317
+	.8byte	.LBE317-.LBB317
+	.4byte	0x223c
+	.uleb128 0x42
+	.4byte	0x29fd
+	.4byte	.LLST145
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB318
+	.8byte	.LBE318-.LBB318
+	.4byte	0x225b
+	.uleb128 0x42
+	.4byte	0x2a0f
+	.4byte	.LLST146
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB319
+	.8byte	.LBE319-.LBB319
+	.4byte	0x227a
+	.uleb128 0x42
+	.4byte	0x2a21
+	.4byte	.LLST147
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL263
+	.4byte	0x42ab
+	.4byte	0x2292
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL266
+	.4byte	0x42b7
+	.4byte	0x22ba
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC4
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x5
+	.byte	0x85
+	.sleb128 0
+	.byte	0x9
+	.byte	0xfe
+	.byte	0x1a
+	.byte	0
+	.uleb128 0x47
+	.8byte	.LVL289
+	.4byte	0x22ce
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL310
+	.4byte	0x401e
+	.4byte	0x22f3
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL314
+	.4byte	0x42b7
+	.uleb128 0x47
+	.8byte	.LVL315
+	.4byte	0x2314
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL336
+	.4byte	0x401e
+	.4byte	0x233a
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL345
+	.4byte	0x401e
+	.4byte	0x2360
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL355
+	.4byte	0x401e
+	.4byte	0x2386
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL364
+	.4byte	0x401e
+	.4byte	0x23ac
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL373
+	.4byte	0x401e
+	.4byte	0x23d2
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL378
+	.4byte	0x3f49
+	.4byte	0x23f2
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3ce6
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL386
+	.4byte	0x401e
+	.4byte	0x2418
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL391
+	.4byte	0x3fb3
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d30
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x40
+	.4byte	0x2a52
+	.8byte	.LBB326
+	.4byte	.Ldebug_ranges0+0x660
+	.byte	0x1
+	.2byte	0x28c
+	.4byte	0x24d7
+	.uleb128 0x3a
+	.4byte	0x2a87
+	.4byte	.LLST148
+	.uleb128 0x3a
+	.4byte	0x2a7b
+	.4byte	.LLST149
+	.uleb128 0x3a
+	.4byte	0x2a6f
+	.4byte	.LLST150
+	.uleb128 0x3a
+	.4byte	0x2a63
+	.4byte	.LLST151
+	.uleb128 0x41
+	.4byte	.Ldebug_ranges0+0x660
+	.uleb128 0x42
+	.4byte	0x2a93
+	.4byte	.LLST152
+	.uleb128 0x4a
+	.4byte	0x2a9f
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -2
+	.uleb128 0x42
+	.4byte	0x2aab
+	.4byte	.LLST153
+	.uleb128 0x34
+	.8byte	.LVL274
+	.4byte	0x39d5
+	.4byte	0x24bb
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x3
+	.byte	0x8f
+	.sleb128 254
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL279
+	.4byte	0x2ab8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x8c
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL247
+	.4byte	0x4289
+	.4byte	0x24ef
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL250
+	.4byte	0x42c2
+	.4byte	0x250d
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x8
+	.byte	0x85
+	.sleb128 0
+	.byte	0x8
+	.byte	0x20
+	.byte	0x24
+	.byte	0x8
+	.byte	0x20
+	.byte	0x26
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL268
+	.4byte	0x39d5
+	.4byte	0x2537
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x88
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x85
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL271
+	.4byte	0x42b7
+	.4byte	0x2556
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC12
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL282
+	.4byte	0x42b7
+	.byte	0
+	.uleb128 0x3b
+	.4byte	.LASF432
+	.byte	0x1
+	.2byte	0x1d6
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x2a3d
+	.uleb128 0x3c
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x1d6
+	.4byte	0x25f
+	.uleb128 0x3c
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x1d7
+	.4byte	0x182b
+	.uleb128 0x4b
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x1d8
+	.4byte	0x54
+	.uleb128 0x4b
+	.4byte	.LASF387
+	.byte	0x1
+	.2byte	0x1d8
+	.4byte	0xa3
+	.uleb128 0x4c
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x1da
+	.4byte	0x54
+	.uleb128 0x4d
+	.4byte	.LASF426
+	.byte	0x1
+	.2byte	0x1db
+	.4byte	0x1981
+	.uleb128 0x4e
+	.4byte	.LASF433
+	.4byte	0x2a4d
+	.4byte	.LASF432
+	.uleb128 0x4f
+	.4byte	.LASF439
+	.byte	0x1
+	.2byte	0x263
+	.uleb128 0x50
+	.4byte	0x25e4
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1ef
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x25f6
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f0
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2608
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f1
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x261a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f2
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x262c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f3
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x263e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f4
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2650
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f5
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2662
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f6
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2674
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f7
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2686
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f8
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2698
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1f9
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26aa
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fa
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26bc
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fb
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26ce
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fc
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26e0
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fd
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x26f2
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1fe
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2704
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1ff
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2716
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x200
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2728
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x201
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x273a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x202
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x274c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x203
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x275e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20a
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2770
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20b
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2782
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20c
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2794
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20d
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27a6
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20e
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27b8
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x20f
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27ca
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x210
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27dc
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x211
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x27ee
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x212
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2800
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x213
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2812
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x214
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2824
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x215
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2836
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x216
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2848
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x217
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x285a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x218
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x286c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x219
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x287e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x21a
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2890
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x221
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28a2
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x222
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28b4
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x223
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28c6
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x224
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28d8
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x225
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28ea
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22c
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x28fc
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22d
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x290e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22e
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2920
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x22f
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2932
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x230
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2944
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x237
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2956
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x238
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2968
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x239
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x297a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x23a
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x298c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x23b
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x299e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x242
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29b0
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x243
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29c2
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x244
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29d4
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x245
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29e6
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x246
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x29f8
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x253
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2a0a
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x254
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2a1c
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x255
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x2a2e
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x256
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x4c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x264
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x2a4d
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x2a3d
+	.uleb128 0x3b
+	.4byte	.LASF434
+	.byte	0x1
+	.2byte	0x1c0
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x2ab8
+	.uleb128 0x3c
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x1c0
+	.4byte	0x25f
+	.uleb128 0x3c
+	.string	"otp"
+	.byte	0x1
+	.2byte	0x1c1
+	.4byte	0x182b
+	.uleb128 0x4b
+	.4byte	.LASF425
+	.byte	0x1
+	.2byte	0x1c2
+	.4byte	0x54
+	.uleb128 0x4b
+	.4byte	.LASF387
+	.byte	0x1
+	.2byte	0x1c2
+	.4byte	0x94
+	.uleb128 0x4d
+	.4byte	.LASF435
+	.byte	0x1
+	.2byte	0x1c4
+	.4byte	0xa3
+	.uleb128 0x4d
+	.4byte	.LASF430
+	.byte	0x1
+	.2byte	0x1c4
+	.4byte	0xa3
+	.uleb128 0x4c
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x1c5
+	.4byte	0x54
+	.byte	0
+	.uleb128 0x52
+	.4byte	.LASF436
+	.byte	0x1
+	.byte	0xed
+	.4byte	0x54
+	.8byte	.LFB269
+	.8byte	.LFE269-.LFB269
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x39c0
+	.uleb128 0x53
+	.string	"dev"
+	.byte	0x1
+	.byte	0xed
+	.4byte	0x25f
+	.4byte	.LLST30
+	.uleb128 0x53
+	.string	"otp"
+	.byte	0x1
+	.byte	0xee
+	.4byte	0x182b
+	.4byte	.LLST31
+	.uleb128 0x54
+	.4byte	.LASF425
+	.byte	0x1
+	.byte	0xef
+	.4byte	0x54
+	.4byte	.LLST32
+	.uleb128 0x54
+	.4byte	.LASF387
+	.byte	0x1
+	.byte	0xef
+	.4byte	0xa3
+	.4byte	.LLST33
+	.uleb128 0x55
+	.string	"ret"
+	.byte	0x1
+	.byte	0xf1
+	.4byte	0x54
+	.4byte	.LLST34
+	.uleb128 0x56
+	.4byte	.LASF426
+	.byte	0x1
+	.byte	0xf2
+	.4byte	0x1981
+	.4byte	.LLST35
+	.uleb128 0x57
+	.4byte	.LASF433
+	.4byte	0x39d0
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.7678
+	.uleb128 0x58
+	.4byte	.LASF439
+	.byte	0x1
+	.2byte	0x1b9
+	.8byte	.L39
+	.uleb128 0x45
+	.8byte	.LBB40
+	.8byte	.LBE40-.LBB40
+	.4byte	0x2b7c
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x106
+	.4byte	0xae
+	.4byte	.LLST36
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB41
+	.8byte	.LBE41-.LBB41
+	.4byte	0x2ba2
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x107
+	.4byte	0xae
+	.4byte	.LLST37
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB42
+	.8byte	.LBE42-.LBB42
+	.4byte	0x2bc8
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x108
+	.4byte	0xae
+	.4byte	.LLST38
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB43
+	.8byte	.LBE43-.LBB43
+	.4byte	0x2bee
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x109
+	.4byte	0xae
+	.4byte	.LLST39
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB44
+	.8byte	.LBE44-.LBB44
+	.4byte	0x2c14
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10a
+	.4byte	0xae
+	.4byte	.LLST40
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB45
+	.8byte	.LBE45-.LBB45
+	.4byte	0x2c3a
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10b
+	.4byte	0xae
+	.4byte	.LLST41
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB46
+	.8byte	.LBE46-.LBB46
+	.4byte	0x2c60
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10c
+	.4byte	0xae
+	.4byte	.LLST42
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB47
+	.8byte	.LBE47-.LBB47
+	.4byte	0x2c86
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10d
+	.4byte	0xae
+	.4byte	.LLST43
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0
+	.4byte	0x2ca0
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x10e
+	.4byte	0xae
+	.4byte	.LLST44
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB50
+	.8byte	.LBE50-.LBB50
+	.4byte	0x2cc5
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x115
+	.4byte	0xae
+	.sleb128 -65522
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB51
+	.8byte	.LBE51-.LBB51
+	.4byte	0x2ce8
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x116
+	.4byte	0xae
+	.byte	0xf0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB52
+	.8byte	.LBE52-.LBB52
+	.4byte	0x2d0b
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x117
+	.4byte	0xae
+	.byte	0x1
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB53
+	.8byte	.LBE53-.LBB53
+	.4byte	0x2d2e
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x118
+	.4byte	0xae
+	.byte	0x7a
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB54
+	.8byte	.LBE54-.LBB54
+	.4byte	0x2d51
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x119
+	.4byte	0xae
+	.byte	0x25
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB55
+	.8byte	.LBE55-.LBB55
+	.4byte	0x2d74
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11a
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB56
+	.8byte	.LBE56-.LBB56
+	.4byte	0x2d97
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11b
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB57
+	.8byte	.LBE57-.LBB57
+	.4byte	0x2dba
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11c
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB58
+	.8byte	.LBE58-.LBB58
+	.4byte	0x2ddd
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11d
+	.4byte	0xae
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB59
+	.8byte	.LBE59-.LBB59
+	.4byte	0x2e00
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11e
+	.4byte	0xae
+	.byte	0xb
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB60
+	.8byte	.LBE60-.LBB60
+	.4byte	0x2e23
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x11f
+	.4byte	0xae
+	.byte	0x8
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB61
+	.8byte	.LBE61-.LBB61
+	.4byte	0x2e46
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x120
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB62
+	.8byte	.LBE62-.LBB62
+	.4byte	0x2e69
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x121
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB63
+	.8byte	.LBE63-.LBB63
+	.4byte	0x2e8c
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x122
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x30
+	.4byte	0x2ea4
+	.uleb128 0x5b
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x123
+	.4byte	0xae
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x60
+	.4byte	0x2ebe
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0xae
+	.4byte	.LLST45
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x90
+	.4byte	0x2ed8
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x125
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB70
+	.8byte	.LBE70-.LBB70
+	.4byte	0x2efd
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12c
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB71
+	.8byte	.LBE71-.LBB71
+	.4byte	0x2f20
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12d
+	.4byte	0xae
+	.byte	0xfa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB72
+	.8byte	.LBE72-.LBB72
+	.4byte	0x2f43
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12e
+	.4byte	0xae
+	.byte	0x9
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0xc0
+	.4byte	0x2f5d
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x12f
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB75
+	.8byte	.LBE75-.LBB75
+	.4byte	0x2f83
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x136
+	.4byte	0xae
+	.sleb128 -16762368
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB76
+	.8byte	.LBE76-.LBB76
+	.4byte	0x2fa8
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x137
+	.4byte	0xae
+	.sleb128 -65522
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB77
+	.8byte	.LBE77-.LBB77
+	.4byte	0x2fcb
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x138
+	.4byte	0xae
+	.byte	0xf0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB78
+	.8byte	.LBE78-.LBB78
+	.4byte	0x2fee
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x139
+	.4byte	0xae
+	.byte	0x1
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB79
+	.8byte	.LBE79-.LBB79
+	.4byte	0x3011
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13a
+	.4byte	0xae
+	.byte	0x7a
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB80
+	.8byte	.LBE80-.LBB80
+	.4byte	0x3034
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13b
+	.4byte	0xae
+	.byte	0x15
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB81
+	.8byte	.LBE81-.LBB81
+	.4byte	0x3057
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13c
+	.4byte	0xae
+	.byte	0xdc
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB82
+	.8byte	.LBE82-.LBB82
+	.4byte	0x307a
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13d
+	.4byte	0xae
+	.byte	0x92
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB83
+	.8byte	.LBE83-.LBB83
+	.4byte	0x309d
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13e
+	.4byte	0xae
+	.byte	0x79
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB84
+	.8byte	.LBE84-.LBB84
+	.4byte	0x30c0
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x13f
+	.4byte	0xae
+	.byte	0x81
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB85
+	.8byte	.LBE85-.LBB85
+	.4byte	0x30e3
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x140
+	.4byte	0xae
+	.byte	0x7e
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB86
+	.8byte	.LBE86-.LBB86
+	.4byte	0x3106
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x141
+	.4byte	0xae
+	.byte	0x21
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB87
+	.8byte	.LBE87-.LBB87
+	.4byte	0x3129
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x142
+	.4byte	0xae
+	.byte	0x11
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB88
+	.8byte	.LBE88-.LBB88
+	.4byte	0x314c
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x143
+	.4byte	0xae
+	.byte	0x9d
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB89
+	.8byte	.LBE89-.LBB89
+	.4byte	0x316f
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x144
+	.4byte	0xae
+	.byte	0x2
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB90
+	.8byte	.LBE90-.LBB90
+	.4byte	0x3192
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x145
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB91
+	.8byte	.LBE91-.LBB91
+	.4byte	0x31b5
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x146
+	.4byte	0xae
+	.byte	0x40
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0xf0
+	.4byte	0x31cf
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x147
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB94
+	.8byte	.LBE94-.LBB94
+	.4byte	0x31f4
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x14e
+	.4byte	0xae
+	.sleb128 -65534
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB95
+	.8byte	.LBE95-.LBB95
+	.4byte	0x3217
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x14f
+	.4byte	0xae
+	.byte	0xfc
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB96
+	.8byte	.LBE96-.LBB96
+	.4byte	0x323a
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x150
+	.4byte	0xae
+	.byte	0xa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB97
+	.8byte	.LBE97-.LBB97
+	.4byte	0x325d
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x151
+	.4byte	0xae
+	.byte	0x70
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x120
+	.4byte	0x3277
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x152
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB100
+	.8byte	.LBE100-.LBB100
+	.4byte	0x329d
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x159
+	.4byte	0xae
+	.sleb128 -16776704
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB101
+	.8byte	.LBE101-.LBB101
+	.4byte	0x32c2
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15a
+	.4byte	0xae
+	.sleb128 -65534
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB102
+	.8byte	.LBE102-.LBB102
+	.4byte	0x32e5
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15b
+	.4byte	0xae
+	.byte	0xc0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x150
+	.4byte	0x32ff
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15c
+	.4byte	0xae
+	.4byte	.LLST46
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x180
+	.4byte	0x3319
+	.uleb128 0x33
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15d
+	.4byte	0xae
+	.4byte	.LLST47
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x1b0
+	.4byte	0x3333
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x15e
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB109
+	.8byte	.LBE109-.LBB109
+	.4byte	0x3358
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x165
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB110
+	.8byte	.LBE110-.LBB110
+	.4byte	0x337b
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x166
+	.4byte	0xae
+	.byte	0xe0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB111
+	.8byte	.LBE111-.LBB111
+	.4byte	0x339e
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x167
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x1e0
+	.4byte	0x33b8
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x168
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB114
+	.8byte	.LBE114-.LBB114
+	.4byte	0x33dd
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x16f
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB115
+	.8byte	.LBE115-.LBB115
+	.4byte	0x3403
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x170
+	.4byte	0xae
+	.sleb128 -16762368
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB116
+	.8byte	.LBE116-.LBB116
+	.4byte	0x3426
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x171
+	.4byte	0xae
+	.byte	0xff
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB117
+	.8byte	.LBE117-.LBB117
+	.4byte	0x3449
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0xae
+	.byte	0xa
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x210
+	.4byte	0x3463
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x173
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB120
+	.8byte	.LBE120-.LBB120
+	.4byte	0x3488
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17a
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB121
+	.8byte	.LBE121-.LBB121
+	.4byte	0x34ab
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17b
+	.4byte	0xae
+	.byte	0x1
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB122
+	.8byte	.LBE122-.LBB122
+	.4byte	0x34ce
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17c
+	.4byte	0xae
+	.byte	0xbf
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x240
+	.4byte	0x34e8
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x17d
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB125
+	.8byte	.LBE125-.LBB125
+	.4byte	0x350d
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18a
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB126
+	.8byte	.LBE126-.LBB126
+	.4byte	0x3530
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18b
+	.4byte	0xae
+	.byte	0x2
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB127
+	.8byte	.LBE127-.LBB127
+	.4byte	0x3553
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18c
+	.4byte	0xae
+	.byte	0xbf
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x270
+	.4byte	0x356d
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x18d
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB130
+	.8byte	.LBE130-.LBB130
+	.4byte	0x3592
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19a
+	.4byte	0xae
+	.sleb128 -65533
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB131
+	.8byte	.LBE131-.LBB131
+	.4byte	0x35b8
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19b
+	.4byte	0xae
+	.sleb128 -16776704
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB132
+	.8byte	.LBE132-.LBB132
+	.4byte	0x35dd
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19c
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB133
+	.8byte	.LBE133-.LBB133
+	.4byte	0x3600
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19d
+	.4byte	0xae
+	.byte	0x2
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB134
+	.8byte	.LBE134-.LBB134
+	.4byte	0x3623
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19e
+	.4byte	0xae
+	.byte	0x80
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x2a0
+	.4byte	0x363d
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x19f
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB137
+	.8byte	.LBE137-.LBB137
+	.4byte	0x3662
+	.uleb128 0x59
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a6
+	.4byte	0xae
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB138
+	.8byte	.LBE138-.LBB138
+	.4byte	0x3685
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a7
+	.4byte	0xae
+	.byte	0xa0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB139
+	.8byte	.LBE139-.LBB139
+	.4byte	0x36a8
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a8
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x36c2
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1a9
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB142
+	.8byte	.LBE142-.LBB142
+	.4byte	0x36e5
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1b0
+	.4byte	0xae
+	.byte	0xfa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB143
+	.8byte	.LBE143-.LBB143
+	.4byte	0x3708
+	.uleb128 0x5a
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1b1
+	.4byte	0xae
+	.byte	0x9
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x300
+	.4byte	0x3722
+	.uleb128 0x5c
+	.string	"__v"
+	.byte	0x1
+	.2byte	0x1b2
+	.4byte	0xae
+	.4byte	0x10001
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL67
+	.4byte	0x42ab
+	.4byte	0x373b
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL69
+	.4byte	0x42b7
+	.4byte	0x3763
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC4
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x5
+	.byte	0x88
+	.sleb128 0
+	.byte	0x9
+	.byte	0xfe
+	.byte	0x1a
+	.byte	0
+	.uleb128 0x47
+	.8byte	.LVL74
+	.4byte	0x3777
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL83
+	.4byte	0x401e
+	.4byte	0x379c
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL85
+	.4byte	0x42b7
+	.uleb128 0x47
+	.8byte	.LVL86
+	.4byte	0x37bd
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL104
+	.4byte	0x401e
+	.4byte	0x37e2
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL110
+	.4byte	0x401e
+	.4byte	0x3807
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL130
+	.4byte	0x401e
+	.4byte	0x382d
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL137
+	.4byte	0x401e
+	.4byte	0x3853
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL146
+	.4byte	0x401e
+	.4byte	0x3879
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL152
+	.4byte	0x401e
+	.4byte	0x389f
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL160
+	.4byte	0x401e
+	.4byte	0x38c5
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL167
+	.4byte	0x401e
+	.4byte	0x38eb
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL169
+	.4byte	0x3f49
+	.4byte	0x390b
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3ce6
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL176
+	.4byte	0x401e
+	.4byte	0x3931
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL178
+	.4byte	0x3fb3
+	.4byte	0x3951
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d30
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL187
+	.4byte	0x401e
+	.4byte	0x3977
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL193
+	.4byte	0x401e
+	.4byte	0x399d
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL198
+	.4byte	0x401e
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x2
+	.byte	0x89
+	.sleb128 0
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x8a
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x39d0
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x25
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x39c0
+	.uleb128 0x52
+	.4byte	.LASF437
+	.byte	0x1
+	.byte	0xae
+	.4byte	0x54
+	.8byte	.LFB268
+	.8byte	.LFE268-.LFB268
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3c0b
+	.uleb128 0x53
+	.string	"dev"
+	.byte	0x1
+	.byte	0xae
+	.4byte	0x25f
+	.4byte	.LLST55
+	.uleb128 0x54
+	.4byte	.LASF425
+	.byte	0x1
+	.byte	0xae
+	.4byte	0x54
+	.4byte	.LLST56
+	.uleb128 0x53
+	.string	"buf"
+	.byte	0x1
+	.byte	0xaf
+	.4byte	0x137
+	.4byte	.LLST57
+	.uleb128 0x54
+	.4byte	.LASF51
+	.byte	0x1
+	.byte	0xaf
+	.4byte	0x54
+	.4byte	.LLST58
+	.uleb128 0x55
+	.string	"otp"
+	.byte	0x1
+	.byte	0xb1
+	.4byte	0x182b
+	.4byte	.LLST59
+	.uleb128 0x56
+	.4byte	.LASF387
+	.byte	0x1
+	.byte	0xb2
+	.4byte	0x1981
+	.4byte	.LLST60
+	.uleb128 0x56
+	.4byte	.LASF438
+	.byte	0x1
+	.byte	0xb3
+	.4byte	0x11cc
+	.4byte	.LLST61
+	.uleb128 0x56
+	.4byte	.LASF430
+	.byte	0x1
+	.byte	0xb4
+	.4byte	0xa3
+	.4byte	.LLST62
+	.uleb128 0x55
+	.string	"ret"
+	.byte	0x1
+	.byte	0xb5
+	.4byte	0x54
+	.4byte	.LLST63
+	.uleb128 0x57
+	.4byte	.LASF433
+	.4byte	0x3c1b
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.7643
+	.uleb128 0x5d
+	.4byte	.LASF440
+	.byte	0x1
+	.byte	0xe3
+	.8byte	.L60
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x330
+	.4byte	0x3ab8
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xc0
+	.4byte	0xae
+	.4byte	.LLST64
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x360
+	.4byte	0x3ad1
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xd0
+	.4byte	0xae
+	.4byte	.LLST65
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x390
+	.4byte	0x3aea
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xd2
+	.4byte	0xae
+	.4byte	.LLST66
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB176
+	.8byte	.LBE176-.LBB176
+	.4byte	0x3b0f
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xda
+	.4byte	0xa3
+	.4byte	.LLST68
+	.byte	0
+	.uleb128 0x46
+	.4byte	.Ldebug_ranges0+0x3c0
+	.4byte	0x3b28
+	.uleb128 0x55
+	.string	"__v"
+	.byte	0x1
+	.byte	0xe4
+	.4byte	0xae
+	.4byte	.LLST67
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL213
+	.4byte	0x4289
+	.4byte	0x3b40
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL216
+	.4byte	0x42ab
+	.4byte	0x3b58
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x86
+	.sleb128 0
+	.byte	0
+	.uleb128 0x47
+	.8byte	.LVL219
+	.4byte	0x3b6c
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL220
+	.4byte	0x3c20
+	.4byte	0x3b84
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL222
+	.4byte	0x42ce
+	.4byte	0x3b9c
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x32
+	.byte	0
+	.uleb128 0x49
+	.8byte	.LVL224
+	.4byte	0x42b7
+	.uleb128 0x34
+	.8byte	.LVL233
+	.4byte	0x401e
+	.4byte	0x3bce
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x34
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x2
+	.byte	0x84
+	.sleb128 0
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL236
+	.4byte	0x42b7
+	.4byte	0x3bfa
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC11
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR3
+	.byte	0
+	.uleb128 0x5e
+	.8byte	.LVL237
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x2
+	.byte	0x83
+	.sleb128 0
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x3c1b
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x16
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x3c0b
+	.uleb128 0x5f
+	.4byte	.LASF441
+	.byte	0x1
+	.byte	0x98
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3cc1
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x98
+	.4byte	0x182b
+	.uleb128 0x61
+	.4byte	.LASF269
+	.byte	0x1
+	.byte	0x99
+	.4byte	0x144
+	.uleb128 0x62
+	.string	"ret"
+	.byte	0x1
+	.byte	0x9b
+	.4byte	0x54
+	.uleb128 0x4e
+	.4byte	.LASF433
+	.4byte	0x3cd1
+	.4byte	.LASF441
+	.uleb128 0x50
+	.4byte	0x3c6f
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x9d
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3c80
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x9e
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3c91
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x9f
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3ca2
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0xa1
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x3cb3
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0xa3
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0xa5
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.4byte	0xee
+	.4byte	0x3cd1
+	.uleb128 0x11
+	.4byte	0xda
+	.byte	0x1e
+	.byte	0
+	.uleb128 0x7
+	.4byte	0x3cc1
+	.uleb128 0x5f
+	.4byte	.LASF442
+	.byte	0x1
+	.byte	0x81
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3d20
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x81
+	.4byte	0x182b
+	.uleb128 0x63
+	.4byte	.LASF443
+	.byte	0x1
+	.byte	0x83
+	.4byte	0x54
+	.uleb128 0x63
+	.4byte	.LASF430
+	.byte	0x1
+	.byte	0x84
+	.4byte	0x54
+	.uleb128 0x62
+	.string	"ret"
+	.byte	0x1
+	.byte	0x85
+	.4byte	0x54
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x88
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.4byte	.LASF444
+	.byte	0x1
+	.byte	0x6a
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3d6a
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x6a
+	.4byte	0x182b
+	.uleb128 0x63
+	.4byte	.LASF443
+	.byte	0x1
+	.byte	0x6c
+	.4byte	0x54
+	.uleb128 0x63
+	.4byte	.LASF430
+	.byte	0x1
+	.byte	0x6d
+	.4byte	0x54
+	.uleb128 0x62
+	.string	"ret"
+	.byte	0x1
+	.byte	0x6e
+	.4byte	0x54
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x71
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.4byte	.LASF445
+	.byte	0x1
+	.byte	0x56
+	.4byte	0x54
+	.byte	0x1
+	.4byte	0x3dc7
+	.uleb128 0x60
+	.string	"otp"
+	.byte	0x1
+	.byte	0x56
+	.4byte	0x182b
+	.uleb128 0x61
+	.4byte	.LASF446
+	.byte	0x1
+	.byte	0x57
+	.4byte	0xae
+	.uleb128 0x63
+	.4byte	.LASF443
+	.byte	0x1
+	.byte	0x59
+	.4byte	0x54
+	.uleb128 0x4e
+	.4byte	.LASF433
+	.4byte	0x2a4d
+	.4byte	.LASF445
+	.uleb128 0x50
+	.4byte	0x3db9
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x5b
+	.4byte	0xae
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x62
+	.string	"__v"
+	.byte	0x1
+	.byte	0x65
+	.4byte	0xae
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF450
+	.byte	0x1
+	.byte	0x4e
+	.8byte	.LFB263
+	.8byte	.LFE263-.LFB263
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3e3c
+	.uleb128 0x65
+	.4byte	.LASF447
+	.byte	0x1
+	.byte	0x4e
+	.4byte	0x11d8
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x54
+	.4byte	.LASF448
+	.byte	0x1
+	.byte	0x4f
+	.4byte	0x11d8
+	.4byte	.LLST0
+	.uleb128 0x65
+	.4byte	.LASF449
+	.byte	0x1
+	.byte	0x50
+	.4byte	0x3b
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x65
+	.4byte	.LASF425
+	.byte	0x1
+	.byte	0x50
+	.4byte	0x54
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x66
+	.8byte	.LBB22
+	.8byte	.LBE22-.LBB22
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x52
+	.4byte	0xae
+	.4byte	0x80000
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF451
+	.byte	0x1
+	.byte	0x42
+	.8byte	.LFB262
+	.8byte	.LFE262-.LFB262
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3f2f
+	.uleb128 0x54
+	.4byte	.LASF447
+	.byte	0x1
+	.byte	0x42
+	.4byte	0x11d8
+	.4byte	.LLST16
+	.uleb128 0x54
+	.4byte	.LASF448
+	.byte	0x1
+	.byte	0x43
+	.4byte	0x11d8
+	.4byte	.LLST17
+	.uleb128 0x54
+	.4byte	.LASF449
+	.byte	0x1
+	.byte	0x44
+	.4byte	0x3b
+	.4byte	.LLST18
+	.uleb128 0x54
+	.4byte	.LASF425
+	.byte	0x1
+	.byte	0x44
+	.4byte	0x54
+	.4byte	.LLST19
+	.uleb128 0x45
+	.8byte	.LBB25
+	.8byte	.LBE25-.LBB25
+	.4byte	0x3eba
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x47
+	.4byte	0xae
+	.4byte	0x80008
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB26
+	.8byte	.LBE26-.LBB26
+	.4byte	0x3edf
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x48
+	.4byte	0xae
+	.4byte	0x100010
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB27
+	.8byte	.LBE27-.LBB27
+	.4byte	0x3f04
+	.uleb128 0x67
+	.string	"__v"
+	.byte	0x1
+	.byte	0x4a
+	.4byte	0xae
+	.4byte	0x100000
+	.byte	0
+	.uleb128 0x34
+	.8byte	.LVL32
+	.4byte	0x42ce
+	.4byte	0x3f1b
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x32
+	.byte	0
+	.uleb128 0x68
+	.8byte	.LVL34
+	.4byte	0x42ce
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.LASF463
+	.byte	0x1a
+	.2byte	0x36f
+	.byte	0x3
+	.4byte	0x3f49
+	.uleb128 0x3c
+	.string	"ptr"
+	.byte	0x1a
+	.2byte	0x36f
+	.4byte	0x137
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3cd6
+	.8byte	.LFB278
+	.8byte	.LFE278-.LFB278
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x3fb3
+	.uleb128 0x6b
+	.4byte	0x3ce6
+	.uleb128 0x42
+	.4byte	0x3cf1
+	.4byte	.LLST20
+	.uleb128 0x42
+	.4byte	0x3cfc
+	.4byte	.LLST21
+	.uleb128 0x44
+	.4byte	0x3d07
+	.uleb128 0x45
+	.8byte	.LBB28
+	.8byte	.LBE28-.LBB28
+	.4byte	0x3f9f
+	.uleb128 0x42
+	.4byte	0x3d13
+	.4byte	.LLST22
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL40
+	.4byte	0x42ce
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3d20
+	.8byte	.LFB279
+	.8byte	.LFE279-.LFB279
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x401e
+	.uleb128 0x6b
+	.4byte	0x3d30
+	.uleb128 0x42
+	.4byte	0x3d3b
+	.4byte	.LLST23
+	.uleb128 0x42
+	.4byte	0x3d46
+	.4byte	.LLST24
+	.uleb128 0x6c
+	.4byte	0x3d51
+	.sleb128 -1
+	.uleb128 0x45
+	.8byte	.LBB29
+	.8byte	.LBE29-.LBB29
+	.4byte	0x400a
+	.uleb128 0x42
+	.4byte	0x3d5d
+	.4byte	.LLST25
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL48
+	.4byte	0x42ce
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3d6a
+	.8byte	.LFB280
+	.8byte	.LFE280-.LFB280
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x410b
+	.uleb128 0x3a
+	.4byte	0x3d85
+	.4byte	.LLST26
+	.uleb128 0x6b
+	.4byte	0x3d7a
+	.uleb128 0x42
+	.4byte	0x3d90
+	.4byte	.LLST27
+	.uleb128 0x44
+	.4byte	0x3d9b
+	.uleb128 0x45
+	.8byte	.LBB36
+	.8byte	.LBE36-.LBB36
+	.4byte	0x4074
+	.uleb128 0x42
+	.4byte	0x3dad
+	.4byte	.LLST28
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB37
+	.8byte	.LBE37-.LBB37
+	.4byte	0x4093
+	.uleb128 0x42
+	.4byte	0x3dba
+	.4byte	.LLST29
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB38
+	.8byte	.LBE38-.LBB38
+	.4byte	0x40f7
+	.uleb128 0x6b
+	.4byte	0x3d85
+	.uleb128 0x6b
+	.4byte	0x3d7a
+	.uleb128 0x66
+	.8byte	.LBB39
+	.8byte	.LBE39-.LBB39
+	.uleb128 0x44
+	.4byte	0x3d90
+	.uleb128 0x44
+	.4byte	0x3d9b
+	.uleb128 0x36
+	.8byte	.LVL63
+	.4byte	0x42b7
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC3
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL60
+	.4byte	0x42ce
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x1
+	.byte	0x31
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.4byte	0x3c20
+	.8byte	.LFB267
+	.8byte	.LFE267-.LFB267
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x4289
+	.uleb128 0x3a
+	.4byte	0x3c30
+	.4byte	.LLST48
+	.uleb128 0x3a
+	.4byte	0x3c3b
+	.4byte	.LLST49
+	.uleb128 0x42
+	.4byte	0x3c46
+	.4byte	.LLST50
+	.uleb128 0x44
+	.4byte	0x3c51
+	.uleb128 0x45
+	.8byte	.LBB160
+	.8byte	.LBE160-.LBB160
+	.4byte	0x4165
+	.uleb128 0x6c
+	.4byte	0x3c63
+	.sleb128 -16776704
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB161
+	.8byte	.LBE161-.LBB161
+	.4byte	0x4183
+	.uleb128 0x6c
+	.4byte	0x3c74
+	.sleb128 -65535
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB162
+	.8byte	.LBE162-.LBB162
+	.4byte	0x419f
+	.uleb128 0x6d
+	.4byte	0x3c85
+	.byte	0xfa
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB163
+	.8byte	.LBE163-.LBB163
+	.4byte	0x41be
+	.uleb128 0x42
+	.4byte	0x3c96
+	.4byte	.LLST51
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB164
+	.8byte	.LBE164-.LBB164
+	.4byte	0x41dd
+	.uleb128 0x42
+	.4byte	0x3cb4
+	.4byte	.LLST52
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB165
+	.8byte	.LBE165-.LBB165
+	.4byte	0x4249
+	.uleb128 0x3a
+	.4byte	0x3c30
+	.4byte	.LLST53
+	.uleb128 0x3a
+	.4byte	0x3c3b
+	.4byte	.LLST54
+	.uleb128 0x66
+	.8byte	.LBB166
+	.8byte	.LBE166-.LBB166
+	.uleb128 0x44
+	.4byte	0x4138
+	.uleb128 0x44
+	.4byte	0x4141
+	.uleb128 0x36
+	.8byte	.LVL209
+	.4byte	0x42b7
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LC8
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	.LANCHOR2
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.8byte	.LBB167
+	.8byte	.LBE167-.LBB167
+	.4byte	0x4265
+	.uleb128 0x6d
+	.4byte	0x3ca7
+	.byte	0x9
+	.byte	0
+	.uleb128 0x36
+	.8byte	.LVL205
+	.4byte	0x401e
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x35
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x1
+	.byte	0x32
+	.uleb128 0x48
+	.4byte	0x3d7a
+	.uleb128 0x3
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0
+	.byte	0
+	.uleb128 0x6e
+	.4byte	.LASF452
+	.4byte	.LASF452
+	.byte	0x8
+	.2byte	0x115
+	.uleb128 0x6f
+	.4byte	.LASF453
+	.4byte	.LASF453
+	.byte	0x20
+	.byte	0x85
+	.uleb128 0x6f
+	.4byte	.LASF454
+	.4byte	.LASF454
+	.byte	0x20
+	.byte	0x38
+	.uleb128 0x6e
+	.4byte	.LASF455
+	.4byte	.LASF455
+	.byte	0x8
+	.2byte	0x16e
+	.uleb128 0x6f
+	.4byte	.LASF456
+	.4byte	.LASF456
+	.byte	0x21
+	.byte	0x13
+	.uleb128 0x6e
+	.4byte	.LASF457
+	.4byte	.LASF457
+	.byte	0x1a
+	.2byte	0x393
+	.uleb128 0x6f
+	.4byte	.LASF458
+	.4byte	.LASF458
+	.byte	0x22
+	.byte	0xb
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x10
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0x26
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x9
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.uleb128 0x1
+	.byte	0x1
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0x21
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0xc
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0xe
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0xf
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x10
+	.uleb128 0x26
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x12
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x13
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x14
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x15
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x16
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x17
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x18
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1a
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1b
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x1c
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1d
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x1e
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x1f
+	.uleb128 0x16
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x20
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x21
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x22
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x23
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x24
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x25
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x26
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x27
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x28
+	.uleb128 0x35
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x29
+	.uleb128 0x4
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x2b
+	.uleb128 0x17
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2c
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2d
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2e
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2f
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x30
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x33
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x34
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.uleb128 0x410a
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x18
+	.uleb128 0x2111
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x36
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x37
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x3a
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3c
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3d
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3e
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x40
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x41
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x42
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x43
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x44
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x45
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x47
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x48
+	.uleb128 0x410a
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2111
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4d
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4e
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x34
+	.uleb128 0x19
+	.uleb128 0x1c
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x4f
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0xb
+	.byte	0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x52
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x55
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x56
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x57
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x34
+	.uleb128 0x19
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x5b
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0x6
+	.byte	0
+	.byte	0
+	.uleb128 0x5d
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x60
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x62
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x63
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x65
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x66
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.byte	0
+	.byte	0
+	.uleb128 0x67
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0x6
+	.byte	0
+	.byte	0
+	.uleb128 0x68
+	.uleb128 0x4109
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x2115
+	.uleb128 0x19
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6b
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xd
+	.byte	0
+	.byte	0
+	.uleb128 0x6d
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x1c
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x6e
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x6f
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0xe
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST14:
+	.8byte	.LVL19
+	.8byte	.LVL20-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL20-1
+	.8byte	.LVL27
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL27
+	.8byte	.LFE277
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST15:
+	.8byte	.LVL21
+	.8byte	.LVL22
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL22
+	.8byte	.LVL27
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST1:
+	.8byte	.LVL2
+	.8byte	.LVL3
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL3
+	.8byte	.LFE276
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST2:
+	.8byte	.LVL2
+	.8byte	.LVL5
+	.2byte	0x3
+	.byte	0x9
+	.byte	0xea
+	.byte	0x9f
+	.8byte	.LVL6
+	.8byte	.LFE276
+	.2byte	0x3
+	.byte	0x9
+	.byte	0xea
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST3:
+	.8byte	.LVL4
+	.8byte	.LVL5
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST4:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL8-1
+	.8byte	.LVL11
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL11
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST5:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL8-1
+	.8byte	.LVL11
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL11
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL8-1
+	.8byte	.LVL10
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL10
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST7:
+	.8byte	.LVL7
+	.8byte	.LVL8-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL8-1
+	.8byte	.LVL10
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL10
+	.8byte	.LVL12-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL12-1
+	.8byte	.LFE274
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST8:
+	.8byte	.LVL8
+	.8byte	.LVL9
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST9:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL14-1
+	.8byte	.LVL17
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL17
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST10:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL14-1
+	.8byte	.LVL17
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL17
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST11:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL14-1
+	.8byte	.LVL16
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL16
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST12:
+	.8byte	.LVL13
+	.8byte	.LVL14-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL14-1
+	.8byte	.LVL16
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL16
+	.8byte	.LVL18-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL18-1
+	.8byte	.LFE273
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST13:
+	.8byte	.LVL14
+	.8byte	.LVL15
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST69:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL247-1
+	.8byte	.LVL254
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL254
+	.8byte	.LVL257
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST70:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL247-1
+	.8byte	.LVL253
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL253
+	.8byte	.LVL257
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST71:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL247-1
+	.8byte	.LVL256
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	.LVL256
+	.8byte	.LVL257
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 80
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	0
+	.8byte	0
+.LLST72:
+	.8byte	.LVL246
+	.8byte	.LVL247-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL247-1
+	.8byte	.LVL252
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL252
+	.8byte	.LVL257
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LVL261
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL261
+	.8byte	.LVL267
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL267
+	.8byte	.LVL281
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL281
+	.8byte	.LVL283
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL283
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL287
+	.8byte	.LVL396
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	.LVL396
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST73:
+	.8byte	.LVL248
+	.8byte	.LVL249
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL249
+	.8byte	.LVL255
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST74:
+	.8byte	.LVL248
+	.8byte	.LVL256
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	.LVL256
+	.8byte	.LVL257
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 80
+	.8byte	.LVL257
+	.8byte	.LFE272
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 224
+	.8byte	0
+	.8byte	0
+.LLST76:
+	.8byte	.LVL250
+	.8byte	.LVL251
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL257
+	.8byte	.LVL258
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL258
+	.8byte	.LVL260
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL267
+	.8byte	.LVL272
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL285
+	.8byte	.LVL286
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST77:
+	.8byte	.LVL261
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL269
+	.8byte	.LVL270
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL272
+	.8byte	.LVL278
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL286
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL288
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL394
+	.8byte	.LVL395
+	.2byte	0x3
+	.byte	0x87
+	.sleb128 1
+	.byte	0x9f
+	.8byte	.LVL396
+	.8byte	.LFE272
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST78:
+	.8byte	.LVL250
+	.8byte	.LVL251
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL257
+	.8byte	.LVL268
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL268
+	.8byte	.LVL269
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL272
+	.8byte	.LVL280
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL283
+	.8byte	.LVL315
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST79:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL288
+	.8byte	.LVL313
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL317
+	.8byte	.LVL352
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST80:
+	.8byte	.LVL262
+	.8byte	.LVL264
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL264
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST81:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST82:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST83:
+	.8byte	.LVL262
+	.8byte	.LVL267
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL288
+	.8byte	.LVL311
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL311
+	.8byte	.LVL312
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL312
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL317
+	.8byte	.LVL318
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL318
+	.8byte	.LVL337
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL337
+	.8byte	.LVL338
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL338
+	.8byte	.LVL339
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL339
+	.8byte	.LVL340
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL340
+	.8byte	.LVL346
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL346
+	.8byte	.LVL347
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL347
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL348
+	.8byte	.LVL349
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL349
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL356
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL357
+	.8byte	.LVL358
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL358
+	.8byte	.LVL359
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL359
+	.8byte	.LVL365
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL365
+	.8byte	.LVL366
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL366
+	.8byte	.LVL367
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL367
+	.8byte	.LVL368
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL368
+	.8byte	.LVL374
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL374
+	.8byte	.LVL375
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL375
+	.8byte	.LVL376
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL376
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL377
+	.8byte	.LVL379
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL379
+	.8byte	.LVL380
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL380
+	.8byte	.LVL381
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL381
+	.8byte	.LVL382
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL382
+	.8byte	.LVL387
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL387
+	.8byte	.LVL388
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL388
+	.8byte	.LVL389
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL389
+	.8byte	.LVL390
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL392
+	.8byte	.LVL393
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL393
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST84:
+	.8byte	.LVL264
+	.8byte	.LVL265
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL265
+	.8byte	.LVL267
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 232
+	.8byte	.LVL288
+	.8byte	.LVL315
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 232
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8f
+	.sleb128 232
+	.8byte	0
+	.8byte	0
+.LLST85:
+	.8byte	.LVL289
+	.8byte	.LVL316
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST86:
+	.8byte	.LVL290
+	.8byte	.LVL316
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST87:
+	.8byte	.LVL291
+	.8byte	.LVL316
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST88:
+	.8byte	.LVL292
+	.8byte	.LVL316
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST89:
+	.8byte	.LVL293
+	.8byte	.LVL316
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65522
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65522
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST90:
+	.8byte	.LVL294
+	.8byte	.LVL316
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xf0
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xf0
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST91:
+	.8byte	.LVL295
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST92:
+	.8byte	.LVL296
+	.8byte	.LVL316
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7a
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST93:
+	.8byte	.LVL297
+	.8byte	.LVL316
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x25
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x25
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST94:
+	.8byte	.LVL298
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST95:
+	.8byte	.LVL299
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST96:
+	.8byte	.LVL300
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST97:
+	.8byte	.LVL301
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x4f
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x4f
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST98:
+	.8byte	.LVL302
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x3b
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x3b
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST99:
+	.8byte	.LVL303
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x38
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x38
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST100:
+	.8byte	.LVL304
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST101:
+	.8byte	.LVL305
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST102:
+	.8byte	.LVL306
+	.8byte	.LVL316
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST103:
+	.8byte	.LVL307
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST104:
+	.8byte	.LVL308
+	.8byte	.LVL313
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL317
+	.8byte	.LVL332
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST105:
+	.8byte	.LVL309
+	.8byte	.LVL316
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST106:
+	.8byte	.LVL314
+	.8byte	.LVL316
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65533
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST107:
+	.8byte	.LVL317
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16762368
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST108:
+	.8byte	.LVL319
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xf0
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST109:
+	.8byte	.LVL320
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST110:
+	.8byte	.LVL321
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST111:
+	.8byte	.LVL322
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x45
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST112:
+	.8byte	.LVL323
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xdc
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST113:
+	.8byte	.LVL324
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x92
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST114:
+	.8byte	.LVL325
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x79
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST115:
+	.8byte	.LVL326
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x81
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST116:
+	.8byte	.LVL327
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x7e
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST117:
+	.8byte	.LVL328
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x21
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST118:
+	.8byte	.LVL329
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x41
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST119:
+	.8byte	.LVL330
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0x9d
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST120:
+	.8byte	.LVL331
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x32
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST121:
+	.8byte	.LVL333
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST122:
+	.8byte	.LVL334
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST123:
+	.8byte	.LVL335
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST124:
+	.8byte	.LVL339
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST125:
+	.8byte	.LVL341
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65535
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST126:
+	.8byte	.LVL342
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xfb
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST127:
+	.8byte	.LVL343
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST128:
+	.8byte	.LVL344
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST129:
+	.8byte	.LVL348
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST130:
+	.8byte	.LVL350
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xc0
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST131:
+	.8byte	.LVL351
+	.8byte	.LVL354
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST132:
+	.8byte	.LVL352
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST133:
+	.8byte	.LVL353
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST134:
+	.8byte	.LVL358
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16762368
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST135:
+	.8byte	.LVL360
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65535
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST136:
+	.8byte	.LVL361
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xff
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST137:
+	.8byte	.LVL362
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x3a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST138:
+	.8byte	.LVL363
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST139:
+	.8byte	.LVL367
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST140:
+	.8byte	.LVL369
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x31
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST141:
+	.8byte	.LVL370
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xbf
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST142:
+	.8byte	.LVL371
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST143:
+	.8byte	.LVL372
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST144:
+	.8byte	.LVL381
+	.8byte	.LVL394
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65535
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST145:
+	.8byte	.LVL383
+	.8byte	.LVL394
+	.2byte	0x2
+	.byte	0x32
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST146:
+	.8byte	.LVL384
+	.8byte	.LVL394
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xbf
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST147:
+	.8byte	.LVL385
+	.8byte	.LVL394
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST148:
+	.8byte	.LVL273
+	.8byte	.LVL276
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL283
+	.8byte	.LVL284
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST149:
+	.8byte	.LVL273
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST150:
+	.8byte	.LVL273
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST151:
+	.8byte	.LVL273
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST152:
+	.8byte	.LVL275
+	.8byte	.LVL276
+	.2byte	0xd
+	.byte	0x8f
+	.sleb128 254
+	.byte	0x94
+	.byte	0x2
+	.byte	0x20
+	.byte	0x87
+	.sleb128 0
+	.byte	0x8
+	.byte	0xff
+	.byte	0x1a
+	.byte	0x1a
+	.byte	0x9f
+	.8byte	.LVL283
+	.8byte	.LVL284
+	.2byte	0xf
+	.byte	0x8f
+	.sleb128 254
+	.byte	0x94
+	.byte	0x2
+	.byte	0x20
+	.byte	0x87
+	.sleb128 0
+	.byte	0x8
+	.byte	0xff
+	.byte	0x1a
+	.byte	0x38
+	.byte	0x24
+	.byte	0x1a
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST153:
+	.8byte	.LVL274
+	.8byte	.LVL277
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST30:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL67-1
+	.8byte	.LFE269
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST31:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL67-1
+	.8byte	.LVL72
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL72
+	.8byte	.LVL73
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL73
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST32:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL67-1
+	.8byte	.LVL67
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL67
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL71
+	.8byte	.LVL73
+	.2byte	0x6
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x31
+	.byte	0x26
+	.byte	0x9f
+	.8byte	.LVL73
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST33:
+	.8byte	.LVL66
+	.8byte	.LVL67-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL67-1
+	.8byte	.LVL70
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL70
+	.8byte	.LFE269
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST34:
+	.8byte	.LVL66
+	.8byte	.LVL70
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL73
+	.8byte	.LVL83
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL83
+	.8byte	.LVL84
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL87
+	.8byte	.LVL88
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL104
+	.8byte	.LVL106
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL110
+	.8byte	.LVL112
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL130
+	.8byte	.LVL132
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL137
+	.8byte	.LVL139
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL146
+	.8byte	.LVL148
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL152
+	.8byte	.LVL154
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL160
+	.8byte	.LVL162
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL167
+	.8byte	.LVL168
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL169
+	.8byte	.LVL170
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL171
+	.8byte	.LVL172
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL176
+	.8byte	.LVL177
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL178
+	.8byte	.LVL179
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL180
+	.8byte	.LVL181
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL187
+	.8byte	.LVL189
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL193
+	.8byte	.LVL195
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL198
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST35:
+	.8byte	.LVL67
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL68
+	.8byte	.LVL69
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL73
+	.8byte	.LFE269
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST36:
+	.8byte	.LVL74
+	.8byte	.LVL86
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST37:
+	.8byte	.LVL75
+	.8byte	.LVL86
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x40004
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL76
+	.8byte	.LVL86
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST39:
+	.8byte	.LVL77
+	.8byte	.LVL86
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x6
+	.byte	0x11
+	.sleb128 -16776704
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST40:
+	.8byte	.LVL78
+	.8byte	.LVL86
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x5
+	.byte	0x11
+	.sleb128 -65534
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST41:
+	.8byte	.LVL79
+	.8byte	.LVL86
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xfc
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x3
+	.byte	0x8
+	.byte	0xfc
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL80
+	.8byte	.LVL86
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL81
+	.8byte	.LVL86
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST44:
+	.8byte	.LVL82
+	.8byte	.LVL86
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL87
+	.8byte	.LFE269
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST45:
+	.8byte	.LVL102
+	.8byte	.LVL104-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL104-1
+	.8byte	.LVL165
+	.2byte	0x6
+	.byte	0x88
+	.sleb128 0
+	.byte	0x9
+	.byte	0xf7
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST46:
+	.8byte	.LVL142
+	.8byte	.LVL145
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST47:
+	.8byte	.LVL143
+	.8byte	.LVL159
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL159
+	.8byte	.LFE269
+	.2byte	0xa
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0xa
+	.2byte	0xffff
+	.byte	0x1a
+	.byte	0x38
+	.byte	0x25
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST55:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL213-1
+	.8byte	.LVL221
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL221
+	.8byte	.LVL227
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL228
+	.8byte	.LFE268
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST56:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL213-1
+	.8byte	.LVL217
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL217
+	.8byte	.LVL225
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL227
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST57:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL213-1
+	.8byte	.LVL222
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL222
+	.8byte	.LVL227
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL228
+	.8byte	.LFE268
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST58:
+	.8byte	.LVL212
+	.8byte	.LVL213-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL213-1
+	.8byte	.LVL222
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL222
+	.8byte	.LVL226
+	.2byte	0x3
+	.byte	0x87
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL228
+	.8byte	.LVL244
+	.2byte	0x3
+	.byte	0x87
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL244
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST59:
+	.8byte	.LVL214
+	.8byte	.LVL215
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL215
+	.8byte	.LVL225
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL227
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST60:
+	.8byte	.LVL217
+	.8byte	.LVL218
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL218
+	.8byte	.LVL226
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL227
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST61:
+	.8byte	.LVL217
+	.8byte	.LVL224
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL227
+	.8byte	.LVL236
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL238
+	.8byte	.LVL241
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL241
+	.8byte	.LVL242
+	.2byte	0x3
+	.byte	0x85
+	.sleb128 1
+	.byte	0x9f
+	.8byte	.LVL242
+	.8byte	.LVL245
+	.2byte	0x3
+	.byte	0x85
+	.sleb128 2
+	.byte	0x9f
+	.8byte	.LVL245
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST62:
+	.8byte	.LVL241
+	.8byte	.LVL243
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST63:
+	.8byte	.LVL217
+	.8byte	.LVL222
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL222
+	.8byte	.LVL223
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL228
+	.8byte	.LVL234
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL234
+	.8byte	.LVL235
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL235
+	.8byte	.LVL238
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL238
+	.8byte	.LVL239
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL239
+	.8byte	.LFE268
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST64:
+	.8byte	.LVL220
+	.8byte	.LVL227
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL228
+	.8byte	.LFE268
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST65:
+	.8byte	.LVL229
+	.8byte	.LVL231
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL231
+	.8byte	.LVL232
+	.2byte	0x6
+	.byte	0x84
+	.sleb128 0
+	.byte	0x6
+	.byte	0x23
+	.uleb128 0x104
+	.8byte	.LVL232
+	.8byte	.LVL236
+	.2byte	0x8
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x21
+	.byte	0x9f
+	.8byte	.LVL238
+	.8byte	.LFE268
+	.2byte	0x8
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x11
+	.sleb128 -65536
+	.byte	0x21
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST66:
+	.8byte	.LVL230
+	.8byte	.LVL236
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	.LVL238
+	.8byte	.LFE268
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST68:
+	.8byte	.LVL240
+	.8byte	.LVL243
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST67:
+	.8byte	.LVL236
+	.8byte	.LVL238
+	.2byte	0x4
+	.byte	0x40
+	.byte	0x3c
+	.byte	0x24
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST0:
+	.8byte	.LVL0
+	.8byte	.LVL1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1
+	.8byte	.LFE263
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST16:
+	.8byte	.LVL28
+	.8byte	.LVL31
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL31
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST17:
+	.8byte	.LVL28
+	.8byte	.LVL29
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL29
+	.8byte	.LVL33
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL33
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST18:
+	.8byte	.LVL28
+	.8byte	.LVL32-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL32-1
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x52
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL28
+	.8byte	.LVL32-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL32-1
+	.8byte	.LFE262
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x53
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST20:
+	.8byte	.LVL35
+	.8byte	.LVL38
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL38
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL39
+	.8byte	.LVL41
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL41
+	.8byte	.LVL42
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST21:
+	.8byte	.LVL37
+	.8byte	.LVL40-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL41
+	.8byte	.LFE278
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST22:
+	.8byte	.LVL36
+	.8byte	.LVL40-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL41
+	.8byte	.LFE278
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST23:
+	.8byte	.LVL43
+	.8byte	.LVL46
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL46
+	.8byte	.LVL48
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL48
+	.8byte	.LVL50
+	.2byte	0x3
+	.byte	0x83
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL51
+	.8byte	.LFE279
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST24:
+	.8byte	.LVL45
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL49
+	.8byte	.LVL50
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL51
+	.8byte	.LVL52
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL44
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL49
+	.8byte	.LVL50
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL51
+	.8byte	.LVL52
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST26:
+	.8byte	.LVL53
+	.8byte	.LVL54
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL54
+	.8byte	.LVL56
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL56
+	.8byte	.LVL58
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	.LVL58
+	.8byte	.LVL64
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL64
+	.8byte	.LFE280
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL54
+	.8byte	.LVL60
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL60
+	.8byte	.LVL61
+	.2byte	0x3
+	.byte	0x84
+	.sleb128 -1
+	.byte	0x9f
+	.8byte	.LVL61
+	.8byte	.LVL65
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST28:
+	.8byte	.LVL55
+	.8byte	.LVL57
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL58
+	.8byte	.LVL59
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST29:
+	.8byte	.LVL56
+	.8byte	.LVL58
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST48:
+	.8byte	.LVL199
+	.8byte	.LVL205-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL205-1
+	.8byte	.LVL211
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	.LVL211
+	.8byte	.LFE267
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST49:
+	.8byte	.LVL199
+	.8byte	.LVL203
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL203
+	.8byte	.LFE267
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST50:
+	.8byte	.LVL199
+	.8byte	.LVL206
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	.LVL206
+	.8byte	.LVL208
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL208
+	.8byte	.LVL210
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL210
+	.8byte	.LVL211
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL211
+	.8byte	.LFE267
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST51:
+	.8byte	.LVL202
+	.8byte	.LVL204
+	.2byte	0x2
+	.byte	0x30
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST52:
+	.8byte	.LVL204
+	.8byte	.LVL211
+	.2byte	0x6
+	.byte	0xc
+	.4byte	0x10001
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST53:
+	.8byte	.LVL207
+	.8byte	.LVL209
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x50
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+.LLST54:
+	.8byte	.LVL207
+	.8byte	.LVL209
+	.2byte	0x4
+	.byte	0xf3
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0x9f
+	.8byte	0
+	.8byte	0
+	.section	.debug_aranges,"",@progbits
+	.4byte	0xec
+	.2byte	0x2
+	.4byte	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.2byte	0
+	.2byte	0
+	.8byte	.LFB263
+	.8byte	.LFE263-.LFB263
+	.8byte	.LFB276
+	.8byte	.LFE276-.LFB276
+	.8byte	.LFB274
+	.8byte	.LFE274-.LFB274
+	.8byte	.LFB273
+	.8byte	.LFE273-.LFB273
+	.8byte	.LFB277
+	.8byte	.LFE277-.LFB277
+	.8byte	.LFB262
+	.8byte	.LFE262-.LFB262
+	.8byte	.LFB278
+	.8byte	.LFE278-.LFB278
+	.8byte	.LFB279
+	.8byte	.LFE279-.LFB279
+	.8byte	.LFB280
+	.8byte	.LFE280-.LFB280
+	.8byte	.LFB269
+	.8byte	.LFE269-.LFB269
+	.8byte	.LFB267
+	.8byte	.LFE267-.LFB267
+	.8byte	.LFB268
+	.8byte	.LFE268-.LFB268
+	.8byte	.LFB272
+	.8byte	.LFE272-.LFB272
+	.8byte	0
+	.8byte	0
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.8byte	.LBB48
+	.8byte	.LBE48
+	.8byte	.LBB49
+	.8byte	.LBE49
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB64
+	.8byte	.LBE64
+	.8byte	.LBB66
+	.8byte	.LBE66
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB65
+	.8byte	.LBE65
+	.8byte	.LBB67
+	.8byte	.LBE67
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB68
+	.8byte	.LBE68
+	.8byte	.LBB69
+	.8byte	.LBE69
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB73
+	.8byte	.LBE73
+	.8byte	.LBB74
+	.8byte	.LBE74
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB92
+	.8byte	.LBE92
+	.8byte	.LBB93
+	.8byte	.LBE93
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB98
+	.8byte	.LBE98
+	.8byte	.LBB99
+	.8byte	.LBE99
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB103
+	.8byte	.LBE103
+	.8byte	.LBB105
+	.8byte	.LBE105
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB104
+	.8byte	.LBE104
+	.8byte	.LBB106
+	.8byte	.LBE106
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB107
+	.8byte	.LBE107
+	.8byte	.LBB108
+	.8byte	.LBE108
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB112
+	.8byte	.LBE112
+	.8byte	.LBB113
+	.8byte	.LBE113
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB118
+	.8byte	.LBE118
+	.8byte	.LBB119
+	.8byte	.LBE119
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB123
+	.8byte	.LBE123
+	.8byte	.LBB124
+	.8byte	.LBE124
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB128
+	.8byte	.LBE128
+	.8byte	.LBB129
+	.8byte	.LBE129
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB135
+	.8byte	.LBE135
+	.8byte	.LBB136
+	.8byte	.LBE136
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB140
+	.8byte	.LBE140
+	.8byte	.LBB141
+	.8byte	.LBE141
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB144
+	.8byte	.LBE144
+	.8byte	.LBB145
+	.8byte	.LBE145
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB168
+	.8byte	.LBE168
+	.8byte	.LBB169
+	.8byte	.LBE169
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB170
+	.8byte	.LBE170
+	.8byte	.LBB171
+	.8byte	.LBE171
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB172
+	.8byte	.LBE172
+	.8byte	.LBB173
+	.8byte	.LBE173
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB174
+	.8byte	.LBE174
+	.8byte	.LBB175
+	.8byte	.LBE175
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB244
+	.8byte	.LBE244
+	.8byte	.LBB324
+	.8byte	.LBE324
+	.8byte	.LBB325
+	.8byte	.LBE325
+	.8byte	.LBB335
+	.8byte	.LBE335
+	.8byte	.LBB336
+	.8byte	.LBE336
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB264
+	.8byte	.LBE264
+	.8byte	.LBB266
+	.8byte	.LBE266
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB265
+	.8byte	.LBE265
+	.8byte	.LBB267
+	.8byte	.LBE267
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB268
+	.8byte	.LBE268
+	.8byte	.LBB269
+	.8byte	.LBE269
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB270
+	.8byte	.LBE270
+	.8byte	.LBB271
+	.8byte	.LBE271
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB288
+	.8byte	.LBE288
+	.8byte	.LBB289
+	.8byte	.LBE289
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB294
+	.8byte	.LBE294
+	.8byte	.LBB295
+	.8byte	.LBE295
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB298
+	.8byte	.LBE298
+	.8byte	.LBB300
+	.8byte	.LBE300
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB299
+	.8byte	.LBE299
+	.8byte	.LBB301
+	.8byte	.LBE301
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB302
+	.8byte	.LBE302
+	.8byte	.LBB303
+	.8byte	.LBE303
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB308
+	.8byte	.LBE308
+	.8byte	.LBB309
+	.8byte	.LBE309
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB314
+	.8byte	.LBE314
+	.8byte	.LBB315
+	.8byte	.LBE315
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB326
+	.8byte	.LBE326
+	.8byte	.LBB332
+	.8byte	.LBE332
+	.8byte	.LBB333
+	.8byte	.LBE333
+	.8byte	.LBB334
+	.8byte	.LBE334
+	.8byte	.LBB337
+	.8byte	.LBE337
+	.8byte	0
+	.8byte	0
+	.8byte	.LFB263
+	.8byte	.LFE263
+	.8byte	.LFB276
+	.8byte	.LFE276
+	.8byte	.LFB274
+	.8byte	.LFE274
+	.8byte	.LFB273
+	.8byte	.LFE273
+	.8byte	.LFB277
+	.8byte	.LFE277
+	.8byte	.LFB262
+	.8byte	.LFE262
+	.8byte	.LFB278
+	.8byte	.LFE278
+	.8byte	.LFB279
+	.8byte	.LFE279
+	.8byte	.LFB280
+	.8byte	.LFE280
+	.8byte	.LFB269
+	.8byte	.LFE269
+	.8byte	.LFB267
+	.8byte	.LFE267
+	.8byte	.LFB268
+	.8byte	.LFE268
+	.8byte	.LFB272
+	.8byte	.LFE272
+	.8byte	0
+	.8byte	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF222:
+	.string	"UCLASS_SERIAL"
+.LASF320:
+	.string	"gd_t"
+.LASF15:
+	.string	"long int"
+.LASF39:
+	.string	"uclass_node"
+.LASF423:
+	.string	"request"
+.LASF313:
+	.string	"phandle"
+.LASF53:
+	.string	"flash_id"
+.LASF405:
+	.string	"misc_ops"
+.LASF377:
+	.string	"mem_malloc_start"
+.LASF428:
+	.string	"rk3562_secure_otp_write"
+.LASF333:
+	.string	"net_hostname"
+.LASF28:
+	.string	"name"
+.LASF249:
+	.string	"UCLASS_ETH_PHY"
+.LASF229:
+	.string	"UCLASS_THERMAL"
+.LASF60:
+	.string	"base"
+.LASF355:
+	.string	"NETLOOP_RESTART"
+.LASF288:
+	.string	"new_gd"
+.LASF349:
+	.string	"net_boot_file_size"
+.LASF134:
+	.string	"fit_hdr_os"
+.LASF181:
+	.string	"UCLASS_FIRMWARE"
+.LASF458:
+	.string	"udelay"
+.LASF142:
+	.string	"fit_noffset_fdt"
+.LASF74:
+	.string	"bi_dsp_freq"
+.LASF304:
+	.string	"malloc_ptr"
+.LASF91:
+	.string	"_datarellocal_start_ofs"
+.LASF94:
+	.string	"fdt32_t"
+.LASF146:
+	.string	"rd_start"
+.LASF372:
+	.string	"property"
+.LASF266:
+	.string	"tlb_emerg"
+.LASF78:
+	.string	"bi_enetaddr"
+.LASF291:
+	.string	"uclass_root"
+.LASF188:
+	.string	"UCLASS_IRQ"
+.LASF421:
+	.string	"rockchip_secure_otp_ofdata_to_platdata"
+.LASF438:
+	.string	"buffer"
+.LASF235:
+	.string	"UCLASS_USB_HUB"
+.LASF230:
+	.string	"UCLASS_TIMER"
+.LASF42:
+	.string	"flags"
+.LASF139:
+	.string	"fit_noffset_rd"
+.LASF270:
+	.string	"baudrate"
+.LASF335:
+	.string	"net_ethaddr"
+.LASF301:
+	.string	"timebase_l"
+.LASF21:
+	.string	"errno"
+.LASF32:
+	.string	"node"
+.LASF360:
+	.string	"bind"
+.LASF456:
+	.string	"printf"
+.LASF402:
+	.string	"DECOM_ZLIB"
+.LASF8:
+	.string	"unsigned int"
+.LASF47:
+	.string	"next"
+.LASF101:
+	.string	"version"
+.LASF397:
+	.string	"per_device_platdata_auto_alloc_size"
+.LASF131:
+	.string	"legacy_hdr_os_copy"
+.LASF195:
+	.string	"UCLASS_MMC"
+.LASF290:
+	.string	"dm_root_f"
+.LASF341:
+	.string	"net_rx_packet"
+.LASF38:
+	.string	"parent_priv"
+.LASF176:
+	.string	"UCLASS_CROS_EC"
+.LASF311:
+	.string	"console_evt"
+.LASF191:
+	.string	"UCLASS_LPC"
+.LASF105:
+	.string	"size_dt_struct"
+.LASF380:
+	.string	"p_current"
+.LASF345:
+	.string	"net_our_vlan"
+.LASF22:
+	.string	"___strtok"
+.LASF67:
+	.string	"bi_memsize"
+.LASF121:
+	.string	"image_info"
+.LASF200:
+	.string	"UCLASS_NVME"
+.LASF156:
+	.string	"bootm_headers_t"
+.LASF253:
+	.string	"UCLASS_RNG"
+.LASF250:
+	.string	"UCLASS_MDIO"
+.LASF187:
+	.string	"UCLASS_IDE"
+.LASF274:
+	.string	"bus_clk"
+.LASF378:
+	.string	"mem_malloc_end"
+.LASF225:
+	.string	"UCLASS_SPI_FLASH"
+.LASF189:
+	.string	"UCLASS_KEYBOARD"
+.LASF72:
+	.string	"bi_sramsize"
+.LASF185:
+	.string	"UCLASS_I2C_MUX"
+.LASF298:
+	.string	"fdt_blob_kern"
+.LASF278:
+	.string	"env_addr"
+.LASF48:
+	.string	"prev"
+.LASF227:
+	.string	"UCLASS_SYSCON"
+.LASF171:
+	.string	"UCLASS_BLK"
+.LASF212:
+	.string	"UCLASS_PWRSEQ"
+.LASF132:
+	.string	"legacy_hdr_valid"
+.LASF265:
+	.string	"tlb_fillptr"
+.LASF82:
+	.string	"bi_arch_number"
+.LASF324:
+	.string	"load_addr"
+.LASF292:
+	.string	"fdt_blob"
+.LASF329:
+	.string	"net_gateway"
+.LASF166:
+	.string	"UCLASS_PCI_EMUL"
+.LASF425:
+	.string	"offset"
+.LASF350:
+	.string	"net_boot_file_expected_size_in_blocks"
+.LASF404:
+	.string	"OTP_NS"
+.LASF415:
+	.string	"spl_rockchip_otp_start"
+.LASF206:
+	.string	"UCLASS_PHY"
+.LASF455:
+	.string	"dev_get_driver_data"
+.LASF3:
+	.string	"signed char"
+.LASF203:
+	.string	"UCLASS_PCH"
+.LASF100:
+	.string	"off_mem_rsvmap"
+.LASF163:
+	.string	"UCLASS_TEST_PROBE"
+.LASF149:
+	.string	"ft_len"
+.LASF19:
+	.string	"uint32_t"
+.LASF385:
+	.string	"udevice_id"
+.LASF326:
+	.string	"save_size"
+.LASF440:
+	.string	"read_end"
+.LASF379:
+	.string	"mem_malloc_brk"
+.LASF436:
+	.string	"rk3562_secure_otp_write_2_bytes_noecc"
+.LASF143:
+	.string	"fit_hdr_setup"
+.LASF300:
+	.string	"timebase_h"
+.LASF160:
+	.string	"UCLASS_TEST"
+.LASF87:
+	.string	"IRQ_STACK_START"
+.LASF420:
+	.string	"_u_boot_list_2_driver_2_rockchip_secure_otp"
+.LASF70:
+	.string	"bi_flashoffset"
+.LASF201:
+	.string	"UCLASS_PANEL"
+.LASF267:
+	.string	"pre_serial"
+.LASF431:
+	.string	"rockchip_secure_otp_capability"
+.LASF36:
+	.string	"uclass"
+.LASF162:
+	.string	"UCLASS_TEST_BUS"
+.LASF461:
+	.string	"/home/lxh/uboot/u-boot"
+.LASF239:
+	.string	"UCLASS_VIDEO_CONSOLE"
+.LASF361:
+	.string	"probe"
+.LASF10:
+	.string	"long long unsigned int"
+.LASF261:
+	.string	"lastinc"
+.LASF389:
+	.string	"post_bind"
+.LASF285:
+	.string	"irq_sp"
+.LASF327:
+	.string	"in_addr"
+.LASF197:
+	.string	"UCLASS_MTD"
+.LASF216:
+	.string	"UCLASS_RESET"
+.LASF117:
+	.string	"ih_type"
+.LASF80:
+	.string	"bi_intfreq"
+.LASF172:
+	.string	"UCLASS_CLK"
+.LASF351:
+	.string	"net_ping_ip"
+.LASF79:
+	.string	"bi_ethspeed"
+.LASF376:
+	.string	"ofnode"
+.LASF231:
+	.string	"UCLASS_TPM"
+.LASF316:
+	.string	"child"
+.LASF444:
+	.string	"rockchip_secure_otp_wait_flag"
+.LASF457:
+	.string	"malloc_simple"
+.LASF59:
+	.string	"lmb_property"
+.LASF269:
+	.string	"enable"
+.LASF429:
+	.string	"data_byte"
+.LASF263:
+	.string	"tlb_addr"
+.LASF374:
+	.string	"value"
+.LASF184:
+	.string	"UCLASS_I2C_GENERIC"
+.LASF99:
+	.string	"off_dt_strings"
+.LASF419:
+	.string	"rockchip_otp_ids"
+.LASF103:
+	.string	"boot_cpuid_phys"
+.LASF362:
+	.string	"remove"
+.LASF133:
+	.string	"fit_uname_cfg"
+.LASF106:
+	.string	"working_fdt"
+.LASF317:
+	.string	"sibling"
+.LASF460:
+	.string	"drivers/misc/rk3562-secure-otp.c"
+.LASF118:
+	.string	"ih_comp"
+.LASF202:
+	.string	"UCLASS_PANEL_BACKLIGHT"
+.LASF81:
+	.string	"bi_busfreq"
+.LASF297:
+	.string	"ufdt_blob"
+.LASF280:
+	.string	"ram_top"
+.LASF272:
+	.string	"global_data"
+.LASF328:
+	.string	"s_addr"
+.LASF127:
+	.string	"arch"
+.LASF226:
+	.string	"UCLASS_SPI_GENERIC"
+.LASF318:
+	.string	"mtd_info"
+.LASF95:
+	.string	"fdt_header"
+.LASF177:
+	.string	"UCLASS_DISPLAY"
+.LASF391:
+	.string	"pre_probe"
+.LASF353:
+	.string	"net_loop_state"
+.LASF55:
+	.string	"protect"
+.LASF347:
+	.string	"net_restart_wrap"
+.LASF307:
+	.string	"video_bottom"
+.LASF439:
+	.string	"write_end"
+.LASF71:
+	.string	"bi_sramstart"
+.LASF224:
+	.string	"UCLASS_SPMI"
+.LASF220:
+	.string	"UCLASS_SCMI_AGENT"
+.LASF23:
+	.string	"_Bool"
+.LASF12:
+	.string	"phys_size_t"
+.LASF45:
+	.string	"udevice"
+.LASF37:
+	.string	"uclass_priv"
+.LASF123:
+	.string	"image_len"
+.LASF319:
+	.string	"jt_funcs"
+.LASF409:
+	.string	"call"
+.LASF331:
+	.string	"net_dns_server"
+.LASF398:
+	.string	"__invalid_size_argument_for_IOC"
+.LASF57:
+	.string	"flash_info"
+.LASF463:
+	.string	"free"
+.LASF289:
+	.string	"dm_root"
+.LASF108:
+	.string	"ih_magic"
+.LASF218:
+	.string	"UCLASS_RAMDISK"
+.LASF124:
+	.string	"load"
+.LASF26:
+	.string	"_binary_u_boot_bin_end"
+.LASF141:
+	.string	"fit_uname_fdt"
+.LASF190:
+	.string	"UCLASS_LED"
+.LASF293:
+	.string	"new_fdt"
+.LASF408:
+	.string	"ioctl"
+.LASF434:
+	.string	"rk3562_secure_otp_write_byte_noecc"
+.LASF170:
+	.string	"UCLASS_AHCI"
+.LASF41:
+	.string	"sibling_node"
+.LASF334:
+	.string	"net_root_path"
+.LASF49:
+	.string	"block_drvr"
+.LASF9:
+	.string	"long long int"
+.LASF251:
+	.string	"UCLASS_EBC"
+.LASF325:
+	.string	"save_addr"
+.LASF35:
+	.string	"priv"
+.LASF209:
+	.string	"UCLASS_PMIC"
+.LASF303:
+	.string	"malloc_limit"
+.LASF14:
+	.string	"char"
+.LASF414:
+	.string	"secure_otp_data"
+.LASF180:
+	.string	"UCLASS_GPIO"
+.LASF44:
+	.string	"ide_bus_offset"
+.LASF255:
+	.string	"UCLASS_PD"
+.LASF52:
+	.string	"sector_count"
+.LASF145:
+	.string	"fit_noffset_setup"
+.LASF122:
+	.string	"image_start"
+.LASF56:
+	.string	"flash_info_t"
+.LASF228:
+	.string	"UCLASS_SYSRESET"
+.LASF115:
+	.string	"ih_os"
+.LASF31:
+	.string	"uclass_platdata"
+.LASF337:
+	.string	"net_ip"
+.LASF459:
+	.ascii	"GNU C11 6.3.1 201"
+	.string	"70404 -mstrict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18"
+.LASF306:
+	.string	"video_top"
+.LASF258:
+	.string	"LOGF_MAX_CATEGORIES"
+.LASF358:
+	.string	"net_state"
+.LASF286:
+	.string	"start_addr_sp"
+.LASF135:
+	.string	"fit_uname_os"
+.LASF18:
+	.string	"uint8_t"
+.LASF7:
+	.string	"__u32"
+.LASF363:
+	.string	"unbind"
+.LASF284:
+	.string	"mon_len"
+.LASF357:
+	.string	"NETLOOP_FAIL"
+.LASF418:
+	.string	"rk3562_data"
+.LASF365:
+	.string	"child_post_bind"
+.LASF314:
+	.string	"full_name"
+.LASF214:
+	.string	"UCLASS_REGULATOR"
+.LASF183:
+	.string	"UCLASS_I2C_EEPROM"
+.LASF371:
+	.string	"per_child_platdata_auto_alloc_size"
+.LASF445:
+	.string	"rockchip_secure_otp_wait_status"
+.LASF129:
+	.string	"bootm_headers"
+.LASF276:
+	.string	"mem_clk"
+.LASF359:
+	.string	"of_match"
+.LASF352:
+	.string	"uclass_id"
+.LASF321:
+	.string	"monitor_flash_len"
+.LASF367:
+	.string	"child_post_remove"
+.LASF370:
+	.string	"per_child_auto_alloc_size"
+.LASF213:
+	.string	"UCLASS_RAM"
+.LASF451:
+	.string	"rk3562_spl_rockchip_otp_start"
+.LASF364:
+	.string	"ofdata_to_platdata"
+.LASF208:
+	.string	"UCLASS_PINCTRL"
+.LASF29:
+	.string	"platdata"
+.LASF260:
+	.string	"timer_rate_hz"
+.LASF435:
+	.string	"data_2b"
+.LASF90:
+	.string	"_datarelrolocal_start_ofs"
+.LASF164:
+	.string	"UCLASS_SPI_EMUL"
+.LASF196:
+	.string	"UCLASS_MOD_EXP"
+.LASF97:
+	.string	"totalsize"
+.LASF388:
+	.string	"uclass_driver"
+.LASF73:
+	.string	"bi_arm_freq"
+.LASF199:
+	.string	"UCLASS_NORTHBRIDGE"
+.LASF236:
+	.string	"UCLASS_USB_GADGET_GENERIC"
+.LASF120:
+	.string	"image_header_t"
+.LASF68:
+	.string	"bi_flashstart"
+.LASF92:
+	.string	"_datarelro_start_ofs"
+.LASF13:
+	.string	"sizetype"
+.LASF386:
+	.string	"compatible"
+.LASF165:
+	.string	"UCLASS_I2C_EMUL"
+.LASF275:
+	.string	"pci_clk"
+.LASF173:
+	.string	"UCLASS_CPU"
+.LASF344:
+	.string	"net_null_ethaddr"
+.LASF86:
+	.string	"bd_t"
+.LASF174:
+	.string	"UCLASS_AMP"
+.LASF244:
+	.string	"UCLASS_RC"
+.LASF454:
+	.string	"dev_read_u32_default"
+.LASF338:
+	.string	"net_server_ip"
+.LASF281:
+	.string	"ram_top_ext_size"
+.LASF51:
+	.string	"size"
+.LASF58:
+	.string	"long double"
+.LASF76:
+	.string	"bi_bootflags"
+.LASF83:
+	.string	"bi_boot_params"
+.LASF442:
+	.string	"rockchip_secure_otp_check_flag"
+.LASF449:
+	.string	"mask"
+.LASF247:
+	.string	"UCLASS_IO_DOMAIN"
+.LASF25:
+	.string	"_binary_u_boot_bin_start"
+.LASF159:
+	.string	"UCLASS_DEMO"
+.LASF107:
+	.string	"image_header"
+.LASF102:
+	.string	"last_comp_version"
+.LASF322:
+	.string	"__dtb_dt_begin"
+.LASF252:
+	.string	"UCLASS_EINK_DISPLAY"
+.LASF310:
+	.string	"sys_start_tick"
+.LASF168:
+	.string	"UCLASS_SIMPLE_BUS"
+.LASF179:
+	.string	"UCLASS_ETH"
+.LASF153:
+	.string	"cmdline_end"
+.LASF75:
+	.string	"bi_ddr_freq"
+.LASF98:
+	.string	"off_dt_struct"
+.LASF441:
+	.string	"rockchip_secure_otp_ecc_enable"
+.LASF232:
+	.string	"UCLASS_UFS"
+.LASF309:
+	.string	"serial"
+.LASF387:
+	.string	"data"
+.LASF330:
+	.string	"net_netmask"
+.LASF323:
+	.string	"__dtb_dt_spl_begin"
+.LASF65:
+	.string	"bd_info"
+.LASF152:
+	.string	"cmdline_start"
+.LASF157:
+	.string	"images"
+.LASF268:
+	.string	"using_pre_serial"
+.LASF130:
+	.string	"legacy_hdr_os"
+.LASF426:
+	.string	"otp_data"
+.LASF192:
+	.string	"UCLASS_MAILBOX"
+.LASF217:
+	.string	"UCLASS_RKNAND"
+.LASF138:
+	.string	"fit_uname_rd"
+.LASF437:
+	.string	"rk3562_secure_otp_read"
+.LASF77:
+	.string	"bi_ip_addr"
+.LASF308:
+	.string	"pm_ctx_phys"
+.LASF296:
+	.string	"of_root_f"
+.LASF282:
+	.string	"relocaddr"
+.LASF33:
+	.string	"driver_data"
+.LASF0:
+	.string	"unsigned char"
+.LASF11:
+	.string	"phys_addr_t"
+.LASF390:
+	.string	"pre_unbind"
+.LASF432:
+	.string	"rk3562_secure_otp_write_2_bytes"
+.LASF339:
+	.string	"net_tx_packet"
+.LASF396:
+	.string	"per_device_auto_alloc_size"
+.LASF150:
+	.string	"initrd_start"
+.LASF34:
+	.string	"parent"
+.LASF381:
+	.string	"current"
+.LASF6:
+	.string	"short int"
+.LASF302:
+	.string	"malloc_base"
+.LASF116:
+	.string	"ih_arch"
+.LASF401:
+	.string	"DECOM_GZIP"
+.LASF315:
+	.string	"properties"
+.LASF241:
+	.string	"UCLASS_WDT"
+.LASF443:
+	.string	"delay"
+.LASF373:
+	.string	"length"
+.LASF332:
+	.string	"net_nis_domain"
+.LASF112:
+	.string	"ih_load"
+.LASF299:
+	.string	"env_buf"
+.LASF356:
+	.string	"NETLOOP_SUCCESS"
+.LASF167:
+	.string	"UCLASS_USB_EMUL"
+.LASF430:
+	.string	"temp"
+.LASF161:
+	.string	"UCLASS_TEST_FDT"
+.LASF294:
+	.string	"fdt_size"
+.LASF416:
+	.string	"spl_rockchip_otp_stop"
+.LASF446:
+	.string	"flag"
+.LASF17:
+	.string	"ulong"
+.LASF110:
+	.string	"ih_time"
+.LASF111:
+	.string	"ih_size"
+.LASF178:
+	.string	"UCLASS_DMA"
+.LASF254:
+	.string	"UCLASS_DMC"
+.LASF215:
+	.string	"UCLASS_REMOTEPROC"
+.LASF354:
+	.string	"NETLOOP_CONTINUE"
+.LASF219:
+	.string	"UCLASS_RTC"
+.LASF262:
+	.string	"timer_reset_value"
+.LASF295:
+	.string	"of_root"
+.LASF340:
+	.string	"net_rx_packets"
+.LASF194:
+	.string	"UCLASS_MISC"
+.LASF62:
+	.string	"region"
+.LASF148:
+	.string	"ft_addr"
+.LASF417:
+	.string	"rockchip_secure_otp_ops"
+.LASF406:
+	.string	"read"
+.LASF54:
+	.string	"start"
+.LASF144:
+	.string	"fit_uname_setup"
+.LASF114:
+	.string	"ih_dcrc"
+.LASF24:
+	.string	"image_base"
+.LASF393:
+	.string	"pre_remove"
+.LASF158:
+	.string	"UCLASS_ROOT"
+.LASF96:
+	.string	"magic"
+.LASF242:
+	.string	"UCLASS_FG"
+.LASF137:
+	.string	"fit_hdr_rd"
+.LASF140:
+	.string	"fit_hdr_fdt"
+.LASF113:
+	.string	"ih_ep"
+.LASF287:
+	.string	"reloc_off"
+.LASF394:
+	.string	"init"
+.LASF240:
+	.string	"UCLASS_VIDEO_CRTC"
+.LASF237:
+	.string	"UCLASS_VIDEO"
+.LASF447:
+	.string	"secure_conf"
+.LASF205:
+	.string	"UCLASS_PCI_GENERIC"
+.LASF1:
+	.string	"long unsigned int"
+.LASF5:
+	.string	"__u8"
+.LASF375:
+	.string	"of_offset"
+.LASF259:
+	.string	"arch_global_data"
+.LASF89:
+	.string	"_datarel_start_ofs"
+.LASF312:
+	.string	"device_node"
+.LASF264:
+	.string	"tlb_size"
+.LASF66:
+	.string	"bi_memstart"
+.LASF109:
+	.string	"ih_hcrc"
+.LASF104:
+	.string	"size_dt_strings"
+.LASF128:
+	.string	"image_info_t"
+.LASF63:
+	.string	"memory"
+.LASF27:
+	.string	"driver"
+.LASF147:
+	.string	"rd_end"
+.LASF193:
+	.string	"UCLASS_MASS_STORAGE"
+.LASF450:
+	.string	"rk3562_spl_rockchip_otp_stop"
+.LASF151:
+	.string	"initrd_end"
+.LASF210:
+	.string	"UCLASS_PWM"
+.LASF93:
+	.string	"IRQ_STACK_START_IN"
+.LASF84:
+	.string	"bi_andr_version"
+.LASF126:
+	.string	"type"
+.LASF342:
+	.string	"net_rx_packet_len"
+.LASF384:
+	.string	"u_boot_dev_head"
+.LASF427:
+	.string	"secure_otp_read"
+.LASF221:
+	.string	"UCLASS_SCSI"
+.LASF16:
+	.string	"ushort"
+.LASF204:
+	.string	"UCLASS_PCI"
+.LASF198:
+	.string	"UCLASS_NOP"
+.LASF395:
+	.string	"destroy"
+.LASF448:
+	.string	"otp_cru_rst"
+.LASF248:
+	.string	"UCLASS_CRYPTO"
+.LASF453:
+	.string	"dev_read_addr_ptr"
+.LASF277:
+	.string	"have_console"
+.LASF400:
+	.string	"DECOM_LZ4"
+.LASF175:
+	.string	"UCLASS_CODEC"
+.LASF382:
+	.string	"uc_drv"
+.LASF233:
+	.string	"UCLASS_USB"
+.LASF305:
+	.string	"cur_serial_dev"
+.LASF271:
+	.string	"addr"
+.LASF46:
+	.string	"list_head"
+.LASF155:
+	.string	"state"
+.LASF20:
+	.string	"__be32"
+.LASF207:
+	.string	"UCLASS_PINCONFIG"
+.LASF234:
+	.string	"UCLASS_USB_DEV_GENERIC"
+.LASF343:
+	.string	"net_bcast_ethaddr"
+.LASF136:
+	.string	"fit_noffset_os"
+.LASF223:
+	.string	"UCLASS_SPI"
+.LASF336:
+	.string	"net_server_ethaddr"
+.LASF256:
+	.string	"UCLASS_COUNT"
+.LASF279:
+	.string	"env_valid"
+.LASF246:
+	.string	"UCLASS_DVFS"
+.LASF413:
+	.string	"otp_cru_rst_base"
+.LASF40:
+	.string	"child_head"
+.LASF50:
+	.string	"select_hwpart"
+.LASF4:
+	.string	"uchar"
+.LASF69:
+	.string	"bi_flashsize"
+.LASF383:
+	.string	"dev_head"
+.LASF410:
+	.string	"rockchip_otp_platdata"
+.LASF2:
+	.string	"short unsigned int"
+.LASF392:
+	.string	"post_probe"
+.LASF366:
+	.string	"child_pre_probe"
+.LASF422:
+	.string	"secure_otp_ioctl"
+.LASF348:
+	.string	"net_boot_file_name"
+.LASF407:
+	.string	"write"
+.LASF245:
+	.string	"UCLASS_CHARGE_DISPLAY"
+.LASF257:
+	.string	"UCLASS_INVALID"
+.LASF403:
+	.string	"OTP_S"
+.LASF433:
+	.string	"__func__"
+.LASF64:
+	.string	"reserved"
+.LASF182:
+	.string	"UCLASS_I2C"
+.LASF119:
+	.string	"ih_name"
+.LASF462:
+	.string	"ofnode_union"
+.LASF412:
+	.string	"otp_mask_base"
+.LASF169:
+	.string	"UCLASS_ADC"
+.LASF43:
+	.string	"req_seq"
+.LASF283:
+	.string	"ram_size"
+.LASF452:
+	.string	"dev_get_platdata"
+.LASF186:
+	.string	"UCLASS_I2S"
+.LASF368:
+	.string	"priv_auto_alloc_size"
+.LASF30:
+	.string	"parent_platdata"
+.LASF411:
+	.string	"secure_conf_base"
+.LASF154:
+	.string	"verify"
+.LASF88:
+	.string	"FIQ_STACK_START"
+.LASF85:
+	.string	"bi_dram"
+.LASF125:
+	.string	"comp"
+.LASF346:
+	.string	"net_native_vlan"
+.LASF424:
+	.string	"secure_otp_write"
+.LASF211:
+	.string	"UCLASS_POWER_DOMAIN"
+.LASF399:
+	.string	"misc_mode"
+.LASF273:
+	.string	"cpu_clk"
+.LASF238:
+	.string	"UCLASS_VIDEO_BRIDGE"
+.LASF369:
+	.string	"platdata_auto_alloc_size"
+.LASF61:
+	.string	"lmb_region"
+.LASF243:
+	.string	"UCLASS_KEY"
+	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/u-boot/drivers/misc/rockchip-otp.c b/u-boot/drivers/misc/rockchip-otp.c
index 6782148..16d53bf 100644
--- a/u-boot/drivers/misc/rockchip-otp.c
+++ b/u-boot/drivers/misc/rockchip-otp.c
@@ -246,7 +246,7 @@
 	if (!buffer)
 		return -ENOMEM;
 
-	ret = rockchip_otp_ecc_enable(otp, false);
+	ret = rockchip_otp_ecc_enable(otp, true);
 	if (ret < 0) {
 		printf("%s rockchip_otp_ecc_enable err\n", __func__);
 		return ret;
@@ -460,6 +460,14 @@
 		.data = (ulong)&rk3308bs_data,
 	},
 	{
+		.compatible = "rockchip,rk3528-otp",
+		.data = (ulong)&rk3568_data,
+	},
+	{
+		.compatible = "rockchip,rk3562-otp",
+		.data = (ulong)&rk3568_data,
+	},
+	{
 		.compatible = "rockchip,rk3568-otp",
 		.data = (ulong)&rk3568_data,
 	},
diff --git a/u-boot/drivers/mmc/dw_mmc.c b/u-boot/drivers/mmc/dw_mmc.c
index ae4a04d..aa31971 100644
--- a/u-boot/drivers/mmc/dw_mmc.c
+++ b/u-boot/drivers/mmc/dw_mmc.c
@@ -8,6 +8,7 @@
 
 #include <common.h>
 #include <bouncebuf.h>
+#include <div64.h>
 #include <errno.h>
 #include <malloc.h>
 #include <memalign.h>
@@ -19,6 +20,7 @@
 #endif
 
 #define PAGE_SIZE 4096
+#define MSEC_PER_SEC	1000ULL
 
 /*
  * Currently it supports read/write up to 8*8*4 Bytes per
@@ -159,18 +161,62 @@
 	dwmci_writel(host, DWMCI_BYTCNT, data->blocksize * data->blocks);
 }
 
-static unsigned int dwmci_get_timeout(struct mmc *mmc, const unsigned int size)
+#ifdef CONFIG_SPL_BUILD
+static unsigned int dwmci_get_drto(struct dwmci_host *host,
+				   const unsigned int size)
+{
+	unsigned int drto_clks;
+	unsigned int drto_div;
+	unsigned int drto_ms;
+
+	drto_clks = dwmci_readl(host, DWMCI_TMOUT) >> 8;
+	drto_div = (dwmci_readl(host, DWMCI_CLKDIV) & 0xff) * 2;
+	if (drto_div == 0)
+		drto_div = 1;
+
+	drto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * drto_clks * drto_div,
+				   host->mmc->clock);
+
+	/* add a bit spare time */
+	drto_ms += 10;
+
+	return drto_ms;
+}
+#else
+static unsigned int dwmci_get_drto(struct dwmci_host *host,
+				   const unsigned int size)
 {
 	unsigned int timeout;
 
 	timeout = size * 8;	/* counting in bits */
 	timeout *= 10;		/* wait 10 times as long */
-	timeout /= mmc->clock;
-	timeout /= mmc->bus_width;
+	timeout /= host->mmc->clock;
+	timeout /= host->mmc->bus_width;
 	timeout *= 1000;	/* counting in msec */
 	timeout = (timeout < 10000) ? 10000 : timeout;
 
 	return timeout;
+}
+#endif
+
+static unsigned int dwmci_get_cto(struct dwmci_host *host)
+{
+	unsigned int cto_clks;
+	unsigned int cto_div;
+	unsigned int cto_ms;
+
+	cto_clks = dwmci_readl(host, DWMCI_TMOUT) & 0xff;
+	cto_div = (dwmci_readl(host, DWMCI_CLKDIV) & 0xff) * 2;
+	if (cto_div == 0)
+		cto_div = 1;
+
+	cto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * cto_clks * cto_div,
+				  host->mmc->clock);
+
+	/* add a bit spare time */
+	cto_ms += 10;
+
+	return cto_ms;
 }
 
 static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data)
@@ -192,7 +238,7 @@
 	else
 		buf = (unsigned int *)data->src;
 
-	timeout = dwmci_get_timeout(host->mmc, size);
+	timeout = dwmci_get_drto(host, size);
 	size /= 4;
 
 	for (;;) {
@@ -252,6 +298,7 @@
 				}
 				dwmci_writel(host, DWMCI_RINTSTS,
 					     DWMCI_INTMSK_RXDR);
+				start = get_timer(0);
 			} else if (data->flags == MMC_DATA_WRITE &&
 				   (mask & DWMCI_INTMSK_TXDR)) {
 				while (size) {
@@ -281,6 +328,7 @@
 				}
 				dwmci_writel(host, DWMCI_RINTSTS,
 					     DWMCI_INTMSK_TXDR);
+				start = get_timer(0);
 			}
 		}
 
@@ -329,9 +377,8 @@
 	struct dwmci_host *host = mmc->priv;
 	ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac,
 				 data ? DIV_ROUND_UP(data->blocks, 8) : 0);
-	int ret = 0, flags = 0, i;
+	int ret = 0, flags = 0;
 	unsigned int timeout = 500;
-	u32 retry = 100000;
 	u32 mask, ctrl;
 	ulong start = get_timer(0);
 	struct bounce_buffer bbstate;
@@ -400,16 +447,18 @@
 
 	dwmci_writel(host, DWMCI_CMD, flags);
 
-	for (i = 0; i < retry; i++) {
+	timeout = dwmci_get_cto(host);
+	start = get_timer(0);
+	do {
 		mask = dwmci_readl(host, DWMCI_RINTSTS);
 		if (mask & DWMCI_INTMSK_CDONE) {
 			if (!data)
 				dwmci_writel(host, DWMCI_RINTSTS, mask);
 			break;
 		}
-	}
+	} while (!(get_timer(start) > timeout));
 
-	if (i == retry) {
+	if (get_timer(start) > timeout) {
 		debug("%s: Timeout.\n", __func__);
 		return -ETIMEDOUT;
 	}
@@ -470,9 +519,8 @@
 #endif
 	struct dwmci_host *host = mmc->priv;
 	struct dwmci_idmac *cur_idmac;
-	int ret = 0, flags = 0, i;
+	int ret = 0, flags = 0;
 	unsigned int timeout = 500;
-	u32 retry = 100000;
 	u32 mask;
 	ulong start = get_timer(0);
 	struct bounce_buffer bbstate;
@@ -541,16 +589,18 @@
 
 	dwmci_writel(host, DWMCI_CMD, flags);
 
-	for (i = 0; i < retry; i++) {
+	timeout = dwmci_get_cto(host);
+	start = get_timer(0);
+	do {
 		mask = dwmci_readl(host, DWMCI_RINTSTS);
 		if (mask & DWMCI_INTMSK_CDONE) {
 			if (!data)
 				dwmci_writel(host, DWMCI_RINTSTS, mask);
 			break;
 		}
-	}
+	} while (!(get_timer(start) > timeout));
 
-	if (i == retry) {
+	if (get_timer(start) > timeout) {
 		debug("%s: Timeout.\n", __func__);
 		return -ETIMEDOUT;
 	}
diff --git a/u-boot/drivers/mmc/mmc-uclass.c b/u-boot/drivers/mmc/mmc-uclass.c
index 0b49d3d..eb44c38 100644
--- a/u-boot/drivers/mmc/mmc-uclass.c
+++ b/u-boot/drivers/mmc/mmc-uclass.c
@@ -143,6 +143,20 @@
 	return dm_mmc_get_cd(mmc->dev);
 }
 
+static int dm_mmc_set_enhanced_strobe(struct udevice *dev)
+{
+	struct dm_mmc_ops *ops = mmc_get_ops(dev);
+
+	if (ops->set_enhanced_strobe)
+		return ops->set_enhanced_strobe(dev);
+
+	return -ENOTSUPP;
+}
+
+int mmc_set_enhanced_strobe(struct mmc *mmc)
+{
+	return dm_mmc_set_enhanced_strobe(mmc->dev);
+}
 struct mmc *mmc_get_mmc_dev(struct udevice *dev)
 {
 	struct mmc_uclass_priv *upriv;
diff --git a/u-boot/drivers/mmc/mmc.c b/u-boot/drivers/mmc/mmc.c
index 679fda6..590e4ba 100644
--- a/u-boot/drivers/mmc/mmc.c
+++ b/u-boot/drivers/mmc/mmc.c
@@ -1007,12 +1007,22 @@
 	return ret;
 }
 
+static int mmc_switch_to_hs400(struct mmc *mmc)
+{
+	u8 val, fixed_drv_type, card_drv_type, drive_strength;
+
+	fixed_drv_type = mmc->cfg->fixed_drv_type;
+	card_drv_type = mmc->raw_driver_strength | mmc_driver_type_mask(0);
+	drive_strength = (card_drv_type & mmc_driver_type_mask(fixed_drv_type))
+				 ? fixed_drv_type : 0;
+	val = EXT_CSD_TIMING_HS400 | drive_strength << EXT_CSD_DRV_STR_SHIFT;
+
+	return __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, val, false);
+}
+
 static int mmc_select_hs400(struct mmc *mmc)
 {
 	int ret;
-
-	/* Reduce frequency to HS frequency */
-	mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR);
 
 	/* Switch card to HS mode */
 	ret = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
@@ -1022,6 +1032,9 @@
 
 	/* Set host controller to HS timing */
 	mmc_set_timing(mmc, MMC_TIMING_MMC_HS);
+
+	/* Reduce frequency to HS frequency */
+	mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR);
 
 	ret = mmc_send_status(mmc, 1000);
 	if (ret)
@@ -1035,8 +1048,7 @@
 		return ret;
 
 	/* Switch card to HS400 */
-	ret = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
-			   EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400, false);
+	ret = mmc_switch_to_hs400(mmc);
 	if (ret)
 		return ret;
 
@@ -1045,9 +1057,48 @@
 
 	return ret;
 }
+
+static int mmc_select_hs400es(struct mmc *mmc)
+{
+	int err;
+
+	/* Switch card to HS mode */
+	err = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
+			   EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, false);
+	if (err)
+		return err;
+
+	/* Set host controller to HS timing */
+	mmc_set_timing(mmc, MMC_TIMING_MMC_HS);
+
+	err = mmc_send_status(mmc, 1000);
+	if (err)
+		return err;
+
+	mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR);
+
+	err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH,
+			 EXT_CSD_DDR_BUS_WIDTH_8 |
+			 EXT_CSD_BUS_WIDTH_STROBE);
+	if (err) {
+		printf("switch to bus width for hs400 failed\n");
+		return err;
+	}
+
+	/* Switch card to HS400 */
+	err = mmc_switch_to_hs400(mmc);
+	if (err)
+		return err;
+
+	/* Set host controller to HS400 timing and frequency */
+	mmc_set_timing(mmc, MMC_TIMING_MMC_HS400ES);
+
+	return mmc_set_enhanced_strobe(mmc);
+}
 #else
 static int mmc_select_hs200(struct mmc *mmc) { return 0; }
 static int mmc_select_hs400(struct mmc *mmc) { return 0; }
+static int mmc_select_hs400es(struct mmc *mmc) { return 0; }
 #endif
 
 static u32 mmc_select_card_type(struct mmc *mmc, u8 *ext_csd)
@@ -1139,6 +1190,16 @@
 		return err;
 
 	avail_type = mmc_select_card_type(mmc, ext_csd);
+
+	if (avail_type & EXT_CSD_CARD_TYPE_HS400ES) {
+		err = mmc_select_bus_width(mmc);
+		if (err > 0 && mmc->bus_width == MMC_BUS_WIDTH_8BIT) {
+			err = mmc_select_hs400es(mmc);
+			mmc_set_bus_speed(mmc, avail_type);
+			if (!err)
+				return err;
+		}
+	}
 
 	if (avail_type & EXT_CSD_CARD_TYPE_HS200)
 		err = mmc_select_hs200(mmc);
@@ -1824,6 +1885,10 @@
 	mmc->erase_grp_size = 1;
 	mmc->part_config = MMCPART_NOAVAILABLE;
 	if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
+		/* select high speed to reduce initialization time */
+		mmc_select_hs(mmc);
+		mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR);
+
 		/* check  ext_csd version and capacity */
 		err = mmc_send_ext_csd(mmc, ext_csd);
 		if (err)
@@ -1973,6 +2038,8 @@
 			* ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
 
 		mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
+
+		mmc->raw_driver_strength = ext_csd[EXT_CSD_DRIVER_STRENGTH];
 	}
 
 	err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
diff --git a/u-boot/drivers/mmc/rockchip_dw_mmc.c b/u-boot/drivers/mmc/rockchip_dw_mmc.c
index 1287551..a78cb39 100644
--- a/u-boot/drivers/mmc/rockchip_dw_mmc.c
+++ b/u-boot/drivers/mmc/rockchip_dw_mmc.c
@@ -42,7 +42,7 @@
 {
 	struct rockchip_dwmmc_priv *priv = dev_get_priv(dev);
 
-	if (!priv || !&priv->clk)
+	if (!priv)
 		return 0;
 
 	if (!memcmp(dev->name, "dwmmc", strlen("dwmmc")))
diff --git a/u-boot/drivers/mmc/rockchip_sdhci.c b/u-boot/drivers/mmc/rockchip_sdhci.c
index d6224da..327c0d2 100644
--- a/u-boot/drivers/mmc/rockchip_sdhci.c
+++ b/u-boot/drivers/mmc/rockchip_sdhci.c
@@ -39,6 +39,12 @@
 	((((x) >> PHYCTRL_DLLRDY_SHIFT) & PHYCTRL_DLLRDY_MASK) ==\
 	PHYCTRL_DLLRDY_DONE)
 
+#define ARASAN_VENDOR_REGISTER		0x78
+#define ARASAN_VENDOR_ENHANCED_STROBE	BIT(0)
+
+/* DWC IP vendor area 1 pointer */
+#define DWCMSHC_P_VENDOR_AREA1		0xe8
+#define DWCMSHC_AREA1_MASK		GENMASK(11, 0)
 /* Rockchip specific Registers */
 #define DWCMSHC_CTRL_HS400		0x7
 #define DWCMSHC_CARD_IS_EMMC		BIT(0)
@@ -46,6 +52,7 @@
 
 #define DWCMSHC_HOST_CTRL3		0x508
 #define DWCMSHC_EMMC_CONTROL		0x52c
+#define DWCMSHC_EMMC_ATCTRL		0x540
 #define DWCMSHC_EMMC_DLL_CTRL		0x800
 #define DWCMSHC_EMMC_DLL_CTRL_RESET	BIT(1)
 #define DWCMSHC_EMMC_DLL_RXCLK		0x804
@@ -55,25 +62,31 @@
 #define DWCMSHC_EMMC_DLL_STATUS0	0x840
 #define DWCMSHC_EMMC_DLL_STATUS1	0x844
 #define DWCMSHC_EMMC_DLL_START		BIT(0)
-#define DWCMSHC_EMMC_DLL_RXCLK_SRCSEL	29
 #define DWCMSHC_EMMC_DLL_START_POINT	16
 #define DWCMSHC_EMMC_DLL_START_DEFAULT	5
 #define DWCMSHC_EMMC_DLL_INC_VALUE	2
 #define DWCMSHC_EMMC_DLL_INC		8
+#define DWCMSHC_EMMC_DLL_BYPASS		BIT(24)
 #define DWCMSHC_EMMC_DLL_DLYENA		BIT(27)
 #define DLL_TXCLK_TAPNUM_DEFAULT	0x10
-#define DLL_TXCLK_TAPNUM_90_DEGREES	0x8
-#define DLL_STRBIN_TAPNUM_DEFAULT	0x3
+#define DLL_TXCLK_TAPNUM_90_DEGREES	0x9
+#define DLL_STRBIN_TAPNUM_DEFAULT	0x4
+#define DLL_STRBIN_DELAY_NUM_OFFSET	16
+#define DLL_STRBIN_TAPNUM_FROM_SW	BIT(24)
+#define DLL_STRBIN_DELAY_NUM_SEL	BIT(26)
 #define DLL_TXCLK_TAPNUM_FROM_SW	BIT(24)
 #define DLL_TXCLK_NO_INVERTER		BIT(29)
 #define DWCMSHC_EMMC_DLL_LOCKED		BIT(8)
 #define DWCMSHC_EMMC_DLL_TIMEOUT	BIT(9)
-#define DLL_RXCLK_NO_INVERTER		1
-#define DLL_RXCLK_INVERTER		0
+#define DLL_TAP_VALUE_SEL		BIT(25)
+#define DLL_TAP_VALUE_OFFSET		8
+#define DLL_RXCLK_NO_INVERTER		BIT(29)
+#define DLL_RXCLK_ORI_GATE		BIT(31)
 #define DLL_CMDOUT_TAPNUM_90_DEGREES	0x8
 #define DLL_CMDOUT_TAPNUM_FROM_SW	BIT(24)
 #define DLL_CMDOUT_SRC_CLK_NEG		BIT(28)
 #define DLL_CMDOUT_EN_SRC_CLK_NEG	BIT(29)
+#define DLL_CMDOUT_BOTH_CLK_EDGE	BIT(30)
 
 #define DWCMSHC_ENHANCED_STROBE		BIT(8)
 #define DLL_LOCK_WO_TMOUT(x) \
@@ -106,10 +119,18 @@
 struct sdhci_data {
 	int (*emmc_set_clock)(struct sdhci_host *host, unsigned int clock);
 	void (*set_ios_post)(struct sdhci_host *host);
+	int (*set_enhanced_strobe)(struct sdhci_host *host);
 	int (*get_phy)(struct udevice *dev);
 	u32 flags;
 #define RK_DLL_CMD_OUT		BIT(1)
 #define RK_RXCLK_NO_INVERTER	BIT(2)
+#define RK_TAP_VALUE_SEL	BIT(3)
+
+	u8 hs200_tx_tap;
+	u8 hs400_tx_tap;
+	u8 hs400_cmd_tap;
+	u8 hs400_strbin_tap;
+	u8 ddr50_strbin_delay_num;
 };
 
 static void rk3399_emmc_phy_power_on(struct rockchip_emmc_phy *phy, u32 clock)
@@ -254,21 +275,7 @@
 	clk |= SDHCI_CLOCK_INT_EN;
 	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
 
-	/* Wait max 20 ms */
-	timeout = 20;
-	while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
-		& SDHCI_CLOCK_INT_STABLE)) {
-		if (timeout == 0) {
-			printf("%s: Internal clock never stabilised.\n",
-			       __func__);
-			return -EBUSY;
-		}
-		timeout--;
-		udelay(1000);
-	}
-	clk |= SDHCI_CLOCK_CARD_EN;
-	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
-	host->clock = clock;
+	sdhci_enable_clk(host, clk);
 
 	return 0;
 }
@@ -323,16 +330,24 @@
 {
 	struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
 	struct sdhci_data *data = (struct sdhci_data *)dev_get_driver_data(priv->dev);
-	u32 extra;
+	u32 txclk_tapnum, extra, dll_lock_value;
 	int timeout = 500, ret;
 
 	ret = rockchip_emmc_set_clock(host, clock);
+
+	/* Disable output clock while config DLL */
+	sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
 
 	if (clock >= 100 * MHz) {
 		/* reset DLL */
 		sdhci_writel(host, DWCMSHC_EMMC_DLL_CTRL_RESET, DWCMSHC_EMMC_DLL_CTRL);
 		udelay(1);
 		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
+
+		extra = 0x1 << 16 | /* tune clock stop en */
+			0x2 << 17 | /* pre-change delay */
+			0x3 << 19;  /* post-change delay */
+		sdhci_writel(host, extra, DWCMSHC_EMMC_ATCTRL);
 
 		/* Init DLL settings */
 		extra = DWCMSHC_EMMC_DLL_START_DEFAULT << DWCMSHC_EMMC_DLL_START_POINT |
@@ -341,48 +356,106 @@
 		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_CTRL);
 
 		while (1) {
-			if (timeout < 0)
-				return -ETIMEDOUT;
+			if (timeout < 0) {
+				ret = -ETIMEDOUT;
+				goto exit;
+			}
 			if (DLL_LOCK_WO_TMOUT((sdhci_readl(host, DWCMSHC_EMMC_DLL_STATUS0))))
 				break;
 			udelay(1);
 			timeout--;
 		}
-		extra = DWCMSHC_EMMC_DLL_DLYENA;
+		dll_lock_value = ((sdhci_readl(host, DWCMSHC_EMMC_DLL_STATUS0) & 0xFF) * 2 ) & 0xFF;
+		extra = DWCMSHC_EMMC_DLL_DLYENA | DLL_RXCLK_ORI_GATE;
 		if (data->flags & RK_RXCLK_NO_INVERTER)
-			extra |= DLL_RXCLK_NO_INVERTER << DWCMSHC_EMMC_DLL_RXCLK_SRCSEL;
+			extra |= DLL_RXCLK_NO_INVERTER;
+		if (data->flags & RK_TAP_VALUE_SEL)
+			extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET);
 		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK);
+
+		txclk_tapnum = data->hs200_tx_tap;
+		if ((data->flags & RK_DLL_CMD_OUT) &&
+		    (host->mmc->timing == MMC_TIMING_MMC_HS400 ||
+		    host->mmc->timing == MMC_TIMING_MMC_HS400ES)) {
+			txclk_tapnum = data->hs400_tx_tap;
+
+			extra = DLL_CMDOUT_SRC_CLK_NEG |
+				DLL_CMDOUT_BOTH_CLK_EDGE |
+				DWCMSHC_EMMC_DLL_DLYENA |
+				data->hs400_cmd_tap |
+				DLL_CMDOUT_TAPNUM_FROM_SW;
+			if (data->flags & RK_TAP_VALUE_SEL)
+				extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET);
+			sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT);
+		}
 
 		extra = DWCMSHC_EMMC_DLL_DLYENA |
 			DLL_TXCLK_TAPNUM_FROM_SW |
 			DLL_TXCLK_NO_INVERTER|
-			DLL_TXCLK_TAPNUM_DEFAULT;
-
+			txclk_tapnum;
+		if (data->flags & RK_TAP_VALUE_SEL)
+			extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET);
 		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_TXCLK);
 
 		extra = DWCMSHC_EMMC_DLL_DLYENA |
-			DLL_STRBIN_TAPNUM_DEFAULT;
+			data->hs400_strbin_tap |
+			DLL_STRBIN_TAPNUM_FROM_SW;
+		if (data->flags & RK_TAP_VALUE_SEL)
+			extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET);
 		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN);
 	} else {
+		/* disable dll */
+		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
+
 		/* Disable cmd conflict check */
 		extra = sdhci_readl(host, DWCMSHC_HOST_CTRL3);
 		extra &= ~BIT(0);
 		sdhci_writel(host, extra, DWCMSHC_HOST_CTRL3);
 
 		/* reset the clock phase when the frequency is lower than 100MHz */
-		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
-		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_RXCLK);
+		sdhci_writel(host, DWCMSHC_EMMC_DLL_BYPASS | DWCMSHC_EMMC_DLL_START, DWCMSHC_EMMC_DLL_CTRL);
+		sdhci_writel(host, DLL_RXCLK_ORI_GATE, DWCMSHC_EMMC_DLL_RXCLK);
 		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
-		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_STRBIN);
 		sdhci_writel(host, 0, DECMSHC_EMMC_DLL_CMDOUT);
+		/*
+		 * Before switching to hs400es mode, the driver will enable
+		 * enhanced strobe first. PHY needs to configure the parameters
+		 * of enhanced strobe first.
+		 */
+		extra = DWCMSHC_EMMC_DLL_DLYENA |
+			DLL_STRBIN_DELAY_NUM_SEL |
+			data->ddr50_strbin_delay_num << DLL_STRBIN_DELAY_NUM_OFFSET;
+		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN);
 	}
+
+exit:
+	/* enable output clock */
+	sdhci_enable_clk(host, 0);
+
 	return ret;
+}
+
+static int dwcmshc_sdhci_set_enhanced_strobe(struct sdhci_host *host)
+{
+	struct mmc *mmc = host->mmc;
+	u32 vendor;
+
+	vendor = sdhci_readl(host, DWCMSHC_EMMC_CONTROL);
+	if (mmc->timing == MMC_TIMING_MMC_HS400ES)
+		vendor |= DWCMSHC_ENHANCED_STROBE;
+	else
+		vendor &= ~DWCMSHC_ENHANCED_STROBE;
+	sdhci_writel(host, vendor, DWCMSHC_EMMC_CONTROL);
+
+	/* some emmc device need a delay before send command */
+	udelay(100);
+
+	return 0;
 }
 
 static void dwcmshc_sdhci_set_ios_post(struct sdhci_host *host)
 {
 	u16 ctrl;
-	u32 extra;
 	u32 timing = host->mmc->timing;
 
 	if (timing == MMC_TIMING_MMC_HS400 || timing == MMC_TIMING_MMC_HS400ES) {
@@ -395,16 +468,6 @@
 		ctrl = sdhci_readw(host, DWCMSHC_EMMC_CONTROL);
 		ctrl |= DWCMSHC_CARD_IS_EMMC;
 		sdhci_writew(host, ctrl, DWCMSHC_EMMC_CONTROL);
-
-		extra = DLL_CMDOUT_SRC_CLK_NEG |
-			DLL_CMDOUT_EN_SRC_CLK_NEG;
-		sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT);
-
-		extra = DWCMSHC_EMMC_DLL_DLYENA |
-			DLL_TXCLK_TAPNUM_FROM_SW |
-			DLL_TXCLK_NO_INVERTER|
-			DLL_TXCLK_TAPNUM_90_DEGREES;
-		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_TXCLK);
 	}
 }
 
@@ -434,9 +497,21 @@
 		data->set_ios_post(host);
 }
 
+static int rockchip_sdhci_set_enhanced_strobe(struct sdhci_host *host)
+{
+	struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host);
+	struct sdhci_data *data = (struct sdhci_data *)dev_get_driver_data(priv->dev);
+
+	if (data->set_enhanced_strobe)
+		return data->set_enhanced_strobe(host);
+
+	return -ENOTSUPP;
+}
+
 static struct sdhci_ops rockchip_sdhci_ops = {
 	.set_clock	= rockchip_sdhci_set_clock,
 	.set_ios_post	= rockchip_sdhci_set_ios_post,
+	.set_enhanced_strobe = rockchip_sdhci_set_enhanced_strobe,
 };
 
 static int rockchip_sdhci_probe(struct udevice *dev)
@@ -496,7 +571,13 @@
 		host->host_caps |= MMC_MODE_HS200;
 	else if (dev_read_bool(dev, "mmc-hs400-1_8v"))
 		host->host_caps |= MMC_MODE_HS400;
+
+	if (data->set_enhanced_strobe && dev_read_bool(dev, "mmc-hs400-enhanced-strobe"))
+		host->host_caps |= MMC_MODE_HS400ES;
+
 	ret = sdhci_setup_cfg(&plat->cfg, host, 0, EMMC_MIN_FREQ);
+
+	plat->cfg.fixed_drv_type = dev_read_u32_default(dev, "fixed-emmc-driver-type", 0);
 
 	host->mmc = &plat->mmc;
 	if (ret)
@@ -536,13 +617,50 @@
 	.emmc_set_clock = dwcmshc_sdhci_emmc_set_clock,
 	.get_phy = dwcmshc_emmc_get_phy,
 	.flags = RK_RXCLK_NO_INVERTER,
+	.hs200_tx_tap = 16,
+	.hs400_tx_tap = 8,
+	.hs400_cmd_tap = 8,
+	.hs400_strbin_tap = 3,
+	.ddr50_strbin_delay_num = 16,
 };
 
 static const struct sdhci_data rk3588_data = {
 	.emmc_set_clock = dwcmshc_sdhci_emmc_set_clock,
 	.get_phy = dwcmshc_emmc_get_phy,
 	.set_ios_post = dwcmshc_sdhci_set_ios_post,
-	.flags = RK_DLL_CMD_OUT | RK_RXCLK_NO_INVERTER,
+	.set_enhanced_strobe = dwcmshc_sdhci_set_enhanced_strobe,
+	.flags = RK_DLL_CMD_OUT,
+	.hs200_tx_tap = 16,
+	.hs400_tx_tap = 9,
+	.hs400_cmd_tap = 8,
+	.hs400_strbin_tap = 3,
+	.ddr50_strbin_delay_num = 16,
+};
+
+static const struct sdhci_data rk3528_data = {
+	.emmc_set_clock = dwcmshc_sdhci_emmc_set_clock,
+	.get_phy = dwcmshc_emmc_get_phy,
+	.set_ios_post = dwcmshc_sdhci_set_ios_post,
+	.set_enhanced_strobe = dwcmshc_sdhci_set_enhanced_strobe,
+	.flags = RK_DLL_CMD_OUT | RK_TAP_VALUE_SEL,
+	.hs200_tx_tap = 12,
+	.hs400_tx_tap = 6,
+	.hs400_cmd_tap = 6,
+	.hs400_strbin_tap = 3,
+	.ddr50_strbin_delay_num = 10,
+};
+
+static const struct sdhci_data rk3562_data = {
+	.emmc_set_clock = dwcmshc_sdhci_emmc_set_clock,
+	.get_phy = dwcmshc_emmc_get_phy,
+	.set_ios_post = dwcmshc_sdhci_set_ios_post,
+	.set_enhanced_strobe = dwcmshc_sdhci_set_enhanced_strobe,
+	.flags = RK_DLL_CMD_OUT | RK_TAP_VALUE_SEL,
+	.hs200_tx_tap = 12,
+	.hs400_tx_tap = 6,
+	.hs400_cmd_tap = 6,
+	.hs400_strbin_tap = 3,
+	.ddr50_strbin_delay_num = 10,
 };
 
 static const struct udevice_id sdhci_ids[] = {
@@ -555,6 +673,14 @@
 		.data = (ulong)&rk3568_data,
 	},
 	{
+		.compatible = "rockchip,rk3528-dwcmshc",
+		.data = (ulong)&rk3528_data,
+	},
+	{
+		.compatible = "rockchip,rk3562-dwcmshc",
+		.data = (ulong)&rk3562_data,
+	},
+	{
 		.compatible = "rockchip,rk3588-dwcmshc",
 		.data = (ulong)&rk3588_data,
 	},
diff --git a/u-boot/drivers/mmc/sdhci.c b/u-boot/drivers/mmc/sdhci.c
index 8c2a9a6..a02baa5 100644
--- a/u-boot/drivers/mmc/sdhci.c
+++ b/u-boot/drivers/mmc/sdhci.c
@@ -178,6 +178,7 @@
 			} else {
 				puts("timeout.\n");
 				/* remove timeout return error and try to send command */
+				break;
 			}
 		}
 		time++;
@@ -313,6 +314,29 @@
 		return -ECOMM;
 }
 
+void sdhci_enable_clk(struct sdhci_host *host, u16 clk)
+{
+	unsigned int timeout;
+
+	clk |= SDHCI_CLOCK_INT_EN;
+	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
+
+	/* Wait max 20 ms */
+	timeout = 20;
+	while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
+		& SDHCI_CLOCK_INT_STABLE)) {
+		if (timeout == 0) {
+			printf("%s: Internal clock never stabilised.\n",
+			       __func__);
+			return;
+		}
+		timeout--;
+		udelay(1000);
+	}
+	clk |= SDHCI_CLOCK_CARD_EN;
+	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
+}
+
 int sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
 {
 	unsigned int div, clk = 0, timeout;
@@ -379,23 +403,8 @@
 	clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
 	clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN)
 		<< SDHCI_DIVIDER_HI_SHIFT;
-	clk |= SDHCI_CLOCK_INT_EN;
-	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
 
-	/* Wait max 20 ms */
-	timeout = 20;
-	while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
-		& SDHCI_CLOCK_INT_STABLE)) {
-		if (timeout == 0) {
-			printf("%s: Internal clock never stabilised.\n",
-			       __func__);
-			return -EBUSY;
-		}
-		timeout--;
-		udelay(1000);
-	}
-	clk |= SDHCI_CLOCK_CARD_EN;
-	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
+	sdhci_enable_clk(host, clk);
 
 	host->clock = clock;
 	return 0;
@@ -681,11 +690,23 @@
 	return sdhci_init(mmc);
 }
 
+static int sdhci_set_enhanced_strobe(struct udevice *dev)
+{
+	struct mmc *mmc = mmc_get_mmc_dev(dev);
+	struct sdhci_host *host = mmc->priv;
+
+	if (host->ops && host->ops->set_enhanced_strobe)
+		return host->ops->set_enhanced_strobe(host);
+
+	return -ENOTSUPP;
+}
+
 const struct dm_mmc_ops sdhci_ops = {
 	.card_busy	= sdhci_card_busy,
 	.send_cmd	= sdhci_send_command,
 	.set_ios	= sdhci_set_ios,
 	.execute_tuning = sdhci_execute_tuning,
+	.set_enhanced_strobe = sdhci_set_enhanced_strobe,
 };
 #else
 static const struct mmc_ops sdhci_ops = {
diff --git a/u-boot/drivers/mtd/mtd_blk.c b/u-boot/drivers/mtd/mtd_blk.c
index a8226d7..1ac6f81 100644
--- a/u-boot/drivers/mtd/mtd_blk.c
+++ b/u-boot/drivers/mtd/mtd_blk.c
@@ -22,9 +22,6 @@
 #endif
 
 #define MTD_PART_NAND_HEAD		"mtdparts="
-#define MTD_ROOT_PART_NUM		"ubi.mtd="
-#define MTD_ROOT_PART_NAME_UBIFS	"root=ubi0:rootfs"
-#define MTD_ROOT_PART_NAME_SQUASHFS	"root=/dev/ubiblock0_0"
 #define MTD_PART_INFO_MAX_SIZE		512
 #define MTD_SINGLE_PART_INFO_MAX_SIZE	40
 
@@ -371,20 +368,7 @@
 	mtd = (struct mtd_info *)dev_desc->bdev->priv;
 	if (!mtd)
 		return NULL;
-#ifndef CONFIG_SPL_BUILD
-	char mtd_root_part_info[40] = {0};
 
-	p = part_get_info_by_name(dev_desc, PART_SYSTEM, &info);
-	if (p > 0) {
-		if (strstr(env_get("bootargs"), "rootfstype=squashfs"))
-			snprintf(mtd_root_part_info, ARRAY_SIZE(mtd_root_part_info), "%s%d %s",
-				 MTD_ROOT_PART_NUM, p - 1, MTD_ROOT_PART_NAME_SQUASHFS);
-		else
-			snprintf(mtd_root_part_info, ARRAY_SIZE(mtd_root_part_info), "%s%d %s",
-				 MTD_ROOT_PART_NUM, p - 1, MTD_ROOT_PART_NAME_UBIFS);
-		env_update("bootargs", mtd_root_part_info);
-	}
-#endif
 	mtd_part_info = (char *)calloc(MTD_PART_INFO_MAX_SIZE, sizeof(char));
 	if (!mtd_part_info) {
 		printf("%s: Fail to malloc!", __func__);
diff --git a/u-boot/drivers/mtd/nand/spi/Kconfig b/u-boot/drivers/mtd/nand/spi/Kconfig
index e599bb2..b6a4f99 100644
--- a/u-boot/drivers/mtd/nand/spi/Kconfig
+++ b/u-boot/drivers/mtd/nand/spi/Kconfig
@@ -52,6 +52,12 @@
 	help
 	  Add support for various ESMT SPI Nand flash chips
 
+config SPI_NAND_XINCUN
+	bool "XINCUN SPI flash support"
+	default y
+	help
+	  Add support for various XINCUN SPI Nand flash chips
+
 config SPI_NAND_XTX
 	bool "XTX SPI flash support"
 	default y
@@ -112,4 +118,10 @@
 	bool "SKYHIGH SPI flash support"
 	help
 	  Add support for various SKYHIGH SPI Nand flash chips
+
+config SPI_NAND_GSTO
+	default y
+	bool "GSTO SPI flash support"
+	help
+	  Add support for various GSTO SPI Nand flash chips
 endif
diff --git a/u-boot/drivers/mtd/nand/spi/Makefile b/u-boot/drivers/mtd/nand/spi/Makefile
index eaa587d..d60139d 100644
--- a/u-boot/drivers/mtd/nand/spi/Makefile
+++ b/u-boot/drivers/mtd/nand/spi/Makefile
@@ -8,6 +8,7 @@
 obj-$(CONFIG_SPI_NAND_WINBOND) += winbond.o
 obj-$(CONFIG_SPI_NAND_DOSILICON) += dosilicon.o
 obj-$(CONFIG_SPI_NAND_ESMT) += esmt.o
+obj-$(CONFIG_SPI_NAND_XINCUN) += xincun.o
 obj-$(CONFIG_SPI_NAND_XTX) += xtx.o
 obj-$(CONFIG_SPI_NAND_HYF) += hyf.o
 obj-$(CONFIG_SPI_NAND_FMSH) += fmsh.o
@@ -18,4 +19,5 @@
 obj-$(CONFIG_SPI_NAND_SILICONGO) += silicongo.o
 obj-$(CONFIG_SPI_NAND_UNIM) += unim.o
 obj-$(CONFIG_SPI_NAND_SKYHIGH) += skyhigh.o
+obj-$(CONFIG_SPI_NAND_GSTO) += gsto.o
 obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
diff --git a/u-boot/drivers/mtd/nand/spi/core.c b/u-boot/drivers/mtd/nand/spi/core.c
index f83698f..4dae186 100644
--- a/u-boot/drivers/mtd/nand/spi/core.c
+++ b/u-boot/drivers/mtd/nand/spi/core.c
@@ -510,7 +510,7 @@
 			     const struct nand_page_io_req *req,
 			     bool ecc_enabled)
 {
-	u8 status;
+	u8 status = 0;
 	int ret;
 
 	ret = spinand_load_page_op(spinand, req);
@@ -518,6 +518,12 @@
 		return ret;
 
 	ret = spinand_wait(spinand, &status);
+	/*
+	 * When there is data outside of OIP in the status, the status data is
+	 * inaccurate and needs to be reconfirmed
+	 */
+	if (spinand->id.data[0] == 0x01 && status && !ret)
+		ret = spinand_wait(spinand, &status);
 	if (ret < 0)
 		return ret;
 
@@ -837,6 +843,9 @@
 #ifdef CONFIG_SPI_NAND_ESMT
 	&esmt_spinand_manufacturer,
 #endif
+#ifdef CONFIG_SPI_NAND_XINCUN
+	&xincun_spinand_manufacturer,
+#endif
 #ifdef CONFIG_SPI_NAND_XTX
 	&xtx_spinand_manufacturer,
 #endif
@@ -867,6 +876,9 @@
 #ifdef CONFIG_SPI_NAND_SKYHIGH
 	&skyhigh_spinand_manufacturer,
 #endif
+#ifdef CONFIG_SPI_NAND_GSTO
+	&gsto_spinand_manufacturer,
+#endif
 };
 
 static int spinand_manufacturer_match(struct spinand_device *spinand,
diff --git a/u-boot/drivers/mtd/nand/spi/dosilicon.c b/u-boot/drivers/mtd/nand/spi/dosilicon.c
index fc87add..8a82134 100644
--- a/u-boot/drivers/mtd/nand/spi/dosilicon.c
+++ b/u-boot/drivers/mtd/nand/spi/dosilicon.c
@@ -14,7 +14,7 @@
 
 #define SPINAND_MFR_DOSILICON			0xE5
 
-#define DOSICON_STATUS_ECC_MASK			GENMASK(7, 4)
+#define DOSICON_STATUS_ECC_MASK			GENMASK(6, 4)
 #define DOSICON_STATUS_ECC_NO_BITFLIPS		(0 << 4)
 #define DOSICON_STATUS_ECC_1TO3_BITFLIPS	(1 << 4)
 #define DOSICON_STATUS_ECC_4TO6_BITFLIPS	(3 << 4)
@@ -198,6 +198,26 @@
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&ds35xxgb_ooblayout,
 				     ds35xxgb_ecc_get_status)),
+	SPINAND_INFO("DS35Q12B",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xF5),
+		     NAND_MEMORG(1, 2048, 128, 64, 512, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&ds35xxgb_ooblayout,
+				     ds35xxgb_ecc_get_status)),
+	SPINAND_INFO("DS35M12B",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA5),
+		     NAND_MEMORG(1, 2048, 128, 64, 512, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&ds35xxgb_ooblayout,
+				     ds35xxgb_ecc_get_status)),
 };
 
 static const struct spinand_manufacturer_ops dosilicon_spinand_manuf_ops = {
diff --git a/u-boot/drivers/mtd/nand/spi/fmsh.c b/u-boot/drivers/mtd/nand/spi/fmsh.c
index c65ff64..340edf0 100644
--- a/u-boot/drivers/mtd/nand/spi/fmsh.c
+++ b/u-boot/drivers/mtd/nand/spi/fmsh.c
@@ -82,6 +82,31 @@
 	.rfree = fm25s01_ooblayout_free,
 };
 
+/*
+ * ecc bits: 0xC0[4,6]
+ * [0b000], No bit errors were detected;
+ * [0b001] and [0b011], 1~6 Bit errors were detected and corrected. Not
+ *	reach Flipping Bits;
+ * [0b101], Bit error count equals the bit flip
+ *	detection threshold
+ * [0b010], Multiple bit errors were detected and
+ *	not corrected.
+ * others, Reserved.
+ */
+static int fm25s01bi3_ecc_ecc_get_status(struct spinand_device *spinand,
+					u8 status)
+{
+	struct nand_device *nand = spinand_to_nand(spinand);
+	u8 eccsr = (status & GENMASK(6, 4)) >> 4;
+
+	if (eccsr <= 1 || eccsr == 3)
+		return eccsr;
+	else if (eccsr == 5)
+		return nand->eccreq.strength;
+	else
+		return -EBADMSG;
+}
+
 static const struct spinand_info fmsh_spinand_table[] = {
 	SPINAND_INFO("FM25S01A",
 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xE4),
@@ -99,11 +124,11 @@
 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
 					      &write_cache_variants,
 					      &update_cache_variants),
-		     1,
+		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&fm25s01a_ooblayout, NULL)),
 	SPINAND_INFO("FM25S01",
 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA1),
-		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
 		     NAND_ECCREQ(1, 512),
 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
 					      &write_cache_variants,
@@ -112,13 +137,22 @@
 		     SPINAND_ECCINFO(&fm25s01_ooblayout, NULL)),
 	SPINAND_INFO("FM25LS01",
 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA5),
-		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
 		     NAND_ECCREQ(1, 512),
 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
 					      &write_cache_variants,
 					      &update_cache_variants),
 		     0,
 		     SPINAND_ECCINFO(&fm25s01_ooblayout, NULL)),
+	SPINAND_INFO("FM25S01BI3",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xD4),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&fm25s01_ooblayout, fm25s01bi3_ecc_ecc_get_status)),
 };
 
 static const struct spinand_manufacturer_ops fmsh_spinand_manuf_ops = {
diff --git a/u-boot/drivers/mtd/nand/spi/foresee.c b/u-boot/drivers/mtd/nand/spi/foresee.c
index a67931f..5b3286e 100644
--- a/u-boot/drivers/mtd/nand/spi/foresee.c
+++ b/u-boot/drivers/mtd/nand/spi/foresee.c
@@ -28,7 +28,7 @@
 
 static SPINAND_OP_VARIANTS(update_cache_variants,
 		SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
-		SPINAND_PROG_LOAD(false, 0, NULL, 0));
+		SPINAND_PROG_LOAD(true, 0, NULL, 0));
 
 static int fsxxndxxg_ooblayout_ecc(struct mtd_info *mtd, int section,
 				   struct mtd_oob_region *region)
@@ -117,6 +117,24 @@
 					      &update_cache_variants),
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&fsxxndxxg_ooblayout, NULL)),
+	SPINAND_INFO("F35UQA002G-WWT",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x62),
+		     NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(1, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&fsxxndxxg_ooblayout, NULL)),
+	SPINAND_INFO("F35UQA001G-WWT",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x61),
+		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
+		     NAND_ECCREQ(1, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&fsxxndxxg_ooblayout, NULL)),
 };
 
 static const struct spinand_manufacturer_ops foresee_spinand_manuf_ops = {
diff --git a/u-boot/drivers/mtd/nand/spi/gigadevice.c b/u-boot/drivers/mtd/nand/spi/gigadevice.c
index 704ad55..ba67f1d 100644
--- a/u-boot/drivers/mtd/nand/spi/gigadevice.c
+++ b/u-boot/drivers/mtd/nand/spi/gigadevice.c
@@ -43,6 +43,22 @@
 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0),
 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0));
 
+static SPINAND_OP_VARIANTS(read_cache_variants_1gq5,
+		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
+
+static SPINAND_OP_VARIANTS(read_cache_variants_2gq5,
+		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
+
 static SPINAND_OP_VARIANTS(write_cache_variants,
 		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
 		SPINAND_PROG_LOAD(true, 0, NULL, 0));
@@ -353,6 +369,36 @@
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
 				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F1GQ4RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc1),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F2GQ4UExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F2GQ4RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc2),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq4uexxg_ecc_get_status)),
 	SPINAND_INFO("GD5F1GQ4UFxxG",
 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb1, 0x48),
 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
@@ -373,36 +419,116 @@
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
 				     gd5fxgq5xexxg_ecc_get_status)),
-	SPINAND_INFO("GD5F2GQ5UExxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x52),
-		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+	SPINAND_INFO("GD5F1GQ5RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x41),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
 		     NAND_ECCREQ(4, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
 					      &write_cache_variants,
 					      &update_cache_variants),
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
 				     gd5fxgq5xexxg_ecc_get_status)),
-	SPINAND_INFO("GD5F2GQ4UBxxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2),
+	SPINAND_INFO("GD5F2GQ5UExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x52),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq5xexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F2GQ5RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x42),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq5xexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F4GQ6UExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x55),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 2, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq5xexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F4GQ6RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x45),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 2, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq5xexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F1GM7UExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F1GM7RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F2GM7UExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92),
 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
 		     NAND_ECCREQ(8, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
 					      &write_cache_variants,
 					      &update_cache_variants),
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
-				     gd5fxgq4xa_ecc_get_status)),
-	SPINAND_INFO("GD5F4GQ6UExxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x55),
+				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F2GM7RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x82),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F4GM8UExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x95),
 		     NAND_MEMORG(1, 2048, 128, 64, 4096, 1, 1, 1),
-		     NAND_ECCREQ(4, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
 					      &write_cache_variants,
 					      &update_cache_variants),
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
-				     gd5fxgq5xexxg_ecc_get_status)),
+				     gd5fxgq4uexxg_ecc_get_status)),
+	SPINAND_INFO("GD5F4GM8RExxG",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85),
+		     NAND_MEMORG(1, 2048, 128, 64, 4096, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+				     gd5fxgq4uexxg_ecc_get_status)),
 	SPINAND_INFO("GD5F1GQ4UExxH",
 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd9),
 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
@@ -412,56 +538,6 @@
 					      &update_cache_variants),
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&gd5fxgqx_variant3_ooblayout,
-				     gd5fxgq4xa_ecc_get_status)),
-	SPINAND_INFO("GD5F1GQ5RExxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x41),
-		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-		     NAND_ECCREQ(4, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-					      &write_cache_variants,
-					      &update_cache_variants),
-		     SPINAND_HAS_QE_BIT,
-		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
-				     gd5fxgq5xexxg_ecc_get_status)),
-	SPINAND_INFO("GD5F2GQ5RExxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x42),
-		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
-		     NAND_ECCREQ(4, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-					      &write_cache_variants,
-					      &update_cache_variants),
-		     SPINAND_HAS_QE_BIT,
-		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
-				     gd5fxgq5xexxg_ecc_get_status)),
-	SPINAND_INFO("GD5F2GM7RxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x82),
-		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
-		     NAND_ECCREQ(8, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-					      &write_cache_variants,
-					      &update_cache_variants),
-		     SPINAND_HAS_QE_BIT,
-		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
-				     gd5fxgq4xa_ecc_get_status)),
-	SPINAND_INFO("GD5F1GM7UxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x91),
-		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-		     NAND_ECCREQ(8, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-					      &write_cache_variants,
-					      &update_cache_variants),
-		     SPINAND_HAS_QE_BIT,
-		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
-				     gd5fxgq4xa_ecc_get_status)),
-	SPINAND_INFO("GD5F2GM7UxG",
-		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x92),
-		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
-		     NAND_ECCREQ(8, 512),
-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-					      &write_cache_variants,
-					      &update_cache_variants),
-		     SPINAND_HAS_QE_BIT,
-		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
 				     gd5fxgq4xa_ecc_get_status)),
 };
 
diff --git a/u-boot/drivers/mtd/nand/spi/gsto.c b/u-boot/drivers/mtd/nand/spi/gsto.c
new file mode 100644
index 0000000..a197c6c
--- /dev/null
+++ b/u-boot/drivers/mtd/nand/spi/gsto.c
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2023 Rockchip Electronics Co., Ltd
+ *
+ * Authors:
+ *	Dingqiang Lin <jon.lin@rock-chips.com>
+ */
+
+#ifndef __UBOOT__
+#include <linux/device.h>
+#include <linux/kernel.h>
+#endif
+#include <linux/mtd/spinand.h>
+
+#define SPINAND_MFR_GSTO		0x52
+
+static SPINAND_OP_VARIANTS(read_cache_variants,
+		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
+
+static SPINAND_OP_VARIANTS(write_cache_variants,
+		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+		SPINAND_PROG_LOAD(true, 0, NULL, 0));
+
+static SPINAND_OP_VARIANTS(update_cache_variants,
+		SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
+		SPINAND_PROG_LOAD(false, 0, NULL, 0));
+
+static int gss0xgsak1_ooblayout_ecc(struct mtd_info *mtd, int section,
+				 struct mtd_oob_region *region)
+{
+	if (section)
+		return -ERANGE;
+
+	region->offset = 32;
+	region->length = 32;
+
+	return 0;
+}
+
+static int gss0xgsak1_ooblayout_free(struct mtd_info *mtd, int section,
+				  struct mtd_oob_region *region)
+{
+	if (section)
+		return -ERANGE;
+
+	region->offset = 2;
+	region->length = 30;
+
+	return 0;
+}
+
+static const struct mtd_ooblayout_ops gss0xgsak1_ooblayout = {
+	.ecc = gss0xgsak1_ooblayout_ecc,
+	.rfree = gss0xgsak1_ooblayout_free,
+};
+
+static const struct spinand_info gsto_spinand_table[] = {
+	SPINAND_INFO("GSS01GSAK1",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xBA, 0x13),
+		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     0,
+		     SPINAND_ECCINFO(&gss0xgsak1_ooblayout, NULL)),
+	SPINAND_INFO("GSS02GSAK1",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xBA, 0x23),
+		     NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     0,
+		     SPINAND_ECCINFO(&gss0xgsak1_ooblayout, NULL)),
+};
+
+static const struct spinand_manufacturer_ops gsto_spinand_manuf_ops = {
+};
+
+const struct spinand_manufacturer gsto_spinand_manufacturer = {
+	.id = SPINAND_MFR_GSTO,
+	.name = "GSTO",
+	.chips = gsto_spinand_table,
+	.nchips = ARRAY_SIZE(gsto_spinand_table),
+	.ops = &gsto_spinand_manuf_ops,
+};
diff --git a/u-boot/drivers/mtd/nand/spi/hyf.c b/u-boot/drivers/mtd/nand/spi/hyf.c
index 1c95298..3a60296 100644
--- a/u-boot/drivers/mtd/nand/spi/hyf.c
+++ b/u-boot/drivers/mtd/nand/spi/hyf.c
@@ -106,7 +106,7 @@
 	if (section > 3)
 		return -ERANGE;
 
-	region->offset = 16 * section;
+	region->offset = 32 * section;
 	region->length = 8;
 
 	return 0;
@@ -199,6 +199,26 @@
 		     SPINAND_HAS_QE_BIT,
 		     SPINAND_ECCINFO(&hyf2gq4uaacae_ooblayout,
 				     hyf1gq4udacae_ecc_get_status)),
+	SPINAND_INFO("HYF2GQ4IAACAE",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x82),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(14, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&hyf2gq4uaacae_ooblayout,
+				     hyf1gq4udacae_ecc_get_status)),
+	SPINAND_INFO("HYF1GQ4IDACAE",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x81),
+		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&hyf1gq4udacae_ooblayout,
+				     hyf1gq4udacae_ecc_get_status)),
 };
 
 static const struct spinand_manufacturer_ops hyf_spinand_manuf_ops = {
diff --git a/u-boot/drivers/mtd/nand/spi/jsc.c b/u-boot/drivers/mtd/nand/spi/jsc.c
index d0e3b24..d3f7e56 100644
--- a/u-boot/drivers/mtd/nand/spi/jsc.c
+++ b/u-boot/drivers/mtd/nand/spi/jsc.c
@@ -72,12 +72,13 @@
 static int js28u1gqscahg_ecc_get_status(struct spinand_device *spinand,
 					u8 status)
 {
-	u8 eccsr = (status & GENMASK(6, 4)) >> 2;
+	struct nand_device *nand = spinand_to_nand(spinand);
+	u8 eccsr = (status & GENMASK(6, 4)) >> 4;
 
-	if (eccsr <= 7)
+	if (eccsr < 4)
 		return eccsr;
-	else if (eccsr == 12)
-		return 8;
+	else if (eccsr == 4)
+		return nand->eccreq.strength;
 	else
 		return -EBADMSG;
 }
diff --git a/u-boot/drivers/mtd/nand/spi/skyhigh.c b/u-boot/drivers/mtd/nand/spi/skyhigh.c
index 252382e..7cf58c6 100644
--- a/u-boot/drivers/mtd/nand/spi/skyhigh.c
+++ b/u-boot/drivers/mtd/nand/spi/skyhigh.c
@@ -14,6 +14,10 @@
 
 #define SPINAND_MFR_SKYHIGH		0x01
 
+#define SKYHIGH_STATUS_ECC_1_2_BITFLIPS	(1 << 4)
+#define SKYHIGH_STATUS_ECC_3_4_BITFLIPS	(2 << 4)
+#define SKYHIGH_STATUS_ECC_UNCOR_ERROR	(3 << 4)
+
 static SPINAND_OP_VARIANTS(read_cache_variants,
 		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
 		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
@@ -27,8 +31,8 @@
 		SPINAND_PROG_LOAD(true, 0, NULL, 0));
 
 static SPINAND_OP_VARIANTS(update_cache_variants,
-		SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
-		SPINAND_PROG_LOAD(false, 0, NULL, 0));
+		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+		SPINAND_PROG_LOAD(true, 0, NULL, 0));
 
 static int s35ml04g3_ooblayout_ecc(struct mtd_info *mtd, int section,
 				   struct mtd_oob_region *region)
@@ -53,7 +57,48 @@
 	.rfree = s35ml04g3_ooblayout_free,
 };
 
+
+static int s35ml0xg3_ecc_get_status(struct spinand_device *spinand,
+				   u8 status)
+{
+	struct nand_device *nand = spinand_to_nand(spinand);
+
+	switch (status & STATUS_ECC_MASK) {
+	case STATUS_ECC_NO_BITFLIPS:
+		return 0;
+
+	case SKYHIGH_STATUS_ECC_UNCOR_ERROR:
+		return -EBADMSG;
+
+	case SKYHIGH_STATUS_ECC_1_2_BITFLIPS:
+		return 2;
+
+	default:
+		return nand->eccreq.strength;
+	}
+
+	return -EINVAL;
+}
+
 static const struct spinand_info skyhigh_spinand_table[] = {
+	SPINAND_INFO("S35ML01G3",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x15),
+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 2, 1, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&s35ml04g3_ooblayout, s35ml0xg3_ecc_get_status)),
+	SPINAND_INFO("S35ML02G3",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x25),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 2, 1, 1),
+		     NAND_ECCREQ(4, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&s35ml04g3_ooblayout, s35ml0xg3_ecc_get_status)),
 	SPINAND_INFO("S35ML04G3",
 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35),
 		     NAND_MEMORG(1, 2048, 128, 64, 4096, 2, 1, 1),
@@ -62,7 +107,7 @@
 					      &write_cache_variants,
 					      &update_cache_variants),
 		     SPINAND_HAS_QE_BIT,
-		     SPINAND_ECCINFO(&s35ml04g3_ooblayout, NULL)),
+		     SPINAND_ECCINFO(&s35ml04g3_ooblayout, s35ml0xg3_ecc_get_status)),
 };
 
 static const struct spinand_manufacturer_ops skyhigh_spinand_manuf_ops = {
diff --git a/u-boot/drivers/mtd/nand/spi/unim.c b/u-boot/drivers/mtd/nand/spi/unim.c
index 8dd0b9b..b4e3e5b 100644
--- a/u-boot/drivers/mtd/nand/spi/unim.c
+++ b/u-boot/drivers/mtd/nand/spi/unim.c
@@ -71,12 +71,13 @@
 static int tx25g01_ecc_get_status(struct spinand_device *spinand,
 				  u8 status)
 {
-	u8 eccsr = (status & GENMASK(6, 4)) >> 2;
+	struct nand_device *nand = spinand_to_nand(spinand);
+	u8 eccsr = (status & GENMASK(6, 4)) >> 4;
 
-	if (eccsr <= 7)
+	if (eccsr < 4)
 		return eccsr;
-	else if (eccsr == 12)
-		return 8;
+	else if (eccsr == 4)
+		return nand->eccreq.strength;
 	else
 		return -EBADMSG;
 }
diff --git a/u-boot/drivers/mtd/nand/spi/xincun.c b/u-boot/drivers/mtd/nand/spi/xincun.c
new file mode 100644
index 0000000..dc6334d
--- /dev/null
+++ b/u-boot/drivers/mtd/nand/spi/xincun.c
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ *
+ * Authors:
+ *	Dingqiang Lin <jon.lin@rock-chips.com>
+ */
+
+#ifndef __UBOOT__
+#include <linux/device.h>
+#include <linux/kernel.h>
+#endif
+#include <linux/mtd/spinand.h>
+
+#define SPINAND_MFR_XINCUN		0x8C
+#define XINCUN_STATUS_ECC_HAS_BITFLIPS_T	(3 << 4)
+
+static SPINAND_OP_VARIANTS(read_cache_variants,
+		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
+
+static SPINAND_OP_VARIANTS(write_cache_variants,
+		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+		SPINAND_PROG_LOAD(true, 0, NULL, 0));
+
+static SPINAND_OP_VARIANTS(update_cache_variants,
+		SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
+		SPINAND_PROG_LOAD(false, 0, NULL, 0));
+
+static int xcsp2aapk_ooblayout_ecc(struct mtd_info *mtd, int section,
+				   struct mtd_oob_region *region)
+{
+	if (section)
+		return -ERANGE;
+
+	region->offset = mtd->oobsize / 2;
+	region->length = mtd->oobsize / 2;
+
+	return 0;
+}
+
+static int xcsp2aapk_ooblayout_free(struct mtd_info *mtd, int section,
+				    struct mtd_oob_region *region)
+{
+	if (section)
+		return -ERANGE;
+
+	/* Reserve 2 bytes for the BBM. */
+	region->offset = 2;
+	region->length = mtd->oobsize / 2 - 2;
+
+	return 0;
+}
+
+static const struct mtd_ooblayout_ops xcsp2aapk_ooblayout = {
+	.ecc = xcsp2aapk_ooblayout_ecc,
+	.rfree = xcsp2aapk_ooblayout_free,
+};
+
+static int xcsp2aapk_ecc_get_status(struct spinand_device *spinand,
+				    u8 status)
+{
+	struct nand_device *nand = spinand_to_nand(spinand);
+
+	switch (status & STATUS_ECC_MASK) {
+	case STATUS_ECC_NO_BITFLIPS:
+		return 0;
+
+	case STATUS_ECC_UNCOR_ERROR:
+		return -EBADMSG;
+
+	case STATUS_ECC_HAS_BITFLIPS:
+		return 0;
+	case XINCUN_STATUS_ECC_HAS_BITFLIPS_T:
+		return nand->eccreq.strength;
+	default:
+		break;
+	}
+
+	return -EINVAL;
+}
+
+static const struct spinand_info xincun_spinand_table[] = {
+	SPINAND_INFO("XCSP2AAPK",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xA1),
+		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     SPINAND_HAS_QE_BIT,
+		     SPINAND_ECCINFO(&xcsp2aapk_ooblayout, xcsp2aapk_ecc_get_status)),
+};
+
+static const struct spinand_manufacturer_ops xincun_spinand_manuf_ops = {
+};
+
+const struct spinand_manufacturer xincun_spinand_manufacturer = {
+	.id = SPINAND_MFR_XINCUN,
+	.name = "XINCUN",
+	.chips = xincun_spinand_table,
+	.nchips = ARRAY_SIZE(xincun_spinand_table),
+	.ops = &xincun_spinand_manuf_ops,
+};
diff --git a/u-boot/drivers/mtd/spi/sf_internal.h b/u-boot/drivers/mtd/spi/sf_internal.h
index 19b5c7d..7de3035 100644
--- a/u-boot/drivers/mtd/spi/sf_internal.h
+++ b/u-boot/drivers/mtd/spi/sf_internal.h
@@ -68,6 +68,7 @@
 #define USE_CLSR		BIT(14)	/* use CLSR command */
 #define SPI_NOR_HAS_SST26LOCK	BIT(15)	/* Flash supports lock/unlock via BPR */
 #define SPI_NOR_OCTAL_READ      BIT(16) /* Flash supports Octal Read */
+#define SPI_NOR_OCTAL_DTR_READ BIT(17) /* Flash supports Octal DTR Read */
 };
 
 extern const struct flash_info spi_nor_ids[];
diff --git a/u-boot/drivers/mtd/spi/spi-nor-ids.c b/u-boot/drivers/mtd/spi/spi-nor-ids.c
index 8d1784c..8be74f3 100644
--- a/u-boot/drivers/mtd/spi/spi-nor-ids.c
+++ b/u-boot/drivers/mtd/spi/spi-nor-ids.c
@@ -85,6 +85,9 @@
 	{ INFO("en25qh64",  0x1c7017, 0, 64 * 1024,  128, SECT_4K) },
 	{ INFO("en25qh128",  0x1c7018, 0, 64 * 1024,  256, SECT_4K) },
 	{ INFO("en25s64",    0x1c3817, 0, 64 * 1024,  128, SECT_4K) },
+	{ INFO("en25qh256a", 0x1c7019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("en25qx256a", 0x1c7119, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("en25qx128a", 0x1c7118, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 #endif
 #ifdef CONFIG_SPI_FLASH_GIGADEVICE	/* GIGADEVICE */
 	/* GigaDevice */
@@ -118,28 +121,18 @@
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
 			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
 	},
-	{
-		INFO("gd25lq128", 0xc86018, 0, 64 * 1024, 256,
-			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-			SPI_NOR_HAS_TB)
-	},
-	{	INFO("gd25q256", 0xc84019, 0, 64 * 1024, 512,
-			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-			SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK |
-			SPI_NOR_HAS_TB)
-	},
 	{	INFO("gd25q512", 0xc84020, 0, 64 * 1024, 1024,
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
 			SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK |
 			SPI_NOR_HAS_TB)
 	},
 	{
-		INFO("gd25lq255", 0xc86019, 0, 64 * 1024, 512,
+		INFO("gd25lb512m", 0xc8671a, 0, 64 * 1024, 1024,
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
 			SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK)
 	},
 	{
-		INFO("gd25lb512m", 0xc8671a, 0, 64 * 1024, 1024,
+		INFO("gd55lb01ge", 0xc8671b, 0, 64 * 1024, 2048,
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
 			SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK)
 	},
@@ -148,17 +141,112 @@
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
 			SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK)
 	},
+	{
+		INFO("gd55b01ge", 0xc8471b, 0, 64 * 1024, 2048,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+			SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK)
+	},
+	/* adding these 3V QSPI flash parts */
+	{INFO("gd25b256", 0xc84019, 0, 64 * 1024, 512,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)	},
+	{INFO("gd25b512", 0xc8471A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55b01g", 0xc8471B, 0, 64 * 1024, 2048,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55b02g", 0xc8471C, 0, 64 * 1024, 4096,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd25f64", 0xc84317, 0, 64 * 1024, 128,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)},
+	{INFO("gd25f128", 0xc84318, 0, 64 * 1024, 256,	SECT_4K	|
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)},
+	{INFO("gd25f256", 0xc84319, 0, 64 * 1024, 512,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55f512", 0xc8431A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd25t512", 0xc8461A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55t01g", 0xc8461B, 0, 64 * 1024, 2048,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55t02g",	0xc8461C, 0, 64 * 1024, 4096,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	/* adding these 3V OSPI flash parts */
+	{INFO("gd25x512", 0xc8481A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55x01g", 0xc8481B, 0, 64 * 1024, 2048,	SECT_4K |
+	SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55x02g", 0xc8481C, 0, 64 * 1024, 4096,	SECT_4K |
+	SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)},
+	{
+		INFO("gd25lq128", 0xc86018, 0, 64 * 1024, 256,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+	},
+	{
+		INFO("gd25lq256d", 0xc86019, 0, 64 * 1024, 512,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+	},
+	/* adding these 1.8V QSPI flash parts */
+	{INFO("gd25lb256", 0xc86719, 0, 64 * 1024, 512,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd25lb512", 0xc8671A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55lb01g", 0xc8671B, 0, 64 * 1024, 2048,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55lb02g", 0xc8671C, 0, 64 * 1024, 4096,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd25lf80", 0xc86314, 0, 64 * 1024, 16,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)},
+	{INFO("gd25lf16", 0xc86315, 0, 64 * 1024, 32,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)},
+	{INFO("gd25lf32", 0xc86316, 0, 64 * 1024, 64,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)	},
+	{INFO("gd25lf64", 0xc86317, 0, 64 * 1024, 128,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)	},
+	{INFO("gd25lf128", 0xc86318, 0, 64 * 1024, 256,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)	},
+	{INFO("gd25lf255", 0xc86319, 0, 64 * 1024, 512,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd25lf511", 0xc8631A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd25lt256", 0xc86619, 0, 64 * 1024, 512,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd25lt512", 0xc8661A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55lt01g", 0xc8661B, 0, 64 * 1024, 2048,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55lt02g", 0xc8661C, 0, 64 * 1024, 4096,	SECT_4K |
+	SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)},
+	{
+		INFO("gd25lx256e", 0xc86819, 0, 64 * 1024, 512,
+		     SECT_4K | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)
+	},
+	/* adding these 1.8V OSPI flash parts */
+	{INFO("gd25lx512", 0xc8681A, 0, 64 * 1024, 1024,	SECT_4K |
+	SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55lx01g", 0xc8681B, 0, 64 * 1024, 2048,	SECT_4K |
+	SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)},
+	{INFO("gd55lx02g", 0xc8681C, 0, 64 * 1024, 4096,	SECT_4K |
+	SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)},
 #endif
 #ifdef CONFIG_SPI_FLASH_ISSI		/* ISSI */
 	/* ISSI */
 	{ INFO("is25lq040b", 0x9d4013, 0, 64 * 1024,   8,
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("is25lp008", 0x9d6014, 0, 64 * 1024,  16, SPI_NOR_QUAD_READ) },
+	{ INFO("is25lp016", 0x9d6015, 0, 64 * 1024,  32, SPI_NOR_QUAD_READ) },
 	{ INFO("is25lp032",	0x9d6016, 0, 64 * 1024,  64, 0) },
 	{ INFO("is25lp064",	0x9d6017, 0, 64 * 1024, 128, 0) },
 	{ INFO("is25lp128",  0x9d6018, 0, 64 * 1024, 256,
 			SECT_4K | SPI_NOR_DUAL_READ) },
 	{ INFO("is25lp256",  0x9d6019, 0, 64 * 1024, 512,
 			SECT_4K | SPI_NOR_DUAL_READ) },
+	{ INFO("is25lp512",  0x9d601a, 0, 64 * 1024, 1024,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("is25lp01g",  0x9d601b, 0, 64 * 1024, 2048,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("is25wp008", 0x9d7014, 0, 64 * 1024,  16, SPI_NOR_QUAD_READ) },
+	{ INFO("is25wp016", 0x9d7015, 0, 64 * 1024,  32, SPI_NOR_QUAD_READ) },
 	{ INFO("is25wp032",  0x9d7016, 0, 64 * 1024,  64,
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("is25wp064",  0x9d7017, 0, 64 * 1024, 128,
@@ -168,6 +256,12 @@
 	{ INFO("is25wp256",  0x9d7019, 0, 64 * 1024, 512,
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
 			SPI_NOR_4B_OPCODES) },
+	{ INFO("is25wp512",  0x9d701a, 0, 64 * 1024, 1024,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("is25wp01g",  0x9d701b, 0, 64 * 1024, 2048,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("is25wx256",  0x9d5b19, 0, 128 * 1024, 256,
+			SECT_4K | USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) },
 #endif
 #ifdef CONFIG_SPI_FLASH_MACRONIX	/* MACRONIX */
 	/* Macronix */
@@ -183,17 +277,41 @@
 	{ INFO("mx25u6435f",  0xc22537, 0, 64 * 1024, 128, SECT_4K) },
 	{ INFO("mx25l12805d", 0xc22018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("mx25u12835f", 0xc22538, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("mx25u51245g", 0xc2253a, 0, 64 * 1024, 1024, SECT_4K |
+	       SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 	{ INFO("mx25l12855e", 0xc22618, 0, 64 * 1024, 256, 0) },
 	{ INFO("mx25l25635e", 0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("mx25u25635f", 0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25v8035f",  0xc22314, 0, 64 * 1024,  16, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("mx25r1635f",  0xc22815, 0, 64 * 1024,  32, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("mx25l25655e", 0xc22619, 0, 64 * 1024, 512, 0) },
 	{ INFO("mx66l51235l", 0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 	{ INFO("mx66u51235f", 0xc2253a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25u51245f", 0xc2953a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx66u1g45g",  0xc2253b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 	{ INFO("mx66u2g45g",  0xc2253c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 	{ INFO("mx66l1g45g",  0xc2201b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("mx66l2g45g",  0xc2201c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 	{ INFO("mx25l1633e", 0xc22415, 0, 64 * 1024,   32, SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | SECT_4K) },
 	{ INFO("mx25r6435f", 0xc22817, 0, 64 * 1024,   128,  SECT_4K) },
-	{ INFO("mx66uw2g345g", 0xc2943c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx66uw2g345gx0", 0xc2943c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx66lm1g45g",    0xc2853b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25lm51245g",   0xc2853a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25lw51245g",   0xc2863a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25lm25645g",   0xc28539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx66uw2g345g",   0xc2843c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx66um1g45g",    0xc2803b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx66uw1g45g",    0xc2813b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw51245g",   0xc2813a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw51345g",   0xc2843a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25um25645g",   0xc28039, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw25645g",   0xc28139, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25um25345g",   0xc28339, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw25345g",   0xc28439, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw12845g",   0xc28138, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw12345g",   0xc28438, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw6445g",    0xc28137, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mx25uw6345g",    0xc28437, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) },
 #endif
 
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
@@ -210,7 +328,7 @@
 	{ INFO6("mt25qu256a",  0x20bb19, 0x104400, 64 * 1024,  512, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | USE_FSR) },
 	{ INFO("n25q256ax1",  0x20bb19, 0, 64 * 1024,  512, SECT_4K | SPI_NOR_QUAD_READ | USE_FSR) },
 	{ INFO6("mt25qu512a",  0x20bb20, 0x104400, 64 * 1024, 1024,
-		 SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES |
+		 SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES |
 		 USE_FSR) },
 	{ INFO("n25q512a",    0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
 	{ INFO6("mt25ql512a",  0x20ba20, 0x104400, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
@@ -219,7 +337,12 @@
 	{ INFO("n25q00a",     0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
 	{ INFO("mt25ql01g",   0x21ba20, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
 	{ INFO("mt25qu02g",   0x20bb22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
-	{ INFO("mt35xu512aba", 0x2c5b1a, 0,  128 * 1024,  512, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("mt25ql02g",   0x20ba22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE | SPI_NOR_4B_OPCODES) },
+#ifdef CONFIG_SPI_FLASH_MT35XU
+	{ INFO("mt35xl512aba", 0x2c5a1a, 0,  128 * 1024,  512, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES | SPI_NOR_OCTAL_DTR_READ) },
+	{ INFO("mt35xu512aba", 0x2c5b1a, 0,  128 * 1024,  512, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES | SPI_NOR_OCTAL_DTR_READ) },
+#endif /* CONFIG_SPI_FLASH_MT35XU */
+	{ INFO6("mt35xu01g",  0x2c5b1b, 0x104100, 128 * 1024,  1024, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) },
 	{ INFO("mt35xu02g",  0x2c5b1c, 0, 128 * 1024,  2048, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) },
 #endif
 #ifdef CONFIG_SPI_FLASH_SPANSION	/* SPANSION */
@@ -235,6 +358,7 @@
 	{ INFO("s25fl512s_256k",  0x010220, 0x4d00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
 	{ INFO("s25fl512s_64k",  0x010220, 0x4d01, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
 	{ INFO("s25fl512s_512k", 0x010220, 0x4f00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
+	{ INFO("s70fs01gs_256k", 0x010221, 0x4d00, 256 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("s25sl12800", 0x012018, 0x0300, 256 * 1024,  64, 0) },
 	{ INFO("s25sl12801", 0x012018, 0x0301,  64 * 1024, 256, 0) },
 	{ INFO6("s25fl128s",  0x012018, 0x4d0180, 64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) },
@@ -347,6 +471,31 @@
 			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
 			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
 	},
+	{
+		INFO("w25q512jv", 0xef7119, 0, 64 * 1024, 512,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+	},
+	{
+		INFO("w25q512nwq", 0xef6020, 0, 64 * 1024, 1024,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+	},
+	{
+		INFO("w25q512nwm", 0xef8020, 0, 64 * 1024, 1024,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+	},
+	{
+		INFO("w25q512jvq", 0xef4020, 0, 64 * 1024, 1024,
+		     SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+		     SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+	},
+	{
+		INFO("w25q01jv", 0xef4021, 0, 64 * 1024, 2048,
+			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+	},
 	{ INFO("w25q80", 0xef5014, 0, 64 * 1024,  16, SECT_4K) },
 	{ INFO("w25q80bl", 0xef4014, 0, 64 * 1024,  16, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("w25q16cl", 0xef4015, 0, 64 * 1024,  32, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
@@ -358,6 +507,7 @@
 	{ INFO("w25q256", 0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("w25m512jw", 0xef6119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("w25m512jv", 0xef7119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("w25h02jv", 0xef9022, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 #endif
 #ifdef CONFIG_SPI_FLASH_XMC
 	/* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */
@@ -376,17 +526,23 @@
 	/* XTX Technology (Shenzhen) Limited */
 	{ INFO("xt25f64f", 0x0b4017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("xt25f128b", 0x0b4018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("xt25f256b", 0x0b4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
+	{ INFO("xt25q64d", 0x0b6017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("xt25q128d", 0x0b6018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 #endif
 #ifdef CONFIG_SPI_FLASH_PUYA
 	/* PUYA Semiconductor (Shanghai) Co., Ltd. */
 	{ INFO("P25Q64H", 0x856017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("P25Q128H", 0x856018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("PY25Q64HA", 0x852017, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("PY25Q128HA", 0x852018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("PY25Q256HB", 0x852019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 #endif
 #ifdef CONFIG_SPI_FLASH_FMSH
 	/* FUDAN MICRO (Shanghai) Co., Ltd. */
 	{ INFO("FM25Q128A", 0xA14018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 	{ INFO("FM25Q64", 0xA14017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+	{ INFO("FM25Q256I3", 0xA14019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
 #endif
 #ifdef CONFIG_SPI_FLASH_DOSILICON
 	/* Dosilicon Co., Ltd. */
diff --git a/u-boot/drivers/mtd/ubi/debug.h b/u-boot/drivers/mtd/ubi/debug.h
index 215fca7..c4f0bc5 100644
--- a/u-boot/drivers/mtd/ubi/debug.h
+++ b/u-boot/drivers/mtd/ubi/debug.h
@@ -28,13 +28,8 @@
 	}                                                                    \
 } while (0)
 #else
-#define ubi_assert(expr)  do {                                               \
-	if (unlikely(!(expr))) {                                             \
-		pr_debug("UBI assert failed in %s at %u\n",                  \
-		       __func__, __LINE__);                                  \
-		dump_stack();                                                \
-	}                                                                    \
-} while (0)
+#include <log.h>
+#define ubi_assert(expr) assert(expr)
 #endif
 
 #define ubi_dbg_print_hex_dump(ps, pt, r, g, b, len, a)                      \
diff --git a/u-boot/drivers/net/gmac_rockchip.c b/u-boot/drivers/net/gmac_rockchip.c
index bc8dcc9..dfb8342 100644
--- a/u-boot/drivers/net/gmac_rockchip.c
+++ b/u-boot/drivers/net/gmac_rockchip.c
@@ -18,6 +18,9 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/hardware.h>
 #ifdef CONFIG_DWC_ETH_QOS
+#include <asm/arch/grf_rk3528.h>
+#include <asm/arch/grf_rk3562.h>
+#include <asm/arch/ioc_rk3562.h>
 #include <asm/arch/grf_rk3568.h>
 #include <asm/arch/grf_rk3588.h>
 #include <asm/arch/grf_rv1106.h>
@@ -516,6 +519,147 @@
 	return 0;
 }
 #else
+static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
+				  struct rockchip_eth_dev *dev)
+{
+	struct eqos_priv *priv = &dev->eqos;
+	struct rk3528_grf *grf;
+	unsigned int div;
+
+	enum {
+		RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3,
+		RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3),
+		RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3),
+		RK3528_GMAC0_CLK_RMII_DIV20 = 0,
+	};
+
+	enum {
+		RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10,
+		RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10),
+		RK3528_GMAC1_CLK_RGMII_DIV1 = 0,
+		RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10),
+		RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11),
+		RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11),
+		RK3528_GMAC1_CLK_RMII_DIV20 = 0,
+	};
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	switch (priv->phy->speed) {
+	case 10:
+		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
+			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 :
+					      RK3528_GMAC0_CLK_RMII_DIV20;
+		else
+			div = RK3528_GMAC1_CLK_RGMII_DIV50;
+		break;
+	case 100:
+		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII)
+			div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 :
+					      RK3528_GMAC0_CLK_RMII_DIV2;
+		else
+			div = RK3528_GMAC1_CLK_RGMII_DIV5;
+		break;
+	case 1000:
+		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
+			div = RK3528_GMAC1_CLK_RGMII_DIV1;
+		else
+			return -EINVAL;
+		break;
+	default:
+		debug("Unknown phy speed: %d\n", priv->phy->speed);
+		return -EINVAL;
+	}
+
+	if (pdata->bus_id)
+		rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div);
+	else
+		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div);
+
+	return 0;
+}
+
+static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata,
+				 struct rockchip_eth_dev *dev)
+{
+	struct eqos_priv *priv = &dev->eqos;
+	struct rk3562_grf *grf;
+	unsigned int div;
+
+	enum {
+		RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7,
+		RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7),
+		RK3562_GMAC0_CLK_RGMII_DIV1 = 0,
+		RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7),
+		RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8),
+		RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7),
+		RK3562_GMAC0_CLK_RMII_DIV20 = 0,
+	};
+
+	enum {
+		RK3562_GMAC1_SPEED_SHIFT = 0x0,
+		RK3562_GMAC1_SPEED_MASK  = BIT(0),
+		RK3562_GMAC1_SPEED_10M   = 0,
+		RK3562_GMAC1_SPEED_100M  = BIT(0),
+	};
+
+	enum {
+		RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13,
+		RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13),
+		RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13),
+		RK3562_GMAC1_CLK_RMII_DIV20 = 0,
+	};
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	switch (priv->phy->speed) {
+	case 10:
+		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
+			if (pdata->bus_id > 0) {
+				div = RK3562_GMAC1_CLK_RMII_DIV20;
+				rk_clrsetreg(&grf->soc_con[0],
+					     RK3562_GMAC1_SPEED_MASK,
+					     RK3562_GMAC1_SPEED_10M);
+			} else {
+				div = RK3562_GMAC0_CLK_RMII_DIV20;
+			}
+		} else {
+			div = RK3562_GMAC0_CLK_RGMII_DIV50;
+		}
+		break;
+	case 100:
+		if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) {
+			if (pdata->bus_id > 0) {
+				div = RK3562_GMAC1_CLK_RMII_DIV2;
+				rk_clrsetreg(&grf->soc_con[0],
+					     RK3562_GMAC1_SPEED_MASK,
+					     RK3562_GMAC1_SPEED_100M);
+			} else {
+				div = RK3562_GMAC0_CLK_RMII_DIV2;
+			}
+		} else {
+			div = RK3562_GMAC0_CLK_RGMII_DIV5;
+		}
+		break;
+	case 1000:
+		if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII)
+			div = RK3562_GMAC0_CLK_RGMII_DIV1;
+		else
+			return -EINVAL;
+		break;
+	default:
+		debug("Unknown phy speed: %d\n", priv->phy->speed);
+		return -EINVAL;
+	}
+
+	if (pdata->bus_id)
+		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div);
+	else
+		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div);
+
+	return 0;
+}
+
 static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
 				  struct rockchip_eth_dev *dev)
 {
@@ -1064,6 +1208,251 @@
 }
 
 #else
+static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata)
+{
+	struct rk3528_grf *grf;
+	unsigned char bgs[1] = {0};
+
+	enum {
+		RK3528_MACPHY_ENABLE_MASK = BIT(1),
+		RK3528_MACPHY_DISENABLE = BIT(1),
+		RK3528_MACPHY_ENABLE = 0,
+		RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5),
+		RK3528_MACPHY_XMII_SEL = BIT(6),
+		RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7),
+		RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)),
+		RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10),
+		RK3528_MACPHY_PHY_ID = BIT(11),
+	};
+
+	enum {
+		RK3528_MACPHY_BGS_MASK = GENMASK(3, 0),
+	};
+
+#if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP)
+	struct udevice *dev;
+	u32 regs[2] = {0};
+	ofnode node;
+	int ret = 0;
+
+	/* retrieve the device */
+	if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE))
+		ret = uclass_get_device_by_driver(UCLASS_MISC,
+						  DM_GET_DRIVER(rockchip_efuse),
+						  &dev);
+	else
+		ret = uclass_get_device_by_driver(UCLASS_MISC,
+						  DM_GET_DRIVER(rockchip_otp),
+						  &dev);
+	if (!ret) {
+		node = dev_read_subnode(dev, "macphy-bgs");
+		if (ofnode_valid(node)) {
+			if (!ofnode_read_u32_array(node, "reg", regs, 2)) {
+				/* read the bgs from the efuses */
+				ret = misc_read(dev, regs[0], &bgs, 1);
+				if (ret) {
+					printf("read bgs from efuse/otp failed, ret=%d\n",
+					       ret);
+					bgs[0] = 0;
+				}
+			}
+		}
+	}
+#endif
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	reset_assert(&pdata->phy_reset);
+	udelay(20);
+	rk_clrsetreg(&grf->macphy_con0,
+		     RK3528_MACPHY_ENABLE_MASK |
+		     RK3528_MACPHY_XMII_SEL_MASK |
+		     RK3528_MACPHY_24M_CLK_SEL_MASK |
+		     RK3528_MACPHY_PHY_ID_MASK,
+		     RK3528_MACPHY_ENABLE |
+		     RK3528_MACPHY_XMII_SEL |
+		     RK3528_MACPHY_24M_CLK_SEL_24M |
+		     RK3528_MACPHY_PHY_ID);
+
+	rk_clrsetreg(&grf->macphy_con1,
+		     RK3528_MACPHY_BGS_MASK,
+		     bgs[0]);
+	udelay(20);
+	reset_deassert(&pdata->phy_reset);
+	udelay(30 * 1000);
+}
+
+static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata)
+{
+	unsigned int clk_mode;
+	struct rk3528_grf *grf;
+
+	enum {
+		RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1,
+		RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1),
+		RK3528_GMAC0_CLK_RMII_MODE = 0x1,
+	};
+
+	enum {
+		RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8,
+		RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8),
+		RK3528_GMAC1_CLK_RMII_MODE = 0x1,
+	};
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	if (pdata->bus_id == 1) {
+		clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT;
+		rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode);
+	} else {
+		clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT;
+		rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode);
+	}
+}
+
+static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
+{
+	unsigned int rx_enable;
+	unsigned int rx_delay;
+	struct rk3528_grf *grf;
+
+	enum {
+		RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8,
+		RK3528_GMAC1_RGMII_MODE_MASK = BIT(8),
+		RK3528_GMAC1_RGMII_MODE = 0x0,
+
+		RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14),
+		RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0,
+		RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14),
+
+		RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15),
+		RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0,
+		RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15),
+	};
+
+	enum {
+		RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8,
+		RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8),
+
+		RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0,
+		RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0),
+	};
+
+	if (!pdata->bus_id)
+		return;
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	if (pdata->rx_delay < 0) {
+		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE;
+		rx_delay = 0;
+	} else {
+		rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE;
+		rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT;
+	}
+
+	rk_clrsetreg(&grf->gmac1_con0,
+		     RK3528_GMAC1_TXCLK_DLY_ENA_MASK |
+		     RK3528_GMAC1_RXCLK_DLY_ENA_MASK |
+		     RK3528_GMAC1_RGMII_MODE_MASK,
+		     rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE |
+		     (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT));
+
+	rk_clrsetreg(&grf->gmac1_con1,
+		     RK3528_GMAC1_RX_DL_CFG_MASK |
+		     RK3528_GMAC1_TX_DL_CFG_MASK,
+		     (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) |
+		     rx_delay);
+}
+
+static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata)
+{
+	struct rk3562_grf *grf;
+	unsigned int mode;
+
+	enum {
+		RK3562_GMAC0_RMII_MODE_SHIFT = 0x5,
+		RK3562_GMAC0_RMII_MODE_MASK = BIT(5),
+		RK3562_GMAC0_RMII_MODE = 0x1,
+	};
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	if (!pdata->bus_id) {
+		mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT;
+		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode);
+	}
+}
+
+static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
+{
+	struct rk3562_grf *grf;
+	struct rk3562_ioc *ioc;
+	unsigned int rx_enable;
+	unsigned int rx_delay;
+
+	enum {
+		RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5,
+		RK3562_GMAC0_RGMII_MODE_MASK = BIT(5),
+		RK3562_GMAC0_RGMII_MODE = 0x0,
+
+		RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0),
+		RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0,
+		RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0),
+
+		RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1),
+		RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0,
+		RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1),
+	};
+
+	enum {
+		RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8,
+		RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8),
+
+		RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0,
+		RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0),
+	};
+
+	if (pdata->bus_id)
+		return;
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
+
+	rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK,
+		     RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT);
+
+	if (pdata->rx_delay < 0) {
+		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE;
+		rx_delay = 0;
+	} else {
+		rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE;
+		rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT;
+	}
+
+	rk_clrsetreg(&ioc->mac0_io_con1,
+		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
+		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
+		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
+
+	rk_clrsetreg(&ioc->mac0_io_con0,
+		     RK3562_GMAC0_RX_DL_CFG_MASK |
+		     RK3562_GMAC0_TX_DL_CFG_MASK,
+		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
+		     rx_delay);
+
+	rk_clrsetreg(&ioc->mac1_io_con1,
+		     RK3562_GMAC0_TXCLK_DLY_ENA_MASK |
+		     RK3562_GMAC0_RXCLK_DLY_ENA_MASK,
+		     rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE);
+
+	rk_clrsetreg(&ioc->mac1_io_con0,
+		     RK3562_GMAC0_RX_DL_CFG_MASK |
+		     RK3562_GMAC0_TX_DL_CFG_MASK,
+		     (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) |
+		     rx_delay);
+}
+
 static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata)
 {
 	struct rk3568_grf *grf;
@@ -1438,6 +1827,86 @@
 #endif
 
 #ifdef CONFIG_DWC_ETH_QOS
+static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata)
+{
+	struct rk3528_grf *grf;
+	unsigned int val;
+
+	enum {
+		RK3528_GMAC1_CLK_SELET_SHIFT = 0x12,
+		RK3528_GMAC1_CLK_SELET_MASK = BIT(12),
+		RK3528_GMAC1_CLK_SELET_CRU = 0,
+		RK3528_GMAC1_CLK_SELET_IO = BIT(12),
+	};
+
+	if (!pdata->bus_id)
+		return;
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO :
+				   RK3528_GMAC1_CLK_SELET_CRU;
+	rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val);
+}
+
+static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata)
+{
+	struct rk3562_grf *grf;
+	struct rk3562_ioc *ioc;
+	unsigned int val;
+
+	enum {
+		RK3562_GMAC0_CLK_SELET_SHIFT = 0x9,
+		RK3562_GMAC0_CLK_SELET_MASK = BIT(9),
+		RK3562_GMAC0_CLK_SELET_CRU = 0,
+		RK3562_GMAC0_CLK_SELET_IO = BIT(9),
+	};
+
+	enum {
+		RK3562_GMAC1_CLK_SELET_SHIFT = 15,
+		RK3562_GMAC1_CLK_SELET_MASK = BIT(15),
+		RK3562_GMAC1_CLK_SELET_CRU = 0,
+		RK3562_GMAC1_CLK_SELET_IO = BIT(15),
+	};
+
+	enum {
+		RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2,
+		RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2),
+		RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0,
+		RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2),
+	};
+
+	enum {
+		RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3,
+		RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3),
+		RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0,
+		RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3),
+	};
+
+	grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+	ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC);
+
+	if (!pdata->bus_id) {
+		val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO :
+					   RK3562_GMAC0_CLK_SELET_CRU;
+		rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val);
+		val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO :
+					   RK3562_GMAC0_IO_EXTCLK_SELET_CRU;
+		rk_clrsetreg(&ioc->mac1_io_con1,
+			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
+		rk_clrsetreg(&ioc->mac0_io_con1,
+			     RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val);
+
+	} else {
+		val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO :
+					   RK3562_GMAC1_CLK_SELET_CRU;
+		rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val);
+		val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO :
+					   RK3562_GMAC1_IO_EXTCLK_SELET_CRU;
+		rk_clrsetreg(&ioc->mac1_io_con1,
+			     RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val);
+	}
+}
+
 static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata)
 {
 	struct rk3588_php_grf *php_grf;
@@ -1701,6 +2170,21 @@
 	.set_to_rmii = rv1108_gmac_set_to_rmii,
 };
 #else
+const struct rk_gmac_ops rk3528_gmac_ops = {
+	.fix_mac_speed = rk3528_set_rgmii_speed,
+	.set_to_rgmii = rk3528_set_to_rgmii,
+	.set_to_rmii = rk3528_set_to_rmii,
+	.set_clock_selection = rk3528_set_clock_selection,
+	.integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup,
+};
+
+const struct rk_gmac_ops rk3562_gmac_ops = {
+	.fix_mac_speed = rk3562_set_gmac_speed,
+	.set_to_rgmii = rk3562_set_to_rgmii,
+	.set_to_rmii = rk3562_set_to_rmii,
+	.set_clock_selection = rk3562_set_clock_selection,
+};
+
 const struct rk_gmac_ops rk3568_gmac_ops = {
 	.fix_mac_speed = rv1126_set_rgmii_speed,
 	.set_to_rgmii = rk3568_set_to_rgmii,
@@ -1774,6 +2258,16 @@
 	  .data = (ulong)&rv1108_gmac_ops },
 #endif
 #else
+#ifdef CONFIG_ROCKCHIP_RK3528
+	{ .compatible = "rockchip,rk3528-gmac",
+	  .data = (ulong)&rk3528_gmac_ops },
+#endif
+
+#ifdef CONFIG_ROCKCHIP_RK3562
+	{ .compatible = "rockchip,rk3562-gmac",
+	  .data = (ulong)&rk3562_gmac_ops },
+#endif
+
 #ifdef CONFIG_ROCKCHIP_RK3568
 	{ .compatible = "rockchip,rk3568-gmac",
 	  .data = (ulong)&rk3568_gmac_ops },
diff --git a/u-boot/drivers/net/phy/rk630phy.c b/u-boot/drivers/net/phy/rk630phy.c
index 9f1ec14..cc35bc4 100644
--- a/u-boot/drivers/net/phy/rk630phy.c
+++ b/u-boot/drivers/net/phy/rk630phy.c
@@ -50,6 +50,7 @@
 #define REG_PAGE6_CP_CURRENT			0x17
 #define REG_PAGE6_ADC_OP_BIAS			0x18
 #define REG_PAGE6_RX_DECTOR			0x19
+#define REG_PAGE6_TX_MOS_DRV			0x1B
 #define REG_PAGE6_AFE_PDCW			0x1c
 
 /* PAGE 8 */
@@ -201,6 +202,8 @@
 	phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE6_RX_DECTOR, 0x0408);
 	/* PHYAFE PDCW optimization */
 	phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE6_AFE_PDCW, 0x8880);
+	/* Add PHY Tx mos drive, reduce power noise/jitter */
+	phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE6_TX_MOS_DRV, 0x888e);
 
 	/* Switch to page 8 */
 	phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE_SEL, 0x0800);
diff --git a/u-boot/drivers/nvme/nvme.c b/u-boot/drivers/nvme/nvme.c
index 55600c8..402e992 100644
--- a/u-boot/drivers/nvme/nvme.c
+++ b/u-boot/drivers/nvme/nvme.c
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <bouncebuf.h>
 #include <dm.h>
 #include <errno.h>
 #include <memalign.h>
@@ -740,13 +741,25 @@
 	u64 prp2;
 	u64 total_len = blkcnt << desc->log2blksz;
 	u64 temp_len = total_len;
+	uintptr_t temp_buffer;
 
 	u64 slba = blknr;
 	u16 lbas = 1 << (dev->max_transfer_shift - ns->lba_shift);
 	u64 total_lbas = blkcnt;
 
-	flush_dcache_range((unsigned long)buffer,
-			   (unsigned long)buffer + total_len);
+	struct bounce_buffer bb;
+	unsigned int bb_flags;
+	int ret;
+
+	if (read)
+		bb_flags = GEN_BB_WRITE;
+	else
+		bb_flags = GEN_BB_READ;
+
+	ret = bounce_buffer_start(&bb, buffer, total_len, bb_flags);
+	if (ret)
+		return -ENOMEM;
+	temp_buffer = (unsigned long)bb.bounce_buffer;
 
 	c.rw.opcode = read ? nvme_cmd_read : nvme_cmd_write;
 	c.rw.flags = 0;
@@ -771,24 +784,22 @@
 		}
 
 		if (nvme_setup_prps(dev, &prp2,
-				    lbas << ns->lba_shift, (ulong)buffer))
+				    lbas << ns->lba_shift, temp_buffer))
 			return -EIO;
 		c.rw.slba = cpu_to_le64(slba);
 		slba += lbas;
 		c.rw.length = cpu_to_le16(lbas - 1);
-		c.rw.prp1 = cpu_to_le64((ulong)buffer);
+		c.rw.prp1 = cpu_to_le64(temp_buffer);
 		c.rw.prp2 = cpu_to_le64(prp2);
 		status = nvme_submit_sync_cmd(dev->queues[NVME_IO_Q],
 				&c, NULL, IO_TIMEOUT);
 		if (status)
 			break;
 		temp_len -= (u32)lbas << ns->lba_shift;
-		buffer += lbas << ns->lba_shift;
+		temp_buffer += lbas << ns->lba_shift;
 	}
 
-	if (read)
-		invalidate_dcache_range((unsigned long)buffer,
-					(unsigned long)buffer + total_len);
+	bounce_buffer_stop(&bb);
 
 	return (total_len - temp_len) >> desc->log2blksz;
 }
diff --git a/u-boot/drivers/pci/pcie_dw_rockchip.c b/u-boot/drivers/pci/pcie_dw_rockchip.c
index 27312d1..dd81acf 100644
--- a/u-boot/drivers/pci/pcie_dw_rockchip.c
+++ b/u-boot/drivers/pci/pcie_dw_rockchip.c
@@ -18,8 +18,41 @@
 #include <asm-generic/gpio.h>
 #include <asm/arch-rockchip/clock.h>
 #include <linux/iopoll.h>
+#include <linux/ioport.h>
 
 DECLARE_GLOBAL_DATA_PTR;
+
+#define RK_PCIE_DBG			0
+
+#define __pcie_dev_print_emit(fmt, ...) \
+({ \
+	printf(fmt, ##__VA_ARGS__); \
+})
+
+#ifdef dev_err
+#undef dev_err
+#define dev_err(dev, fmt, ...) \
+({ \
+	if (dev) \
+		__pcie_dev_print_emit("%s: " fmt, dev->name, \
+				##__VA_ARGS__); \
+})
+#endif
+
+#ifdef dev_info
+#undef dev_info
+#define dev_info dev_err
+#endif
+
+#ifdef DEBUG
+#define dev_dbg dev_err
+#else
+#define dev_dbg(dev, fmt, ...)					\
+({								\
+	if (0)							\
+		__dev_printk(7, dev, fmt, ##__VA_ARGS__);	\
+})
+#endif
 
 struct rk_pcie {
 	struct udevice	*dev;
@@ -62,7 +95,6 @@
 #define PCIE_CLIENT_DBG_FIFO_STATUS	0x350
 #define PCIE_CLIENT_DBG_TRANSITION_DATA	0xffff0000
 #define PCIE_CLIENT_DBF_EN		0xffff0003
-#define RK_PCIE_DBG			0
 
 /* PCI DBICS registers */
 #define PCIE_LINK_STATUS_REG		0x80
@@ -119,6 +151,8 @@
 #define LINK_WAIT_MAX_IATU_RETRIES	5
 #define LINK_WAIT_IATU			10000
 
+#define PCIE_TYPE0_HDR_DBI2_OFFSET      0x100000
+
 static int rk_pcie_read(void __iomem *addr, int size, u32 *val)
 {
 	if ((uintptr_t)addr & (size - 1)) {
@@ -165,7 +199,7 @@
 
 	ret = rk_pcie_read(base + reg, size, &val);
 	if (ret)
-		dev_err(rk_pcie->pci->dev, "Read APB address failed\n");
+		dev_err(rk_pcie->dev, "Read APB address failed\n");
 
 	return val;
 }
@@ -177,7 +211,7 @@
 
 	ret = rk_pcie_write(base + reg, size, val);
 	if (ret)
-		dev_err(rk_pcie->pci->dev, "Write APB address failed\n");
+		dev_err(rk_pcie->dev, "Write APB address failed\n");
 }
 
 static inline u32 rk_pcie_readl_apb(struct rk_pcie *rk_pcie, u32 reg)
@@ -272,6 +306,10 @@
 	val = readl(rk_pcie->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
 	val |= PORT_LOGIC_SPEED_CHANGE;
 	writel(val, rk_pcie->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL);
+
+	/* Disable BAR0 BAR1 */
+	writel(0, rk_pcie->dbi_base + PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + 0 * 4);
+	writel(0, rk_pcie->dbi_base + PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + 1 * 4);
 
 	rk_pcie_dbi_write_enable(rk_pcie, false);
 }
@@ -469,10 +507,10 @@
 #if RK_PCIE_DBG
 	u32 loop;
 
-	dev_info(rk_pcie->dev, "ltssm = 0x%x\n",
+	dev_err(rk_pcie->dev, "ltssm = 0x%x\n",
 		 rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_LTSSM_STATUS));
 	for (loop = 0; loop < 64; loop++)
-		dev_info(rk_pcie->dev, "fifo_status = 0x%x\n",
+		dev_err(rk_pcie->dev, "fifo_status = 0x%x\n",
 			 rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_STATUS));
 #endif
 }
@@ -641,17 +679,18 @@
 	struct rk_pcie *priv = dev_get_priv(dev);
 	u32 max_link_speed;
 	int ret;
+	struct resource res;
 
-	priv->dbi_base = (void *)dev_read_addr_index(dev, 0);
-	if (!priv->dbi_base)
+	ret = dev_read_resource_byname(dev, "pcie-dbi", &res);
+	if (ret)
 		return -ENODEV;
-
+	priv->dbi_base = (void *)(res.start);
 	dev_dbg(dev, "DBI address is 0x%p\n", priv->dbi_base);
 
-	priv->apb_base = (void *)dev_read_addr_index(dev, 1);
-	if (!priv->apb_base)
+	ret = dev_read_resource_byname(dev, "pcie-apb", &res);
+	if (ret)
 		return -ENODEV;
-
+	priv->apb_base = (void *)(res.start);
 	dev_dbg(dev, "APB address is 0x%p\n", priv->apb_base);
 
 	ret = gpio_request_by_name(dev, "reset-gpios", 0,
@@ -771,6 +810,8 @@
 };
 
 static const struct udevice_id rockchip_pcie_ids[] = {
+	{ .compatible = "rockchip,rk3528-pcie" },
+	{ .compatible = "rockchip,rk3562-pcie" },
 	{ .compatible = "rockchip,rk3568-pcie" },
 	{ .compatible = "rockchip,rk3588-pcie" },
 	{ }
diff --git a/u-boot/drivers/phy/Makefile b/u-boot/drivers/phy/Makefile
index 27c423e..a94cb39 100644
--- a/u-boot/drivers/phy/Makefile
+++ b/u-boot/drivers/phy/Makefile
@@ -18,3 +18,5 @@
 obj-$(CONFIG_PHY_SANDBOX) += sandbox-phy.o
 obj-$(CONFIG_$(SPL_)PIPE3_PHY) += ti-pipe3-phy.o
 obj-$(CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY) += phy-rockchip-naneng-combphy.o
+
+CFLAGS_phy-rockchip-inno-usb2.o := -Wno-error=unused-function -Wno-error=unused-const-variable -Wunused-const-variable=0
diff --git a/u-boot/drivers/phy/phy-rockchip-inno-usb2.c b/u-boot/drivers/phy/phy-rockchip-inno-usb2.c
index 6ff06f7..92a9181 100644
--- a/u-boot/drivers/phy/phy-rockchip-inno-usb2.c
+++ b/u-boot/drivers/phy/phy-rockchip-inno-usb2.c
@@ -149,6 +149,7 @@
  *		     primary stage.
  * @grf: General Register Files register base.
  * @usbgrf_base : USB General Register Files register base.
+ * @phy_base: the base address of USB PHY.
  * @phy_rst: phy reset control.
  * @phy_cfg: phy register configuration, assigned by driver data.
  */
@@ -157,6 +158,7 @@
 	u8		primary_retries;
 	struct regmap	*grf_base;
 	struct regmap	*usbgrf_base;
+	void __iomem	*phy_base;
 	struct udevice	*vbus_supply[USB2PHY_NUM_PORTS];
 	struct reset_ctl phy_rst;
 	const struct rockchip_usb2phy_cfg	*phy_cfg;
@@ -282,6 +284,11 @@
 		return POWER_SUPPLY_TYPE_UNKNOWN;
 	}
 
+#ifdef CONFIG_ROCKCHIP_RK3036
+	chg_type = POWER_SUPPLY_TYPE_USB;
+	goto out;
+#endif
+
 	/* Suspend USB-PHY and put the controller in non-driving mode */
 	property_enable(base, &port_cfg->phy_sus, true);
 	property_enable(base, &rphy->phy_cfg->chg_det.opmode, false);
@@ -388,36 +395,14 @@
 	port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG];
 
 	/* Set the USB-PHY COMMONONN to 1'b0 to ensure USB's clocks */
-	property_enable(base, &rphy->phy_cfg->clkout_ctl, false);
+	if(rphy->phy_cfg->clkout_ctl.disable)
+		property_enable(base, &rphy->phy_cfg->clkout_ctl, true);
 
 	/* Reset USB-PHY */
 	property_enable(base, &port_cfg->phy_sus, true);
 	udelay(20);
 	property_enable(base, &port_cfg->phy_sus, false);
 	mdelay(2);
-}
-
-static struct udevice *rockchip_usb2phy_check_vbus(struct phy *phy)
-{
-	struct udevice *parent = phy->dev->parent;
-	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
-	const struct rockchip_usb2phy_port_cfg *port_cfg;
-	struct regmap *base = get_reg_base(rphy);
-	struct udevice *vbus = NULL;
-	bool iddig = true;
-
-	if (phy->id == USB2PHY_PORT_HOST) {
-		vbus = rphy->vbus_supply[USB2PHY_PORT_HOST];
-	} else if (phy->id == USB2PHY_PORT_OTG) {
-		port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG];
-		if (port_cfg->utmi_iddig.offset) {
-			iddig = property_enabled(base, &port_cfg->utmi_iddig);
-			if (!iddig)
-				vbus = rphy->vbus_supply[USB2PHY_PORT_OTG];
-		}
-	}
-
-	return vbus;
 }
 
 static int rockchip_usb2phy_reset(struct rockchip_usb2phy *rphy)
@@ -492,10 +477,11 @@
 
 static int rockchip_usb2phy_power_on(struct phy *phy)
 {
-	struct udevice *vbus = NULL;
+	struct udevice *parent = phy->dev->parent;
+	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
+	struct udevice *vbus = rphy->vbus_supply[phy->id];
 	int ret;
 
-	vbus = rockchip_usb2phy_check_vbus(phy);
 	if (vbus) {
 		ret = regulator_set_enable(vbus, true);
 		if (ret) {
@@ -509,10 +495,11 @@
 
 static int rockchip_usb2phy_power_off(struct phy *phy)
 {
-	struct udevice *vbus = NULL;
+	struct udevice *parent = phy->dev->parent;
+	struct rockchip_usb2phy *rphy = dev_get_priv(parent);
+	struct udevice *vbus = rphy->vbus_supply[phy->id];
 	int ret;
 
-	vbus = rockchip_usb2phy_check_vbus(phy);
 	if (vbus) {
 		ret = regulator_set_enable(vbus, false);
 		if (ret) {
@@ -587,6 +574,11 @@
 	struct resource res;
 	u32 reg, index;
 	int ret;
+
+	rphy->phy_base = (void __iomem *)dev_read_addr(dev);
+	if (IS_ERR(rphy->phy_base)) {
+		dev_err(dev, "get the base address of usb phy failed\n");
+	}
 
 	if (!strncmp(parent->name, "root_driver", 11) &&
 	    dev_read_bool(dev, "rockchip,grf")) {
@@ -818,6 +810,102 @@
 	return 0;
 }
 
+static int rv1106_usb2phy_tuning(struct rockchip_usb2phy *rphy)
+{
+	u32 reg;
+
+	/* Set HS disconnect detect mode to single ended detect mode */
+	reg = readl(rphy->phy_base + 0x70);
+	writel(reg | BIT(2), rphy->phy_base + 0x70);
+
+	return 0;
+}
+
+static int rk3528_usb2phy_tuning(struct rockchip_usb2phy *rphy)
+{
+	u32 reg;
+	int ret = 0;
+
+	if (IS_ERR(rphy->phy_base)) {
+		return PTR_ERR(rphy->phy_base);
+	}
+
+	/* Turn off otg port differential receiver in suspend mode */
+	reg = readl(rphy->phy_base + 0x30);
+	writel(reg & ~BIT(2), rphy->phy_base + 0x30);
+
+	/* Turn off host port differential receiver in suspend mode */
+	reg = readl(rphy->phy_base + 0x0430);
+	writel(reg & ~BIT(2), rphy->phy_base + 0x0430);
+
+	/* Set otg port HS eye height to 400mv(default is 450mv) */
+	reg = readl(rphy->phy_base + 0x30);
+	reg &= ~GENMASK(6, 4);
+	reg |= (0x00 << 4);
+	writel(reg, rphy->phy_base + 0x30);
+
+	/* Set host port HS eye height to 400mv(default is 450mv) */
+	reg = readl(rphy->phy_base + 0x430);
+	reg &= ~GENMASK(6, 4);
+	reg |= (0x00 << 4);
+	writel(reg, rphy->phy_base + 0x430);
+
+	/* Choose the Tx fs/ls data as linestate from TX driver for otg port */
+	reg = readl(rphy->phy_base + 0x94);
+	reg &= ~GENMASK(6, 3);
+	reg |= (0x03 << 3);
+	writel(reg, rphy->phy_base + 0x94);
+
+	/* Turn on output clk of phy*/
+	reg = readl(rphy->phy_base + 0x41c);
+	reg &= ~GENMASK(7, 2);
+	reg |= (0x27 << 2);
+	writel(reg, rphy->phy_base + 0x41c);
+
+	return ret;
+}
+
+static int rk3562_usb2phy_tuning(struct rockchip_usb2phy *rphy)
+{
+	u32 reg;
+	int ret = 0;
+
+	if (IS_ERR(rphy->phy_base)) {
+		return PTR_ERR(rphy->phy_base);
+	}
+
+	/* Turn off differential receiver by default to save power */
+	reg = readl(rphy->phy_base + 0x30);
+	writel(reg & ~BIT(2), rphy->phy_base + 0x30);
+
+	reg = readl(rphy->phy_base + 0x0430);
+	writel(reg & ~BIT(2), rphy->phy_base + 0x0430);
+
+	/* Enable pre-emphasis during non-chirp phase */
+	reg = readl(rphy->phy_base);
+	reg &= ~GENMASK(2, 0);
+	reg |= 0x04;
+	writel(reg, rphy->phy_base);
+
+	reg = readl(rphy->phy_base + 0x0400);
+	reg &= ~GENMASK(2, 0);
+	reg |= 0x04;
+	writel(reg, rphy->phy_base + 0x0400);
+
+	/* Set HS eye height to 425mv(default is 400mv) */
+	reg = readl(rphy->phy_base + 0x0030);
+	reg &= ~GENMASK(6, 4);
+	reg |= (0x05 << 4);
+	writel(reg, rphy->phy_base + 0x0030);
+
+	reg = readl(rphy->phy_base + 0x0430);
+	reg &= ~GENMASK(6, 4);
+	reg |= (0x05 << 4);
+	writel(reg, rphy->phy_base + 0x0430);
+
+	return ret;
+}
+
 static int rk3588_usb2phy_tuning(struct rockchip_usb2phy *rphy)
 {
 	struct regmap *base = get_reg_base(rphy);
@@ -902,6 +990,43 @@
 			.rdm_pdwn_en	= { 0x0108, 10, 10, 0, 1 },
 			.vdm_src_en	= { 0x0108, 12, 12, 0, 1 },
 			.vdp_src_en	= { 0x0108, 11, 11, 0, 1 },
+		},
+	},
+	{ /* sentinel */ }
+};
+
+static const struct rockchip_usb2phy_cfg rk3036_phy_cfgs[] = {
+	{
+		.reg = 0x17c,
+		.num_ports	= 2,
+		.clkout_ctl	= { 0x017c, 11, 11, 1, 0 },
+		.port_cfgs	= {
+			[USB2PHY_PORT_OTG] = {
+				.phy_sus	= { 0x017c, 8, 0, 0, 0x1d1 },
+				.bvalid_det_en	= { 0x017c, 14, 14, 0, 1 },
+				.bvalid_det_st	= { 0x017c, 15, 15, 0, 1 },
+				.bvalid_det_clr	= { 0x017c, 15, 15, 0, 1 },
+				.iddig_output	= { 0x017c, 10, 10, 0, 1 },
+				.iddig_en	= { 0x017c, 9, 9, 0, 1 },
+				.idfall_det_en  = { 0x01a0, 2, 2, 0, 1 },
+				.idfall_det_st  = { 0x01a0, 3, 3, 0, 1 },
+				.idfall_det_clr = { 0x01a0, 3, 3, 0, 1 },
+				.idrise_det_en  = { 0x01a0, 0, 0, 0, 1 },
+				.idrise_det_st  = { 0x01a0, 1, 1, 0, 1 },
+				.idrise_det_clr = { 0x01a0, 1, 1, 0, 1 },
+				.ls_det_en	= { 0x017c, 12, 12, 0, 1 },
+				.ls_det_st	= { 0x017c, 13, 13, 0, 1 },
+				.ls_det_clr	= { 0x017c, 13, 13, 0, 1 },
+				.utmi_bvalid	= { 0x014c, 5, 5, 0, 1 },
+				.utmi_iddig	= { 0x014c, 8, 8, 0, 1 },
+				.utmi_ls	= { 0x014c, 7, 6, 0, 1 },
+			},
+			[USB2PHY_PORT_HOST] = {
+				.phy_sus	= { 0x0194, 8, 0, 0, 0x1d1 },
+				.ls_det_en	= { 0x0194, 14, 14, 0, 1 },
+				.ls_det_st	= { 0x0194, 15, 15, 0, 1 },
+				.ls_det_clr	= { 0x0194, 15, 15, 0, 1 }
+			}
 		},
 	},
 	{ /* sentinel */ }
@@ -1272,6 +1397,51 @@
 	{ /* sentinel */ }
 };
 
+static const struct rockchip_usb2phy_cfg rv1106_phy_cfgs[] = {
+	{
+		.reg = 0xff3e0000,
+		.num_ports	= 1,
+		.phy_tuning	= rv1106_usb2phy_tuning,
+		.clkout_ctl	= { 0x0058, 4, 4, 1, 0 },
+		.port_cfgs	= {
+			[USB2PHY_PORT_OTG] = {
+				.phy_sus	= { 0x0050, 8, 0, 0, 0x1d1 },
+				.bvalid_det_en	= { 0x0100, 2, 2, 0, 1 },
+				.bvalid_det_st	= { 0x0104, 2, 2, 0, 1 },
+				.bvalid_det_clr = { 0x0108, 2, 2, 0, 1 },
+				.iddig_output	= { 0x0050, 10, 10, 0, 1 },
+				.iddig_en	= { 0x0050, 9, 9, 0, 1 },
+				.idfall_det_en	= { 0x0100, 5, 5, 0, 1 },
+				.idfall_det_st	= { 0x0104, 5, 5, 0, 1 },
+				.idfall_det_clr = { 0x0108, 5, 5, 0, 1 },
+				.idrise_det_en	= { 0x0100, 4, 4, 0, 1 },
+				.idrise_det_st	= { 0x0104, 4, 4, 0, 1 },
+				.idrise_det_clr = { 0x0108, 4, 4, 0, 1 },
+				.ls_det_en	= { 0x0100, 0, 0, 0, 1 },
+				.ls_det_st	= { 0x0104, 0, 0, 0, 1 },
+				.ls_det_clr	= { 0x0108, 0, 0, 0, 1 },
+				.utmi_avalid	= { 0x0060, 10, 10, 0, 1 },
+				.utmi_bvalid	= { 0x0060, 9, 9, 0, 1 },
+				.utmi_iddig	= { 0x0060, 6, 6, 0, 1 },
+				.utmi_ls	= { 0x0060, 5, 4, 0, 1 },
+			},
+		},
+		.chg_det = {
+			.opmode	= { 0x0050, 3, 0, 5, 1 },
+			.cp_det		= { 0x0060, 13, 13, 0, 1 },
+			.dcp_det	= { 0x0060, 12, 12, 0, 1 },
+			.dp_det		= { 0x0060, 14, 14, 0, 1 },
+			.idm_sink_en	= { 0x0058, 8, 8, 0, 1 },
+			.idp_sink_en	= { 0x0058, 7, 7, 0, 1 },
+			.idp_src_en	= { 0x0058, 9, 9, 0, 1 },
+			.rdm_pdwn_en	= { 0x0058, 10, 10, 0, 1 },
+			.vdm_src_en	= { 0x0058, 12, 12, 0, 1 },
+			.vdp_src_en	= { 0x0058, 11, 11, 0, 1 },
+		},
+	},
+	{ /* sentinel */ }
+};
+
 static const struct rockchip_usb2phy_cfg rv1108_phy_cfgs[] = {
 	{
 		.reg = 0x100,
@@ -1309,6 +1479,110 @@
 			.rdm_pdwn_en	= { 0x0ffa0108, 10, 10, 0, 1 },
 			.vdm_src_en	= { 0x0ffa0108, 12, 12, 0, 1 },
 			.vdp_src_en	= { 0x0ffa0108, 11, 11, 0, 1 },
+		},
+	},
+	{ /* sentinel */ }
+};
+
+static const struct rockchip_usb2phy_cfg rk3528_phy_cfgs[] = {
+	{
+		.reg = 0xffdf0000,
+		.num_ports	= 2,
+		.phy_tuning	= rk3528_usb2phy_tuning,
+		.port_cfgs	= {
+			[USB2PHY_PORT_OTG] = {
+				.phy_sus	= { 0x6004c, 8, 0, 0, 0x1d1 },
+				.bvalid_det_en	= { 0x60074, 2, 2, 0, 1 },
+				.bvalid_det_st	= { 0x60078, 2, 2, 0, 1 },
+				.bvalid_det_clr = { 0x6007c, 2, 2, 0, 1 },
+				.iddig_output	= { 0x6004c, 10, 10, 0, 1 },
+				.iddig_en	= { 0x6004c, 9, 9, 0, 1 },
+				.idfall_det_en	= { 0x60074, 5, 5, 0, 1 },
+				.idfall_det_st	= { 0x60078, 5, 5, 0, 1 },
+				.idfall_det_clr = { 0x6007c, 5, 5, 0, 1 },
+				.idrise_det_en	= { 0x60074, 4, 4, 0, 1 },
+				.idrise_det_st	= { 0x60078, 4, 4, 0, 1 },
+				.idrise_det_clr = { 0x6007c, 4, 4, 0, 1 },
+				.ls_det_en	= { 0x60074, 0, 0, 0, 1 },
+				.ls_det_st	= { 0x60078, 0, 0, 0, 1 },
+				.ls_det_clr	= { 0x6007c, 0, 0, 0, 1 },
+				.utmi_avalid	= { 0x6006c, 1, 1, 0, 1 },
+				.utmi_bvalid	= { 0x6006c, 0, 0, 0, 1 },
+				.utmi_iddig	= { 0x6006c, 6, 6, 0, 1 },
+				.utmi_ls	= { 0x6006c, 5, 4, 0, 1 },
+			},
+			[USB2PHY_PORT_HOST] = {
+				.phy_sus	= { 0x6005c, 8, 0, 0x1d2, 0x1d1 },
+				.ls_det_en	= { 0x60090, 0, 0, 0, 1 },
+				.ls_det_st	= { 0x60094, 0, 0, 0, 1 },
+				.ls_det_clr	= { 0x60098, 0, 0, 0, 1 },
+				.utmi_ls	= { 0x6006c, 13, 12, 0, 1 },
+				.utmi_hstdet	= { 0x6006c, 15, 15, 0, 1 }
+			}
+		},
+		.chg_det = {
+			.opmode		= { 0x6004c, 3, 0, 5, 1 },
+			.cp_det		= { 0x6006c, 19, 19, 0, 1 },
+			.dcp_det	= { 0x6006c, 18, 18, 0, 1 },
+			.dp_det		= { 0x6006c, 20, 20, 0, 1 },
+			.idm_sink_en	= { 0x60058, 1, 1, 0, 1 },
+			.idp_sink_en	= { 0x60058, 0, 0, 0, 1 },
+			.idp_src_en	= { 0x60058, 2, 2, 0, 1 },
+			.rdm_pdwn_en	= { 0x60058, 3, 3, 0, 1 },
+			.vdm_src_en	= { 0x60058, 5, 5, 0, 1 },
+			.vdp_src_en	= { 0x60058, 4, 4, 0, 1 },
+		},
+	}
+};
+
+static const struct rockchip_usb2phy_cfg rk3562_phy_cfgs[] = {
+	{
+		.reg = 0xff740000,
+		.num_ports	= 2,
+		.phy_tuning	= rk3562_usb2phy_tuning,
+		.clkout_ctl	= { 0x0108, 4, 4, 1, 0 },
+		.port_cfgs	= {
+			[USB2PHY_PORT_OTG] = {
+				.phy_sus	= { 0x0100, 8, 0, 0, 0x1d1 },
+				.bvalid_det_en	= { 0x0110, 2, 2, 0, 1 },
+				.bvalid_det_st	= { 0x0114, 2, 2, 0, 1 },
+				.bvalid_det_clr = { 0x0118, 2, 2, 0, 1 },
+				.iddig_output	= { 0x0100, 10, 10, 0, 1 },
+				.iddig_en	= { 0x0100, 9, 9, 0, 1 },
+				.idfall_det_en	= { 0x0110, 5, 5, 0, 1 },
+				.idfall_det_st	= { 0x0114, 5, 5, 0, 1 },
+				.idfall_det_clr = { 0x0118, 5, 5, 0, 1 },
+				.idrise_det_en	= { 0x0110, 4, 4, 0, 1 },
+				.idrise_det_st	= { 0x0114, 4, 4, 0, 1 },
+				.idrise_det_clr = { 0x0118, 4, 4, 0, 1 },
+				.ls_det_en	= { 0x0110, 0, 0, 0, 1 },
+				.ls_det_st	= { 0x0114, 0, 0, 0, 1 },
+				.ls_det_clr	= { 0x0118, 0, 0, 0, 1 },
+				.utmi_avalid	= { 0x0120, 10, 10, 0, 1 },
+				.utmi_bvalid	= { 0x0120, 9, 9, 0, 1 },
+				.utmi_iddig	= { 0x0120, 6, 6, 0, 1 },
+				.utmi_ls	= { 0x0120, 5, 4, 0, 1 },
+			},
+			[USB2PHY_PORT_HOST] = {
+				.phy_sus	= { 0x0104, 8, 0, 0x1d2, 0x1d1 },
+				.ls_det_en	= { 0x0110, 1, 1, 0, 1 },
+				.ls_det_st	= { 0x0114, 1, 1, 0, 1 },
+				.ls_det_clr	= { 0x0118, 1, 1, 0, 1 },
+				.utmi_ls	= { 0x0120, 17, 16, 0, 1 },
+				.utmi_hstdet	= { 0x0120, 19, 19, 0, 1 }
+			}
+		},
+		.chg_det = {
+			.opmode		= { 0x0100, 3, 0, 5, 1 },
+			.cp_det		= { 0x0120, 24, 24, 0, 1 },
+			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
+			.dp_det		= { 0x0120, 25, 25, 0, 1 },
+			.idm_sink_en	= { 0x0108, 8, 8, 0, 1 },
+			.idp_sink_en	= { 0x0108, 7, 7, 0, 1 },
+			.idp_src_en	= { 0x0108, 9, 9, 0, 1 },
+			.rdm_pdwn_en	= { 0x0108, 10, 10, 0, 1 },
+			.vdm_src_en	= { 0x0108, 12, 12, 0, 1 },
+			.vdp_src_en	= { 0x0108, 11, 11, 0, 1 },
 		},
 	},
 	{ /* sentinel */ }
@@ -1401,6 +1675,8 @@
 				.ls_det_en	= { 0x0080, 0, 0, 0, 1 },
 				.ls_det_st	= { 0x0084, 0, 0, 0, 1 },
 				.ls_det_clr	= { 0x0088, 0, 0, 0, 1 },
+				.utmi_avalid	= { 0x00c0, 7, 7, 0, 1 },
+				.utmi_bvalid	= { 0x00c0, 6, 6, 0, 1 },
 				.utmi_iddig	= { 0x00c0, 5, 5, 0, 1 },
 				.utmi_ls	= { 0x00c0, 10, 9, 0, 1 },
 			}
@@ -1468,16 +1744,48 @@
 };
 
 static const struct udevice_id rockchip_usb2phy_ids[] = {
+#ifdef CONFIG_ROCKCHIP_RK1808
 	{ .compatible = "rockchip,rk1808-usb2phy", .data = (ulong)&rk1808_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3036
+	{ .compatible = "rockchip,rk3036-usb2phy", .data = (ulong)&rk3036_phy_cfgs },
+#endif
+#if defined CONFIG_ROCKCHIP_RK3128 || defined CONFIG_ROCKCHIP_RK3126
 	{ .compatible = "rockchip,rk3128-usb2phy", .data = (ulong)&rk312x_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK322X
 	{ .compatible = "rockchip,rk322x-usb2phy", .data = (ulong)&rk322x_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3308
 	{ .compatible = "rockchip,rk3308-usb2phy", .data = (ulong)&rk3308_phy_cfgs },
+#endif
+#if defined CONFIG_ROCKCHIP_RK3328 || defined CONFIG_ROCKCHIP_PX30
 	{ .compatible = "rockchip,rk3328-usb2phy", .data = (ulong)&rk3328_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3368
 	{ .compatible = "rockchip,rk3368-usb2phy", .data = (ulong)&rk3368_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3399
 	{ .compatible = "rockchip,rk3399-usb2phy", .data = (ulong)&rk3399_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3528
+	{ .compatible = "rockchip,rk3528-usb2phy", .data = (ulong)&rk3528_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3562
+	{ .compatible = "rockchip,rk3562-usb2phy", .data = (ulong)&rk3562_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3568
 	{ .compatible = "rockchip,rk3568-usb2phy", .data = (ulong)&rk3568_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RK3588
 	{ .compatible = "rockchip,rk3588-usb2phy", .data = (ulong)&rk3588_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RV1106
+	{ .compatible = "rockchip,rv1106-usb2phy", .data = (ulong)&rv1106_phy_cfgs },
+#endif
+#ifdef CONFIG_ROCKCHIP_RV1108
 	{ .compatible = "rockchip,rv1108-usb2phy", .data = (ulong)&rv1108_phy_cfgs },
+#endif
 	{ }
 };
 
diff --git a/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c b/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c
index 1867865..451a90f 100644
--- a/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c
+++ b/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c
@@ -22,7 +22,7 @@
 struct rockchip_combphy_priv;
 
 struct combphy_reg {
-	u16 offset;
+	u32 offset;
 	u16 bitend;
 	u16 bitstart;
 	u16 disable;
@@ -37,6 +37,7 @@
 	struct combphy_reg pipe_rxterm_set;
 	struct combphy_reg pipe_txelec_set;
 	struct combphy_reg pipe_txcomp_set;
+	struct combphy_reg pipe_clk_24m;
 	struct combphy_reg pipe_clk_25m;
 	struct combphy_reg pipe_clk_100m;
 	struct combphy_reg pipe_phymode_sel;
@@ -62,6 +63,7 @@
 	struct combphy_reg pipe_xpcs_phy_ready;
 	struct combphy_reg u3otg0_port_en;
 	struct combphy_reg u3otg1_port_en;
+	struct combphy_reg pipe_phy_grf_reset;
 };
 
 struct rockchip_combphy_cfg {
@@ -179,6 +181,7 @@
 static int rockchip_combphy_init(struct phy *phy)
 {
 	struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev);
+	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
 	int ret;
 
 	ret = clk_enable(&priv->ref_clk);
@@ -191,6 +194,9 @@
 
 	reset_deassert(&priv->phy_rst);
 
+	if (cfg->pipe_phy_grf_reset.enable)
+		param_write(priv->phy_grf, &cfg->pipe_phy_grf_reset, false);
+
 	return 0;
 
 err_clk:
@@ -202,9 +208,13 @@
 static int rockchip_combphy_exit(struct phy *phy)
 {
 	struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev);
+	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
 
-	clk_disable(&priv->ref_clk);
+	if (cfg->pipe_phy_grf_reset.enable)
+		param_write(priv->phy_grf, &cfg->pipe_phy_grf_reset, true);
+
 	reset_assert(&priv->phy_rst);
+	clk_disable(&priv->ref_clk);
 
 	return 0;
 }
@@ -291,6 +301,215 @@
 
 	return rockchip_combphy_parse_dt(udev, priv);
 }
+
+static int rk3528_combphy_cfg(struct rockchip_combphy_priv *priv)
+{
+	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
+	u32 val;
+
+	switch (priv->mode) {
+	case PHY_TYPE_PCIE:
+		/* Set SSC downward spread spectrum */
+		val = readl(priv->mmio + 0x18);
+		val &= ~GENMASK(5, 4);
+		val |= 0x01 << 4;
+		writel(val, priv->mmio + 0x18);
+
+		param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
+		param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
+		param_write(priv->phy_grf, &cfg->con2_for_pcie, true);
+		param_write(priv->phy_grf, &cfg->con3_for_pcie, true);
+		break;
+	case PHY_TYPE_USB3:
+		/* Set SSC downward spread spectrum */
+		val = readl(priv->mmio + 0x18);
+		val &= ~GENMASK(5, 4);
+		val |= 0x01 << 4;
+		writel(val, priv->mmio + 0x18);
+
+		/* Enable adaptive CTLE for USB3.0 Rx */
+		val = readl(priv->mmio + 0x200);
+		val &= ~GENMASK(17, 17);
+		val |= 0x01;
+		writel(val, priv->mmio + 0x200);
+
+		param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
+		param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
+		param_write(priv->phy_grf, &cfg->usb_mode_set, true);
+		break;
+	default:
+		dev_err(priv->dev, "incompatible PHY type\n");
+		return -EINVAL;
+	}
+
+	param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+	if (priv->mode == PHY_TYPE_PCIE) {
+		/* PLL KVCO tuning fine */
+		val = readl(priv->mmio + 0x18);
+		val &= ~(0x7 << 10);
+		val |= 0x2 << 10;
+		writel(val, priv->mmio + 0x18);
+
+		/* su_trim[6:4]=111, [10:7]=1001, [2:0]=000 */
+		val = readl(priv->mmio + 0x108);
+		val &= ~(0x7f7);
+		val |= 0x4f0;
+		writel(val, priv->mmio + 0x108);
+	}
+
+	return 0;
+}
+
+static const struct rockchip_combphy_grfcfg rk3528_combphy_grfcfgs = {
+	/* pipe-phy-grf */
+	.pcie_mode_set		= { 0x48000, 5, 0, 0x00, 0x11 },
+	.usb_mode_set		= { 0x48000, 5, 0, 0x00, 0x04 },
+	.pipe_rxterm_set	= { 0x48000, 12, 12, 0x00, 0x01 },
+	.pipe_txelec_set	= { 0x48004, 1, 1, 0x00, 0x01 },
+	.pipe_txcomp_set	= { 0x48004, 4, 4, 0x00, 0x01 },
+	.pipe_clk_24m		= { 0x48004, 14, 13, 0x00, 0x00 },
+	.pipe_clk_100m		= { 0x48004, 14, 13, 0x00, 0x02 },
+	.pipe_rxterm_sel	= { 0x48008, 8, 8, 0x00, 0x01 },
+	.pipe_txelec_sel	= { 0x48008, 12, 12, 0x00, 0x01 },
+	.pipe_txcomp_sel	= { 0x48008, 15, 15, 0x00, 0x01 },
+	.pipe_clk_ext		= { 0x4800c, 9, 8, 0x02, 0x01 },
+	.pipe_phy_status	= { 0x48034, 6, 6, 0x01, 0x00 },
+	.con0_for_pcie		= { 0x48000, 15, 0, 0x00, 0x110 },
+	.con1_for_pcie		= { 0x48004, 15, 0, 0x00, 0x00 },
+	.con2_for_pcie		= { 0x48008, 15, 0, 0x00, 0x101 },
+	.con3_for_pcie		= { 0x4800c, 15, 0, 0x00, 0x0200 },
+	/* pipe-grf */
+	.u3otg0_port_en		= { 0x40044, 15, 0, 0x0181, 0x1100 },
+};
+
+static const struct rockchip_combphy_cfg rk3528_combphy_cfgs = {
+	.grfcfg		= &rk3528_combphy_grfcfgs,
+	.combphy_cfg	= rk3528_combphy_cfg,
+};
+
+static int rk3562_combphy_cfg(struct rockchip_combphy_priv *priv)
+{
+	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
+	u32 val;
+
+	switch (priv->mode) {
+	case PHY_TYPE_PCIE:
+		/* Set SSC downward spread spectrum */
+		val = readl(priv->mmio + (0x1f << 2));
+		val &= ~GENMASK(5, 4);
+		val |= 0x01 << 4;
+		writel(val, priv->mmio + 0x7c);
+
+		param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
+		param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
+		param_write(priv->phy_grf, &cfg->con2_for_pcie, true);
+		param_write(priv->phy_grf, &cfg->con3_for_pcie, true);
+		break;
+	case PHY_TYPE_USB3:
+		/* Set SSC downward spread spectrum */
+		val = readl(priv->mmio + (0x1f << 2));
+		val &= ~GENMASK(5, 4);
+		val |= 0x01 << 4;
+		writel(val, priv->mmio + 0x7c);
+
+		/* Enable adaptive CTLE for USB3.0 Rx */
+		val = readl(priv->mmio + (0x0e << 2));
+		val &= ~GENMASK(0, 0);
+		val |= 0x01;
+		writel(val, priv->mmio + (0x0e << 2));
+
+		/* Set PLL KVCO fine tuning signals */
+		val = readl(priv->mmio + (0x20 << 2));
+		val &= ~(0x7 << 2);
+		val |= 0x2 << 2;
+		writel(val, priv->mmio + (0x20 << 2));
+
+		/* Set PLL LPF R1 to su_trim[10:7]=1001 */
+		writel(0x4, priv->mmio + (0xb << 2));
+
+		/* Set PLL input clock divider 1/2 */
+		val = readl(priv->mmio + (0x5 << 2));
+		val &= ~(0x3 << 6);
+		val |= 0x1 << 6;
+		writel(val, priv->mmio + (0x5 << 2));
+
+		/* Set PLL loop divider */
+		writel(0x32, priv->mmio + (0x11 << 2));
+
+		/* Set PLL KVCO to min and set PLL charge pump current to max */
+		writel(0xf0, priv->mmio + (0xa << 2));
+
+		param_write(priv->phy_grf, &cfg->pipe_sel_usb, true);
+		param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
+		param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
+		param_write(priv->phy_grf, &cfg->usb_mode_set, true);
+		break;
+	default:
+		pr_err("%s, phy-type %d\n", __func__, priv->mode);
+		return -EINVAL;
+	}
+
+	clk_set_rate(&priv->ref_clk, 100000000);
+	param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+
+	if (priv->mode == PHY_TYPE_PCIE) {
+		/* PLL KVCO tuning fine */
+		val = readl(priv->mmio + (0x20 << 2));
+		val &= ~(0x7 << 2);
+		val |= 0x2 << 2;
+		writel(val, priv->mmio + (0x20 << 2));
+
+		/* Enable controlling random jitter, aka RMJ */
+		writel(0x4, priv->mmio + (0xb << 2));
+
+		val = readl(priv->mmio + (0x5 << 2));
+		val &= ~(0x3 << 6);
+		val |= 0x1 << 6;
+		writel(val, priv->mmio + (0x5 << 2));
+
+		writel(0x32, priv->mmio + (0x11 << 2));
+		writel(0xf0, priv->mmio + (0xa << 2));
+	}
+
+	if (dev_read_bool(priv->dev, "rockchip,enable-ssc")) {
+		val = readl(priv->mmio + (0x7 << 2));
+		val |= BIT(4);
+		writel(val, priv->mmio + (0x7 << 2));
+	}
+
+	return 0;
+}
+
+static const struct rockchip_combphy_grfcfg rk3562_combphy_grfcfgs = {
+	/* pipe-phy-grf */
+	.pcie_mode_set		= { 0x0000, 5, 0, 0x00, 0x11 },
+	.usb_mode_set		= { 0x0000, 5, 0, 0x00, 0x04 },
+	.pipe_rxterm_set	= { 0x0000, 12, 12, 0x00, 0x01 },
+	.pipe_txelec_set	= { 0x0004, 1, 1, 0x00, 0x01 },
+	.pipe_txcomp_set	= { 0x0004, 4, 4, 0x00, 0x01 },
+	.pipe_clk_25m		= { 0x0004, 14, 13, 0x00, 0x01 },
+	.pipe_clk_100m		= { 0x0004, 14, 13, 0x00, 0x02 },
+	.pipe_phymode_sel	= { 0x0008, 1, 1, 0x00, 0x01 },
+	.pipe_rate_sel		= { 0x0008, 2, 2, 0x00, 0x01 },
+	.pipe_rxterm_sel	= { 0x0008, 8, 8, 0x00, 0x01 },
+	.pipe_txelec_sel	= { 0x0008, 12, 12, 0x00, 0x01 },
+	.pipe_txcomp_sel	= { 0x0008, 15, 15, 0x00, 0x01 },
+	.pipe_clk_ext		= { 0x000c, 9, 8, 0x02, 0x01 },
+	.pipe_sel_usb		= { 0x000c, 14, 13, 0x00, 0x01 },
+	.pipe_phy_status	= { 0x0034, 6, 6, 0x01, 0x00 },
+	.con0_for_pcie		= { 0x0000, 15, 0, 0x00, 0x1000 },
+	.con1_for_pcie		= { 0x0004, 15, 0, 0x00, 0x0000 },
+	.con2_for_pcie		= { 0x0008, 15, 0, 0x00, 0x0101 },
+	.con3_for_pcie		= { 0x000c, 15, 0, 0x00, 0x0200 },
+	.pipe_phy_grf_reset	= { 0x0014, 1, 0, 0x3, 0x1 },
+	/* pipe-grf */
+	.u3otg0_port_en		= { 0x0094, 15, 0, 0x0181, 0x1100 },
+};
+
+static const struct rockchip_combphy_cfg rk3562_combphy_cfgs = {
+	.grfcfg		= &rk3562_combphy_grfcfgs,
+	.combphy_cfg	= rk3562_combphy_cfg,
+};
 
 static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
 {
@@ -565,6 +784,14 @@
 
 static const struct udevice_id rockchip_combphy_ids[] = {
 	{
+		.compatible = "rockchip,rk3528-naneng-combphy",
+		.data = (ulong)&rk3528_combphy_cfgs
+	},
+	{
+		.compatible = "rockchip,rk3562-naneng-combphy",
+		.data = (ulong)&rk3562_combphy_cfgs
+	},
+	{
 		.compatible = "rockchip,rk3568-naneng-combphy",
 		.data = (ulong)&rk3568_combphy_cfgs
 	},
diff --git a/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c b/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c
index 4044db6..bc718d0 100644
--- a/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c
+++ b/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c
@@ -592,9 +592,21 @@
 					   struct phy_configure_opts_dp *dp)
 {
 	u8 lane;
+	u32 status;
+	int ret;
 
 	for (lane = 0; lane < dp->lanes; lane++)
 		rockchip_hdptx_phy_set_voltage(hdptx, dp, lane);
+
+	reset_deassert(&hdptx->lane_reset);
+
+	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
+				       status, FIELD_GET(PHY_RDY, status),
+				       50, 5000);
+	if (ret) {
+		dev_err(hdptx->dev, "timeout waiting for phy_rdy\n");
+		return ret;
+	}
 
 	return 0;
 }
@@ -676,17 +688,6 @@
 
 	regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN,
 			   FIELD_PREP(LANE_EN, GENMASK(dp->lanes - 1, 0)));
-
-	reset_deassert(&hdptx->lane_reset);
-	udelay(10);
-
-	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
-				       status, FIELD_GET(PHY_RDY, status),
-				       50, 1000);
-	if (ret) {
-		dev_err(hdptx->dev, "timeout waiting for phy_rdy\n");
-		return ret;
-	}
 
 	return 0;
 }
diff --git a/u-boot/drivers/phy/phy-rockchip-usbdp.c b/u-boot/drivers/phy/phy-rockchip-usbdp.c
index 7b624f8..cefceff 100644
--- a/u-boot/drivers/phy/phy-rockchip-usbdp.c
+++ b/u-boot/drivers/phy/phy-rockchip-usbdp.c
@@ -549,14 +549,15 @@
 	return 0;
 }
 
-static int udphy_parse_lane_mux_data(struct rockchip_udphy *udphy, const struct device_node *np)
+static int udphy_parse_lane_mux_data(struct rockchip_udphy *udphy, struct udevice *dev)
 {
+	const struct device_node *np = ofnode_to_np(dev->node);
 	struct property *prop;
 	int ret, i, len, num_lanes;
 
 	prop = of_find_property(np, "rockchip,dp-lane-mux", &len);
 	if (!prop) {
-		dev_dbg(udphy->dev, "failed to find dp lane mux, following dp alt mode\n");
+		dev_dbg(dev, "failed to find dp lane mux, following dp alt mode\n");
 		udphy->mode = UDPHY_MODE_USB;
 		return 0;
 	}
@@ -564,13 +565,13 @@
 	num_lanes = len / sizeof(u32);
 
 	if (num_lanes != 2 && num_lanes != 4) {
-		dev_err(udphy->dev, "invalid number of lane mux\n");
+		dev_err(dev, "invalid number of lane mux\n");
 		return -EINVAL;
 	}
 
 	ret = of_read_u32_array(np, "rockchip,dp-lane-mux", udphy->dp_lane_sel, num_lanes);
 	if (ret) {
-		dev_err(udphy->dev, "get dp lane mux failed\n");
+		dev_err(dev, "get dp lane mux failed\n");
 		return -EINVAL;
 	}
 
@@ -578,7 +579,7 @@
 		int j;
 
 		if (udphy->dp_lane_sel[i] > 3) {
-			dev_err(udphy->dev, "lane mux between 0 and 3, exceeding the range\n");
+			dev_err(dev, "lane mux between 0 and 3, exceeding the range\n");
 			return -EINVAL;
 		}
 
@@ -586,22 +587,23 @@
 
 		for (j = i + 1; j < num_lanes; j++) {
 			if (udphy->dp_lane_sel[i] == udphy->dp_lane_sel[j]) {
-				dev_err(udphy->dev, "set repeat lane mux value\n");
+				dev_err(dev, "set repeat lane mux value\n");
 				return -EINVAL;
 			}
 		}
 	}
 
 	udphy->mode = UDPHY_MODE_DP;
-	if (num_lanes == 2)
+	if (num_lanes == 2) {
 		udphy->mode |= UDPHY_MODE_USB;
+		udphy->flip = udphy->lane_mux_sel[0] == PHY_LANE_MUX_DP ? true : false;
+	}
 
 	return 0;
 }
 
 static int udphy_parse_dt(struct rockchip_udphy *udphy, struct udevice *dev)
 {
-	const struct device_node *np = ofnode_to_np(dev->node);
 	enum usb_device_speed maximum_speed;
 	int ret;
 
@@ -645,7 +647,7 @@
 		}
 	}
 
-	ret = udphy_parse_lane_mux_data(udphy, np);
+	ret = udphy_parse_lane_mux_data(udphy, dev);
 	if (ret)
 		return ret;
 
@@ -947,7 +949,7 @@
 
 	dev_for_each_subnode(subnode, parent) {
 		if (!ofnode_valid(subnode)) {
-			printf("%s: no subnode for %s", __func__, parent->name);
+			printf("%s: no subnode for %s\n", __func__, parent->name);
 			return -ENXIO;
 		}
 
@@ -1014,14 +1016,14 @@
 						       val & TRSV_LN0_MON_RX_CDR_LOCK_DONE,
 						       200, 100);
 			if (ret)
-				dev_err(udphy->dev, "trsv ln0 mon rx cdr lock timeout\n");
+				dev_notice(udphy->dev, "trsv ln0 mon rx cdr lock timeout\n");
 		} else {
 			ret = regmap_read_poll_timeout(udphy->pma_regmap,
 						       TRSV_LN2_MON_RX_CDR_DONE_OFFSET, val,
 						       val & TRSV_LN2_MON_RX_CDR_LOCK_DONE,
 						       200, 100);
 			if (ret)
-				dev_err(udphy->dev, "trsv ln2 mon rx cdr lock timeout\n");
+				dev_notice(udphy->dev, "trsv ln2 mon rx cdr lock timeout\n");
 		}
 	}
 
diff --git a/u-boot/drivers/pinctrl/Kconfig b/u-boot/drivers/pinctrl/Kconfig
index b6c741c..4899c71 100644
--- a/u-boot/drivers/pinctrl/Kconfig
+++ b/u-boot/drivers/pinctrl/Kconfig
@@ -145,14 +145,6 @@
 	  This option is to enable the pinctrl driver for Maxim
 	  MAX96745.
 
-config PINCTRL_MAX96752F
-	bool "Maxim MAX96752F pinctrl driver"
-	depends on DM && I2C_MUX_MAX96752F
-	select PINCONF
-	help
-	  This option is to enable the pinctrl driver for Maxim
-	  MAX96752F.
-
 config PINCTRL_MAX96755F
 	bool "Maxim MAX96755F pinctrl driver"
 	depends on DM && I2C_MUX_MAX96755F
diff --git a/u-boot/drivers/pinctrl/Makefile b/u-boot/drivers/pinctrl/Makefile
index 6fd7798..23f26a6 100644
--- a/u-boot/drivers/pinctrl/Makefile
+++ b/u-boot/drivers/pinctrl/Makefile
@@ -24,6 +24,5 @@
 obj-$(CONFIG_PINCTRL_STM32)	+= pinctrl_stm32.o
 ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_PINCTRL_MAX96745)  += pinctrl-max96745.o
-obj-$(CONFIG_PINCTRL_MAX96752F) += pinctrl-max96752f.o
 obj-$(CONFIG_PINCTRL_MAX96755F) += pinctrl-max96755f.o
 endif
diff --git a/u-boot/drivers/pinctrl/pinctrl-max96752f.c b/u-boot/drivers/pinctrl/pinctrl-max96752f.c
deleted file mode 100644
index e24df35..0000000
--- a/u-boot/drivers/pinctrl/pinctrl-max96752f.c
+++ /dev/null
@@ -1,491 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2022 Rockchip Electronics Co., Ltd
- */
-
-#include <common.h>
-#include <dm.h>
-#include <dm/pinctrl.h>
-#include <errno.h>
-#include <i2c.h>
-#include <max96752f.h>
-
-struct config_desc {
-	u16 reg;
-	u8 mask;
-	u8 val;
-};
-
-struct function_desc {
-	const char *name;
-	const char **group_names;
-	int num_group_names;
-
-	u8 gpio_out_dis:1;
-	u8 gpio_tx_en:1;
-	u8 gpio_rx_en:1;
-	u8 oldi:1;
-	u8 gpio_tx_id;
-	u8 gpio_rx_id;
-};
-
-struct group_desc {
-	const char *name;
-	int *pins;
-	int num_pins;
-
-	const struct config_desc *configs;
-	int num_configs;
-};
-
-struct pin_desc {
-	unsigned number;
-	const char *name;
-};
-
-static const struct pin_desc max96752f_pins[] = {
-	{0, "oldi"},
-	{1, "gpio1"},
-	{2, "gpio2"},
-	{3, "gpio3"},
-	{4, "gpio4"},
-	{5, "gpio5"},
-	{6, "gpio6"},
-	{7, "gpio7"},
-	{8, "gpio8"},
-	{9, "gpio9"},
-	{10, "gpio10"},
-	{11, "gpio11"},
-	{12, "gpio12"},
-	{13, "gpio13"},
-	{14, "gpio14"},
-	{15, "gpio15"},
-};
-
-static int oldi_pins[] = {0};
-static int gpio1_pins[] = {1};
-static int gpio2_pins[] = {2};
-static int gpio3_pins[] = {3};
-static int gpio4_pins[] = {4};
-static int gpio5_pins[] = {5};
-static int gpio6_pins[] = {6};
-static int gpio7_pins[] = {7};
-static int gpio8_pins[] = {8};
-static int gpio9_pins[] = {9};
-static int gpio10_pins[] = {10};
-static int gpio11_pins[] = {11};
-static int gpio12_pins[] = {12};
-static int gpio13_pins[] = {13};
-static int gpio14_pins[] = {14};
-static int gpio15_pins[] = {15};
-
-#define GROUP_DESC(nm) \
-{ \
-	.name = #nm, \
-	.pins = nm ## _pins, \
-	.num_pins = ARRAY_SIZE(nm ## _pins), \
-}
-
-#define GROUP_DESC_CONFIG(nm) \
-{ \
-	.name = #nm, \
-	.pins = nm ## _pins, \
-	.num_pins = ARRAY_SIZE(nm ## _pins), \
-	.configs = nm ## _configs, \
-	.num_configs = ARRAY_SIZE(nm ## _configs), \
-}
-
-static const struct config_desc gpio6_configs[] = {
-	{ 0x0002, AUD_TX_EN, 0 },
-};
-
-static const struct config_desc gpio7_configs[] = {
-	{ 0x0002, AUD_TX_EN, 0 },
-};
-
-static const struct config_desc gpio8_configs[] = {
-	{ 0x0002, AUD_TX_EN, 0 },
-};
-
-static const struct config_desc gpio11_configs[] = {
-	{ 0x0140, AUD_RX_EN, 0 },
-};
-
-static const struct config_desc gpio12_configs[] = {
-	{ 0x0140, AUD_RX_EN, 0 },
-};
-
-static const struct config_desc gpio13_configs[] = {
-	{ 0x0140, AUD_RX_EN, 0 },
-};
-
-static const struct group_desc max96752f_groups[] = {
-	GROUP_DESC(oldi),
-	GROUP_DESC(gpio1),
-	GROUP_DESC(gpio2),
-	GROUP_DESC(gpio3),
-	GROUP_DESC(gpio4),
-	GROUP_DESC(gpio5),
-	GROUP_DESC_CONFIG(gpio6),
-	GROUP_DESC_CONFIG(gpio7),
-	GROUP_DESC_CONFIG(gpio8),
-	GROUP_DESC(gpio9),
-	GROUP_DESC(gpio10),
-	GROUP_DESC_CONFIG(gpio11),
-	GROUP_DESC_CONFIG(gpio12),
-	GROUP_DESC_CONFIG(gpio13),
-	GROUP_DESC(gpio14),
-	GROUP_DESC(gpio15),
-};
-
-static const char *gpio_groups[] = {
-	"reserved", "gpio1", "gpio2", "gpio3", "gpio4",
-	"gpio5", "gpio6", "gpio7", "gpio8", "gpio9",
-	"gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
-	"gpio15",
-};
-
-static const char *oldi_groups[] = { "oldi" };
-
-#define FUNCTION_DESC_GPIO_RX(id) \
-{ \
-	.name = "GPIO_RX_"#id, \
-	.group_names = gpio_groups, \
-	.num_group_names = ARRAY_SIZE(gpio_groups), \
-	.gpio_rx_en = 1, \
-	.gpio_rx_id = id, \
-} \
-
-#define FUNCTION_DESC_GPIO_TX(id) \
-{ \
-	.name = "GPIO_TX_"#id, \
-	.group_names = gpio_groups, \
-	.num_group_names = ARRAY_SIZE(gpio_groups), \
-	.gpio_out_dis = 1, \
-	.gpio_tx_en = 1, \
-	.gpio_tx_id = id \
-} \
-
-#define FUNCTION_DESC_GPIO() \
-{ \
-	.name = "GPIO", \
-	.group_names = gpio_groups, \
-	.num_group_names = ARRAY_SIZE(gpio_groups), \
-} \
-
-#define FUNCTION_DESC_OLDI() \
-{ \
-	.name = "OLDI", \
-	.group_names = oldi_groups, \
-	.num_group_names = ARRAY_SIZE(oldi_groups), \
-	.oldi = 1, \
-} \
-
-static const struct function_desc max96752f_functions[] = {
-	FUNCTION_DESC_GPIO_TX(0),
-	FUNCTION_DESC_GPIO_TX(1),
-	FUNCTION_DESC_GPIO_TX(2),
-	FUNCTION_DESC_GPIO_TX(3),
-	FUNCTION_DESC_GPIO_TX(4),
-	FUNCTION_DESC_GPIO_TX(5),
-	FUNCTION_DESC_GPIO_TX(6),
-	FUNCTION_DESC_GPIO_TX(7),
-	FUNCTION_DESC_GPIO_TX(8),
-	FUNCTION_DESC_GPIO_TX(9),
-	FUNCTION_DESC_GPIO_TX(10),
-	FUNCTION_DESC_GPIO_TX(11),
-	FUNCTION_DESC_GPIO_TX(12),
-	FUNCTION_DESC_GPIO_TX(13),
-	FUNCTION_DESC_GPIO_TX(14),
-	FUNCTION_DESC_GPIO_TX(15),
-	FUNCTION_DESC_GPIO_TX(16),
-	FUNCTION_DESC_GPIO_TX(17),
-	FUNCTION_DESC_GPIO_TX(18),
-	FUNCTION_DESC_GPIO_TX(19),
-	FUNCTION_DESC_GPIO_TX(20),
-	FUNCTION_DESC_GPIO_TX(21),
-	FUNCTION_DESC_GPIO_TX(22),
-	FUNCTION_DESC_GPIO_TX(23),
-	FUNCTION_DESC_GPIO_TX(24),
-	FUNCTION_DESC_GPIO_TX(25),
-	FUNCTION_DESC_GPIO_TX(26),
-	FUNCTION_DESC_GPIO_TX(27),
-	FUNCTION_DESC_GPIO_TX(28),
-	FUNCTION_DESC_GPIO_TX(29),
-	FUNCTION_DESC_GPIO_TX(30),
-	FUNCTION_DESC_GPIO_TX(31),
-	FUNCTION_DESC_GPIO_RX(0),
-	FUNCTION_DESC_GPIO_RX(1),
-	FUNCTION_DESC_GPIO_RX(2),
-	FUNCTION_DESC_GPIO_RX(3),
-	FUNCTION_DESC_GPIO_RX(4),
-	FUNCTION_DESC_GPIO_RX(5),
-	FUNCTION_DESC_GPIO_RX(6),
-	FUNCTION_DESC_GPIO_RX(7),
-	FUNCTION_DESC_GPIO_RX(8),
-	FUNCTION_DESC_GPIO_RX(9),
-	FUNCTION_DESC_GPIO_RX(10),
-	FUNCTION_DESC_GPIO_RX(11),
-	FUNCTION_DESC_GPIO_RX(12),
-	FUNCTION_DESC_GPIO_RX(13),
-	FUNCTION_DESC_GPIO_RX(14),
-	FUNCTION_DESC_GPIO_RX(15),
-	FUNCTION_DESC_GPIO_RX(16),
-	FUNCTION_DESC_GPIO_RX(17),
-	FUNCTION_DESC_GPIO_RX(18),
-	FUNCTION_DESC_GPIO_RX(19),
-	FUNCTION_DESC_GPIO_RX(20),
-	FUNCTION_DESC_GPIO_RX(21),
-	FUNCTION_DESC_GPIO_RX(22),
-	FUNCTION_DESC_GPIO_RX(23),
-	FUNCTION_DESC_GPIO_RX(24),
-	FUNCTION_DESC_GPIO_RX(25),
-	FUNCTION_DESC_GPIO_RX(26),
-	FUNCTION_DESC_GPIO_RX(27),
-	FUNCTION_DESC_GPIO_RX(28),
-	FUNCTION_DESC_GPIO_RX(29),
-	FUNCTION_DESC_GPIO_RX(30),
-	FUNCTION_DESC_GPIO_RX(31),
-	FUNCTION_DESC_GPIO(),
-	FUNCTION_DESC_OLDI(),
-};
-
-static int max96752f_get_pins_count(struct udevice *dev)
-{
-	return ARRAY_SIZE(max96752f_pins);
-}
-
-static const char *max96752f_get_pin_name(struct udevice *dev,
-					  unsigned selector)
-{
-	return max96752f_pins[selector].name;
-}
-
-static int max96752f_pinctrl_get_groups_count(struct udevice *dev)
-{
-	return ARRAY_SIZE(max96752f_groups);
-}
-
-static const char *max96752f_pinctrl_get_group_name(struct udevice *dev,
-						    unsigned selector)
-{
-	return max96752f_groups[selector].name;
-}
-
-static int max96752f_pinctrl_get_functions_count(struct udevice *dev)
-{
-	return ARRAY_SIZE(max96752f_functions);
-}
-
-static const char *max96752f_pinctrl_get_function_name(struct udevice *dev,
-						       unsigned selector)
-{
-	return max96752f_functions[selector].name;
-}
-
-static int max96752f_pinmux_set(struct udevice *dev, unsigned group_selector,
-				unsigned func_selector)
-{
-	const struct group_desc *grp = &max96752f_groups[group_selector];
-	const struct function_desc *func = &max96752f_functions[func_selector];
-	int i, ret;
-
-	if (func->oldi)
-		return 0;
-
-	for (i = 0; i < grp->num_configs; i++) {
-		const struct config_desc *config = &grp->configs[i];
-
-		ret = dm_i2c_reg_clrset(dev->parent, config->reg, config->mask,
-					config->val);
-		if (ret < 0)
-			return ret;
-	}
-
-	for (i = 0; i < grp->num_pins; i++) {
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(grp->pins[i]),
-					GPIO_OUT_DIS | GPIO_RX_EN | GPIO_TX_EN,
-					FIELD_PREP(GPIO_OUT_DIS, func->gpio_out_dis) |
-					FIELD_PREP(GPIO_RX_EN, func->gpio_rx_en) |
-					FIELD_PREP(GPIO_TX_EN, func->gpio_tx_en));
-		if (ret < 0)
-			return ret;
-
-		if (func->gpio_tx_en) {
-			ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(grp->pins[i]),
-						GPIO_TX_ID,
-						FIELD_PREP(GPIO_TX_ID, func->gpio_tx_id));
-			if (ret < 0)
-				return ret;
-		}
-
-		if (func->gpio_rx_en) {
-			ret = dm_i2c_reg_clrset(dev->parent,
-						GPIO_C_REG(grp->pins[i]),
-						GPIO_RX_ID,
-						FIELD_PREP(GPIO_RX_ID, func->gpio_rx_id));
-			if (ret < 0)
-				return ret;
-		}
-	}
-
-	return 0;
-}
-
-#define PIN_CONFIG_OLDI_SPL_EN		(PIN_CONFIG_END + 1)
-#define PIN_CONFIG_OLDI_SWAP_AB		(PIN_CONFIG_END + 2)
-
-static const struct pinconf_param max96752f_pinconf_params[] = {
-	{ "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 },
-	{ "drive-push-pull", PIN_CONFIG_DRIVE_PUSH_PULL, 0 },
-	{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
-	{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 40000 },
-	{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 40000 },
-	{ "output-low", PIN_CONFIG_OUTPUT, 0 },
-	{ "output-high", PIN_CONFIG_OUTPUT, 1 },
-	{ "oldi-spl-en", PIN_CONFIG_OLDI_SPL_EN, 0 },
-	{ "oldi-swap-ab", PIN_CONFIG_OLDI_SWAP_AB, 0 },
-};
-
-static int max96752f_pinconf_set(struct udevice *dev, unsigned int pin,
-				 unsigned int param, unsigned int arg)
-{
-	u8 res_cfg;
-	int ret;
-
-	switch (param) {
-	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(pin), OUT_TYPE,
-					FIELD_PREP(OUT_TYPE, 0));
-		if (ret < 0)
-			return ret;
-
-		break;
-	case PIN_CONFIG_DRIVE_PUSH_PULL:
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(pin), OUT_TYPE,
-					FIELD_PREP(OUT_TYPE, 1));
-		if (ret < 0)
-			return ret;
-
-		break;
-	case PIN_CONFIG_BIAS_DISABLE:
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin),
-					PULL_UPDN_SEL,
-					FIELD_PREP(PULL_UPDN_SEL, 0));
-		if (ret < 0)
-			return ret;
-
-		break;
-	case PIN_CONFIG_BIAS_PULL_UP:
-		switch (arg) {
-		case 40000:
-			res_cfg = 0;
-			break;
-		case 1000000:
-			res_cfg = 1;
-			break;
-		default:
-			return -EINVAL;
-		}
-
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin), RES_CFG,
-					FIELD_PREP(RES_CFG, res_cfg));
-		if (ret < 0)
-			return ret;
-
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin),
-					PULL_UPDN_SEL,
-					FIELD_PREP(PULL_UPDN_SEL, 1));
-		if (ret < 0)
-			return ret;
-
-		break;
-	case PIN_CONFIG_BIAS_PULL_DOWN:
-		switch (arg) {
-		case 40000:
-			res_cfg = 0;
-			break;
-		case 1000000:
-			res_cfg = 1;
-			break;
-		default:
-			return -EINVAL;
-		}
-
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin), RES_CFG,
-					FIELD_PREP(RES_CFG, res_cfg));
-		if (ret < 0)
-			return ret;
-
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin),
-					PULL_UPDN_SEL,
-					FIELD_PREP(PULL_UPDN_SEL, 2));
-		if (ret < 0)
-			return ret;
-
-		break;
-	case PIN_CONFIG_OUTPUT:
-		ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin),
-					GPIO_OUT_DIS | GPIO_OUT,
-					FIELD_PREP(GPIO_OUT_DIS, 0) |
-					FIELD_PREP(GPIO_OUT, arg));
-		if (ret < 0)
-			return ret;
-
-		break;
-	case PIN_CONFIG_OLDI_SPL_EN:
-		if (pin > 0)
-			return -EINVAL;
-
-		ret = dm_i2c_reg_clrset(dev->parent, OLDI_REG(1),
-					OLDI_SPL_EN | OLDI_SPL_POL,
-					FIELD_PREP(OLDI_SPL_EN, 1) |
-					FIELD_PREP(OLDI_SPL_POL, 0));
-		if (ret < 0)
-			return ret;
-
-		break;
-	case PIN_CONFIG_OLDI_SWAP_AB:
-		if (pin > 0)
-			return -EINVAL;
-
-		ret = dm_i2c_reg_clrset(dev->parent, OLDI_REG(1), OLDI_SWAP_AB,
-					FIELD_PREP(OLDI_SWAP_AB, 1));
-		if (ret < 0)
-			return ret;
-
-		break;
-	default:
-		dev_err(dev, "unsupported configuration parameter %u\n", param);
-		return -ENOTSUPP;
-	}
-
-	return 0;
-}
-
-static const struct pinctrl_ops max96752f_pinctrl_ops = {
-	.get_pins_count = max96752f_get_pins_count,
-	.get_pin_name = max96752f_get_pin_name,
-	.get_groups_count = max96752f_pinctrl_get_groups_count,
-	.get_group_name = max96752f_pinctrl_get_group_name,
-	.get_functions_count = max96752f_pinctrl_get_functions_count,
-	.get_function_name = max96752f_pinctrl_get_function_name,
-	.set_state = pinctrl_generic_set_state,
-	.pinmux_set = max96752f_pinmux_set,
-	.pinmux_group_set = max96752f_pinmux_set,
-	.pinconf_num_params = ARRAY_SIZE(max96752f_pinconf_params),
-	.pinconf_params = max96752f_pinconf_params,
-	.pinconf_set = max96752f_pinconf_set,
-};
-
-static const struct udevice_id max96752f_pinctrl_of_match[] = {
-	{ .compatible = "maxim,max96752f-pinctrl" },
-	{ }
-};
-
-U_BOOT_DRIVER(max96752f_pinctrl) = {
-	.name = "pinctrl-max96752f",
-	.id = UCLASS_PINCTRL,
-	.of_match = max96752f_pinctrl_of_match,
-	.ops = &max96752f_pinctrl_ops,
-};
diff --git a/u-boot/drivers/pinctrl/rockchip/Makefile b/u-boot/drivers/pinctrl/rockchip/Makefile
index 9b3c7fc..b82e92b 100644
--- a/u-boot/drivers/pinctrl/rockchip/Makefile
+++ b/u-boot/drivers/pinctrl/rockchip/Makefile
@@ -12,6 +12,8 @@
 #obj-$(CONFIG_ROCKCHIP_RK3328) += pinctrl-rk3328.o
 #obj-$(CONFIG_ROCKCHIP_RK3368) += pinctrl-rk3368.o
 #obj-$(CONFIG_ROCKCHIP_RK3399) += pinctrl-rk3399.o
+obj-$(CONFIG_ROCKCHIP_RK3528) += pinctrl-rk3528.o
+obj-$(CONFIG_ROCKCHIP_RK3562) += pinctrl-rk3562.o
 obj-$(CONFIG_ROCKCHIP_RK3568) += pinctrl-rk3568.o
 obj-$(CONFIG_ROCKCHIP_RK3588) += pinctrl-rk3588.o
 obj-$(CONFIG_ROCKCHIP_RV1106) += pinctrl-rv1106.o
diff --git a/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c
new file mode 100644
index 0000000..33d44c9
--- /dev/null
+++ b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c
@@ -0,0 +1,313 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/pinctrl.h>
+#include <regmap.h>
+#include <syscon.h>
+
+#include "pinctrl-rockchip.h"
+
+static int rk3528_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+	int iomux_num = (pin / 8);
+	struct regmap *regmap;
+	int reg, ret, mask;
+	u8 bit;
+	u32 data;
+
+	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
+
+	regmap = priv->regmap_base;
+	reg = bank->iomux[iomux_num].offset;
+	if ((pin % 8) >= 4)
+		reg += 0x4;
+	bit = (pin % 4) * 4;
+	mask = 0xf;
+
+	data = (mask << (bit + 16));
+	data |= (mux & mask) << bit;
+
+	debug("iomux write reg = %x data = %x\n", reg, data);
+
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+#define RK3528_DRV_BITS_PER_PIN		8
+#define RK3528_DRV_PINS_PER_REG		2
+#define RK3528_DRV_GPIO0_OFFSET		0x100
+#define RK3528_DRV_GPIO1_OFFSET		0x20120
+#define RK3528_DRV_GPIO2_OFFSET		0x30160
+#define RK3528_DRV_GPIO3_OFFSET		0x20190
+#define RK3528_DRV_GPIO4_OFFSET		0x101C0
+
+static void rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
+					int pin_num, struct regmap **regmap,
+					int *reg, u8 *bit)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+
+	*regmap = priv->regmap_base;
+	switch (bank->bank_num) {
+	case 0:
+		*reg = RK3528_DRV_GPIO0_OFFSET;
+		break;
+
+	case 1:
+		*reg = RK3528_DRV_GPIO1_OFFSET;
+		break;
+
+	case 2:
+		*reg = RK3528_DRV_GPIO2_OFFSET;
+		break;
+
+	case 3:
+		*reg = RK3528_DRV_GPIO3_OFFSET;
+		break;
+
+	case 4:
+		*reg = RK3528_DRV_GPIO4_OFFSET;
+		break;
+
+	default:
+		*reg = 0;
+		dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num);
+		break;
+	}
+
+	*reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4);
+	*bit = pin_num % RK3528_DRV_PINS_PER_REG;
+	*bit *= RK3528_DRV_BITS_PER_PIN;
+}
+
+static int rk3528_set_drive(struct rockchip_pin_bank *bank,
+			    int pin_num, int strength)
+{
+	struct regmap *regmap;
+	int reg, ret;
+	u32 data;
+	u8 bit;
+	int drv = (1 << (strength + 1)) - 1;
+
+	rk3528_calc_drv_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+
+	/* enable the write to the equivalent lower bits */
+	data = ((1 << RK3528_DRV_BITS_PER_PIN) - 1) << (bit + 16);
+	data |= (drv << bit);
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+#define RK3528_PULL_BITS_PER_PIN		2
+#define RK3528_PULL_PINS_PER_REG		8
+#define RK3528_PULL_GPIO0_OFFSET		0x200
+#define RK3528_PULL_GPIO1_OFFSET		0x20210
+#define RK3528_PULL_GPIO2_OFFSET		0x30220
+#define RK3528_PULL_GPIO3_OFFSET		0x20230
+#define RK3528_PULL_GPIO4_OFFSET		0x10240
+
+static void rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
+					 int pin_num, struct regmap **regmap,
+					 int *reg, u8 *bit)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+
+	*regmap = priv->regmap_base;
+	switch (bank->bank_num) {
+	case 0:
+		*reg = RK3528_PULL_GPIO0_OFFSET;
+		break;
+
+	case 1:
+		*reg = RK3528_PULL_GPIO1_OFFSET;
+		break;
+
+	case 2:
+		*reg = RK3528_PULL_GPIO2_OFFSET;
+		break;
+
+	case 3:
+		*reg = RK3528_PULL_GPIO3_OFFSET;
+		break;
+
+	case 4:
+		*reg = RK3528_PULL_GPIO4_OFFSET;
+		break;
+
+	default:
+		*reg = 0;
+		dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num);
+		break;
+	}
+
+	*reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4);
+	*bit = pin_num % RK3528_PULL_PINS_PER_REG;
+	*bit *= RK3528_PULL_BITS_PER_PIN;
+}
+
+static int rk3528_set_pull(struct rockchip_pin_bank *bank,
+			   int pin_num, int pull)
+{
+	struct regmap *regmap;
+	int reg, ret;
+	u8 bit, type;
+	u32 data;
+
+	if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
+		return -ENOTSUPP;
+
+	rk3528_calc_pull_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+	type = bank->pull_type[pin_num / 8];
+	ret = rockchip_translate_pull_value(type, pull);
+	if (ret < 0) {
+		debug("unsupported pull setting %d\n", pull);
+		return ret;
+	}
+
+	/* enable the write to the equivalent lower bits */
+	data = ((1 << RK3528_PULL_BITS_PER_PIN) - 1) << (bit + 16);
+
+	data |= (ret << bit);
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+#define RK3528_SMT_BITS_PER_PIN		1
+#define RK3528_SMT_PINS_PER_REG		8
+#define RK3528_SMT_GPIO0_OFFSET		0x400
+#define RK3528_SMT_GPIO1_OFFSET		0x20410
+#define RK3528_SMT_GPIO2_OFFSET		0x30420
+#define RK3528_SMT_GPIO3_OFFSET		0x20430
+#define RK3528_SMT_GPIO4_OFFSET		0x10440
+
+static int rk3528_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
+					   int pin_num,
+					   struct regmap **regmap,
+					   int *reg, u8 *bit)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+
+	*regmap = priv->regmap_base;
+	switch (bank->bank_num) {
+	case 0:
+		*reg = RK3528_SMT_GPIO0_OFFSET;
+		break;
+
+	case 1:
+		*reg = RK3528_SMT_GPIO1_OFFSET;
+		break;
+
+	case 2:
+		*reg = RK3528_SMT_GPIO2_OFFSET;
+		break;
+
+	case 3:
+		*reg = RK3528_SMT_GPIO3_OFFSET;
+		break;
+
+	case 4:
+		*reg = RK3528_SMT_GPIO4_OFFSET;
+		break;
+
+	default:
+		*reg = 0;
+		dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num);
+		break;
+	}
+
+	*reg += ((pin_num / RK3528_SMT_PINS_PER_REG) * 4);
+	*bit = pin_num % RK3528_SMT_PINS_PER_REG;
+	*bit *= RK3528_SMT_BITS_PER_PIN;
+	return 0;
+}
+
+static int rk3528_set_schmitt(struct rockchip_pin_bank *bank,
+			      int pin_num, int enable)
+{
+	struct regmap *regmap;
+	int reg, ret;
+	u32 data;
+	u8 bit;
+
+	rk3528_calc_schmitt_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+
+	/* enable the write to the equivalent lower bits */
+	data = ((1 << RK3528_SMT_BITS_PER_PIN) - 1) << (bit + 16);
+	data |= (enable << bit);
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+static struct rockchip_pin_bank rk3528_pin_banks[] = {
+	PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0, 0, 0, 0),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0x20020, 0x20028, 0x20030, 0x20038),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0x30040, 0, 0, 0),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0x20060, 0x20068, 0x20070, 0),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(4, 32, "gpio4",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0x10080, 0x10088, 0x10090, 0x10098),
+};
+
+static const struct rockchip_pin_ctrl rk3528_pin_ctrl = {
+	.pin_banks		= rk3528_pin_banks,
+	.nr_banks		= ARRAY_SIZE(rk3528_pin_banks),
+	.nr_pins		= 160,
+	.grf_mux_offset		= 0x0,
+	.set_mux		= rk3528_set_mux,
+	.set_pull		= rk3528_set_pull,
+	.set_drive		= rk3528_set_drive,
+	.set_schmitt		= rk3528_set_schmitt,
+};
+
+static const struct udevice_id rk3528_pinctrl_ids[] = {
+	{
+		.compatible = "rockchip,rk3528-pinctrl",
+		.data = (ulong)&rk3528_pin_ctrl
+	},
+	{ }
+};
+
+U_BOOT_DRIVER(pinctrl_rk3528) = {
+	.name		= "rockchip_rk3528_pinctrl",
+	.id		= UCLASS_PINCTRL,
+	.of_match	= rk3528_pinctrl_ids,
+	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
+	.ops		= &rockchip_pinctrl_ops,
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.bind		= dm_scan_fdt_dev,
+#endif
+	.probe		= rockchip_pinctrl_probe,
+};
+
diff --git a/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c
new file mode 100644
index 0000000..d81fb79
--- /dev/null
+++ b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c
@@ -0,0 +1,324 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <dm/pinctrl.h>
+#include <regmap.h>
+#include <syscon.h>
+
+#include "pinctrl-rockchip.h"
+
+static int rk3562_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+	int iomux_num = (pin / 8);
+	struct regmap *regmap;
+	int reg, ret, mask;
+	u8 bit;
+	u32 data;
+
+	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
+
+	regmap = priv->regmap_base;
+	reg = bank->iomux[iomux_num].offset;
+	if ((pin % 8) >= 4)
+		reg += 0x4;
+	bit = (pin % 4) * 4;
+	mask = 0xf;
+
+	data = (mask << (bit + 16));
+	data |= (mux & mask) << bit;
+
+	/* force jtag m1 */
+	if (bank->bank_num == 1) {
+		if ((pin == 13) || (pin == 14)) {
+			if (mux == 1) {
+				regmap_write(regmap, 0x504, 0x10001);
+			} else {
+				regmap_write(regmap, 0x504, 0x10000);
+			}
+		}
+	}
+
+	debug("iomux write reg = %x data = %x\n", reg, data);
+
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+#define RK3562_DRV_BITS_PER_PIN		8
+#define RK3562_DRV_PINS_PER_REG		2
+#define RK3562_DRV_GPIO0_OFFSET		0x20070
+#define RK3562_DRV_GPIO1_OFFSET		0x200
+#define RK3562_DRV_GPIO2_OFFSET		0x240
+#define RK3562_DRV_GPIO3_OFFSET		0x10280
+#define RK3562_DRV_GPIO4_OFFSET		0x102C0
+
+static void rk3562_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
+					int pin_num, struct regmap **regmap,
+					int *reg, u8 *bit)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+
+	*regmap = priv->regmap_base;
+	switch (bank->bank_num) {
+	case 0:
+		*reg = RK3562_DRV_GPIO0_OFFSET;
+		break;
+
+	case 1:
+		*reg = RK3562_DRV_GPIO1_OFFSET;
+		break;
+
+	case 2:
+		*reg = RK3562_DRV_GPIO2_OFFSET;
+		break;
+
+	case 3:
+		*reg = RK3562_DRV_GPIO3_OFFSET;
+		break;
+
+	case 4:
+		*reg = RK3562_DRV_GPIO4_OFFSET;
+		break;
+
+	default:
+		*reg = 0;
+		dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num);
+		break;
+	}
+
+	*reg += ((pin_num / RK3562_DRV_PINS_PER_REG) * 4);
+	*bit = pin_num % RK3562_DRV_PINS_PER_REG;
+	*bit *= RK3562_DRV_BITS_PER_PIN;
+}
+
+static int rk3562_set_drive(struct rockchip_pin_bank *bank,
+			    int pin_num, int strength)
+{
+	struct regmap *regmap;
+	int reg, ret;
+	u32 data;
+	u8 bit;
+	int drv = (1 << (strength + 1)) - 1;
+
+	rk3562_calc_drv_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+
+	/* enable the write to the equivalent lower bits */
+	data = ((1 << RK3562_DRV_BITS_PER_PIN) - 1) << (bit + 16);
+	data |= (drv << bit);
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+#define RK3562_PULL_BITS_PER_PIN		2
+#define RK3562_PULL_PINS_PER_REG		8
+#define RK3562_PULL_GPIO0_OFFSET		0x20020
+#define RK3562_PULL_GPIO1_OFFSET		0x80
+#define RK3562_PULL_GPIO2_OFFSET		0x90
+#define RK3562_PULL_GPIO3_OFFSET		0x100A0
+#define RK3562_PULL_GPIO4_OFFSET		0x100B0
+
+static void rk3562_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
+					 int pin_num, struct regmap **regmap,
+					 int *reg, u8 *bit)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+
+	*regmap = priv->regmap_base;
+	switch (bank->bank_num) {
+	case 0:
+		*reg = RK3562_PULL_GPIO0_OFFSET;
+		break;
+
+	case 1:
+		*reg = RK3562_PULL_GPIO1_OFFSET;
+		break;
+
+	case 2:
+		*reg = RK3562_PULL_GPIO2_OFFSET;
+		break;
+
+	case 3:
+		*reg = RK3562_PULL_GPIO3_OFFSET;
+		break;
+
+	case 4:
+		*reg = RK3562_PULL_GPIO4_OFFSET;
+		break;
+
+	default:
+		*reg = 0;
+		dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num);
+		break;
+	}
+
+	*reg += ((pin_num / RK3562_PULL_PINS_PER_REG) * 4);
+	*bit = pin_num % RK3562_PULL_PINS_PER_REG;
+	*bit *= RK3562_PULL_BITS_PER_PIN;
+}
+
+static int rk3562_set_pull(struct rockchip_pin_bank *bank,
+			   int pin_num, int pull)
+{
+	struct regmap *regmap;
+	int reg, ret;
+	u8 bit, type;
+	u32 data;
+
+	if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
+		return -ENOTSUPP;
+
+	rk3562_calc_pull_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+	type = bank->pull_type[pin_num / 8];
+	ret = rockchip_translate_pull_value(type, pull);
+	if (ret < 0) {
+		debug("unsupported pull setting %d\n", pull);
+		return ret;
+	}
+
+	/* enable the write to the equivalent lower bits */
+	data = ((1 << RK3562_PULL_BITS_PER_PIN) - 1) << (bit + 16);
+
+	data |= (ret << bit);
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+#define RK3562_SMT_BITS_PER_PIN		2
+#define RK3562_SMT_PINS_PER_REG		8
+#define RK3562_SMT_GPIO0_OFFSET		0x20030
+#define RK3562_SMT_GPIO1_OFFSET		0xC0
+#define RK3562_SMT_GPIO2_OFFSET		0xD0
+#define RK3562_SMT_GPIO3_OFFSET		0x100E0
+#define RK3562_SMT_GPIO4_OFFSET		0x100F0
+
+static int rk3562_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
+					   int pin_num,
+					   struct regmap **regmap,
+					   int *reg, u8 *bit)
+{
+	struct rockchip_pinctrl_priv *priv = bank->priv;
+
+	*regmap = priv->regmap_base;
+	switch (bank->bank_num) {
+	case 0:
+		*reg = RK3562_SMT_GPIO0_OFFSET;
+		break;
+
+	case 1:
+		*reg = RK3562_SMT_GPIO1_OFFSET;
+		break;
+
+	case 2:
+		*reg = RK3562_SMT_GPIO2_OFFSET;
+		break;
+
+	case 3:
+		*reg = RK3562_SMT_GPIO3_OFFSET;
+		break;
+
+	case 4:
+		*reg = RK3562_SMT_GPIO4_OFFSET;
+		break;
+
+	default:
+		*reg = 0;
+		dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num);
+		break;
+	}
+
+	*reg += ((pin_num / RK3562_SMT_PINS_PER_REG) * 4);
+	*bit = pin_num % RK3562_SMT_PINS_PER_REG;
+	*bit *= RK3562_SMT_BITS_PER_PIN;
+
+	return 0;
+}
+
+static int rk3562_set_schmitt(struct rockchip_pin_bank *bank,
+			      int pin_num, int enable)
+{
+	struct regmap *regmap;
+	int reg, ret;
+	u32 data;
+	u8 bit;
+
+	rk3562_calc_schmitt_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+
+	/* enable the write to the equivalent lower bits */
+	data = ((1 << RK3562_SMT_BITS_PER_PIN) - 1) << (bit + 16);
+	data |= (enable << bit);
+	ret = regmap_write(regmap, reg, data);
+
+	return ret;
+}
+
+static struct rockchip_pin_bank rk3562_pin_banks[] = {
+	PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0x20000, 0x20008, 0x20010, 0x20018),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0, 0x08, 0x10, 0x18),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0x20, 0, 0, 0),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0x10040, 0x10048, 0x10050, 0x10058),
+	PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4",
+				    IOMUX_WIDTH_4BIT,
+				    IOMUX_WIDTH_4BIT,
+				    0,
+				    0,
+				    0x10060, 0x10068, 0, 0),
+};
+
+static const struct rockchip_pin_ctrl rk3562_pin_ctrl = {
+	.pin_banks		= rk3562_pin_banks,
+	.nr_banks		= ARRAY_SIZE(rk3562_pin_banks),
+	.nr_pins		= 144,
+	.grf_mux_offset		= 0x0,
+	.set_mux		= rk3562_set_mux,
+	.set_pull		= rk3562_set_pull,
+	.set_drive		= rk3562_set_drive,
+	.set_schmitt		= rk3562_set_schmitt,
+};
+
+static const struct udevice_id rk3562_pinctrl_ids[] = {
+	{
+		.compatible = "rockchip,rk3562-pinctrl",
+		.data = (ulong)&rk3562_pin_ctrl
+	},
+	{ }
+};
+
+U_BOOT_DRIVER(pinctrl_rk3562) = {
+	.name		= "rockchip_rk3562_pinctrl",
+	.id		= UCLASS_PINCTRL,
+	.of_match	= rk3562_pinctrl_ids,
+	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
+	.ops		= &rockchip_pinctrl_ops,
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.bind		= dm_scan_fdt_dev,
+#endif
+	.probe		= rockchip_pinctrl_probe,
+};
diff --git a/u-boot/drivers/power/charge_animation.c b/u-boot/drivers/power/charge_animation.c
index c16f40e..63c99a7 100644
--- a/u-boot/drivers/power/charge_animation.c
+++ b/u-boot/drivers/power/charge_animation.c
@@ -499,6 +499,7 @@
 	struct charge_animation_priv *priv = dev_get_priv(dev);
 	struct udevice *fg = priv->fg;
 	int voltage, soc, charging = 1;
+	int first_poll_fg = 1;
 	static int timer_initialized;
 
 	voltage = fuel_gauge_get_voltage(fg);
@@ -506,6 +507,11 @@
 		return -EINVAL;
 
 	while (voltage < pdata->low_power_voltage + 50) {
+		if (!first_poll_fg)
+			mdelay(FUEL_GAUGE_POLL_MS);
+
+		first_poll_fg = 0;
+
 		/* Check charger online */
 		charging = fg_charger_get_chrg_online(dev);
 		if (charging <= 0) {
diff --git a/u-boot/drivers/power/pmic/rk8xx.c b/u-boot/drivers/power/pmic/rk8xx.c
index e361015..19877f3 100644
--- a/u-boot/drivers/power/pmic/rk8xx.c
+++ b/u-boot/drivers/power/pmic/rk8xx.c
@@ -152,7 +152,8 @@
 	{ RK817_PMIC_SYS_CFG1, 0x20, 0x70},
 	/* Set pmic_sleep as none function */
 	{ RK817_PMIC_SYS_CFG3, 0x00, 0x18 },
-
+	/* GATE pin function: gate function */
+	{ RK817_GPIO_INT_CFG, 0x00, 0x20 },
 #ifdef CONFIG_DM_CHARGE_DISPLAY
 	/* Set pmic_int active low */
 	{ RK817_GPIO_INT_CFG,  0x00, 0x02 },
@@ -408,6 +409,9 @@
 	val = dev_read_u32_default(dev, "not-save-power-en", 0);
 	rk8xx->not_save_power_en = val;
 
+	val = dev_read_bool(dev, "vsys-off-shutdown");
+	rk8xx->sys_can_sd = val;
+
 	return 0;
 }
 
@@ -534,6 +538,16 @@
 		break;
 	case RK809_ID:
 	case RK817_ID:
+		if (device_is_compatible(dev, "rockchip,rk809") && (priv->variant != RK809_ID)) {
+			dev_err(dev, "the dts is RK809, the hardware is RK817\n");
+			run_command("download", 0);
+		}
+
+		if (device_is_compatible(dev, "rockchip,rk817") && (priv->variant != RK817_ID)) {
+			dev_err(dev, "the dts is RK817, the hardware is RK809\n");
+			run_command("download", 0);
+		}
+
 		on_source = RK817_ON_SOURCE;
 		off_source = RK817_OFF_SOURCE;
 		pwron_key = RK817_PWRON_KEY;
@@ -541,27 +555,46 @@
 		lp_act_msk = RK8XX_LP_ACTION_MSK;
 		init_data = rk817_init_reg;
 		init_data_num = ARRAY_SIZE(rk817_init_reg);
+
+		/* whether the system voltage can be shutdown in PWR_off mode */
+		if (priv->sys_can_sd) {
+			ret = rk8xx_read(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+			if (ret)
+				return ret;
+			value |= 0x80;
+			ret = rk8xx_write(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+			if (ret)
+				return ret;
+		} else {
+			ret = rk8xx_read(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+			if (ret)
+				return ret;
+			value &= 0x7f;
+			ret = rk8xx_write(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+			if (ret)
+				return ret;
+		}
+
 		/* judge whether save the PMIC_POWER_EN register */
-		if (priv->not_save_power_en)
-			break;
+		if (!priv->not_save_power_en) {
+			ret = rk8xx_read(dev, RK817_POWER_EN0, &power_en0, 1);
+			if (ret)
+				return ret;
+			ret = rk8xx_read(dev, RK817_POWER_EN1, &power_en1, 1);
+			if (ret)
+				return ret;
+			ret = rk8xx_read(dev, RK817_POWER_EN2, &power_en2, 1);
+			if (ret)
+				return ret;
+			ret = rk8xx_read(dev, RK817_POWER_EN3, &power_en3, 1);
+			if (ret)
+				return ret;
 
-		ret = rk8xx_read(dev, RK817_POWER_EN0, &power_en0, 1);
-		if (ret)
-			return ret;
-		ret = rk8xx_read(dev, RK817_POWER_EN1, &power_en1, 1);
-		if (ret)
-			return ret;
-		ret = rk8xx_read(dev, RK817_POWER_EN2, &power_en2, 1);
-		if (ret)
-			return ret;
-		ret = rk8xx_read(dev, RK817_POWER_EN3, &power_en3, 1);
-		if (ret)
-			return ret;
-
-		value = (power_en0 & 0x0f) | ((power_en1 & 0x0f) << 4);
-		rk8xx_write(dev, RK817_POWER_EN_SAVE0, &value, 1);
-		value = (power_en2 & 0x0f) | ((power_en3 & 0x0f) << 4);
-		rk8xx_write(dev, RK817_POWER_EN_SAVE1, &value, 1);
+			value = (power_en0 & 0x0f) | ((power_en1 & 0x0f) << 4);
+			rk8xx_write(dev, RK817_POWER_EN_SAVE0, &value, 1);
+			value = (power_en2 & 0x0f) | ((power_en3 & 0x0f) << 4);
+			rk8xx_write(dev, RK817_POWER_EN_SAVE1, &value, 1);
+		}
 		break;
 	default:
 		printf("Unknown PMIC: RK%x!!\n", priv->variant);
diff --git a/u-boot/drivers/power/regulator/fixed.c b/u-boot/drivers/power/regulator/fixed.c
index c35ca2a..172eb56 100644
--- a/u-boot/drivers/power/regulator/fixed.c
+++ b/u-boot/drivers/power/regulator/fixed.c
@@ -45,10 +45,12 @@
 	gpio = &dev_pdata->gpio;
 	ret = gpio_request_by_name(dev, "gpio", 0, gpio, flags);
 	if (ret) {
-		debug("Fixed regulator optional enable GPIO - not found! Error: %d\n",
-		      ret);
-		if (ret != -ENOENT)
-			return ret;
+		ret = gpio_request_by_name(dev, "gpios", 0, gpio, flags);
+		if (ret) {
+			debug("Fixed regulator optional enable GPIO - not found! Error: %d\n", ret);
+			if (ret != -ENOENT)
+				return ret;
+		}
 	}
 
 	/* Get optional ramp up delay */
diff --git a/u-boot/drivers/power/regulator/regulator-uclass.c b/u-boot/drivers/power/regulator/regulator-uclass.c
index 4679249..0c692bb 100644
--- a/u-boot/drivers/power/regulator/regulator-uclass.c
+++ b/u-boot/drivers/power/regulator/regulator-uclass.c
@@ -8,7 +8,6 @@
 #include <common.h>
 #include <errno.h>
 #include <dm.h>
-#include <dm/device-internal.h>
 #include <dm/uclass-internal.h>
 #include <power/pmic.h>
 #include <power/regulator.h>
@@ -413,16 +412,10 @@
 	if (regulator_name_is_unique(dev, uc_pdata->name))
 		return 0;
 
-#ifdef CONFIG_USING_KERNEL_DTB
-	printf("Pre-reloc: %s\n", uc_pdata->name);
-
-	return 0;
-#else
 	debug("'%s' of dev: '%s', has nonunique value: '%s\n",
 	      property, dev->name, uc_pdata->name);
 
 	return -EINVAL;
-#endif
 }
 
 static int regulator_pre_probe(struct udevice *dev)
@@ -505,90 +498,6 @@
 	return ret;
 }
 
-#ifdef CONFIG_USING_KERNEL_DTB
-/*
- * Skip probed pre-reloc regulators.
- *
- * Some regulator like fixed/gpio regultor applies a default output state
- * when probed. It maybe reverse the state which was set by the pre-reloc
- * regulator. Example: vcc3v3_pcie.
- */
-int regulators_enable_boot_on(bool verbose)
-{
-	struct dm_regulator_uclass_platdata *uc_pdata;
-	struct udevice *dev;
-	struct uclass *uc;
-	char **pre_probed = NULL;
-	int i = 0, num = 0;
-	int ret;
-	bool skip;
-
-	ret = uclass_get(UCLASS_REGULATOR, &uc);
-	if (ret)
-		return ret;
-
-	/* find probed pre-reloc regulators */
-	for (uclass_find_first_device(UCLASS_REGULATOR, &dev);
-	     dev;
-	     uclass_find_next_device(&dev)) {
-		if (!(dev->flags & DM_FLAG_KNRL_DTB) &&
-		    (dev->flags & DM_FLAG_ACTIVATED))
-			num++;
-	}
-	if (num) {
-		pre_probed = calloc(num, sizeof(char *));
-		if (!pre_probed)
-			return -ENOMEM;
-
-		for (uclass_find_first_device(UCLASS_REGULATOR, &dev);
-		     dev;
-		     uclass_find_next_device(&dev)) {
-			if (!(dev->flags & DM_FLAG_KNRL_DTB) &&
-			    (dev->flags & DM_FLAG_ACTIVATED)) {
-				uc_pdata = dev_get_uclass_platdata(dev);
-				pre_probed[i++] = (char *)uc_pdata->name;
-			}
-		}
-	}
-
-	/* Skip kernel regulators whose name matches probed pre-reloc regulators */
-	for (uclass_find_first_device(UCLASS_REGULATOR, &dev);
-	     dev;
-	     uclass_find_next_device(&dev)) {
-		uc_pdata = dev_get_uclass_platdata(dev);
-		debug("%s: %s%s\n", __func__, uc_pdata->name,
-		      dev->flags & DM_FLAG_KNRL_DTB ? "" : "*");
-		if (dev->flags & DM_FLAG_KNRL_DTB) {
-			for (i = 0, skip = false; i < num; i++) {
-				if (!strcmp(pre_probed[i], uc_pdata->name)) {
-					skip = true;
-					break;
-				}
-			}
-			if (skip)
-				continue;
-		}
-
-		/* Probe and init */
-		ret = device_probe(dev);
-		if (ret)
-			continue;
-		ret = regulator_autoset(dev);
-		if (ret == -EMEDIUMTYPE)
-			ret = 0;
-		if (verbose)
-			regulator_show(dev, ret);
-		if (ret == -ENOSYS)
-			ret = 0;
-	}
-
-	if (pre_probed)
-		free(pre_probed);
-
-	return ret;
-}
-
-#else
 int regulators_enable_boot_on(bool verbose)
 {
 	struct udevice *dev;
@@ -613,7 +522,6 @@
 
 	return ret;
 }
-#endif
 
 UCLASS_DRIVER(regulator) = {
 	.id		= UCLASS_REGULATOR,
diff --git a/u-boot/drivers/ram/rockchip/Makefile b/u-boot/drivers/ram/rockchip/Makefile
index 48df397..5532a80 100644
--- a/u-boot/drivers/ram/rockchip/Makefile
+++ b/u-boot/drivers/ram/rockchip/Makefile
@@ -16,6 +16,8 @@
 obj-$(CONFIG_ROCKCHIP_RK3308) += sdram_rv1108_pctl_phy.o sdram_rk3308.o
 obj-$(CONFIG_ROCKCHIP_RK3328) += sdram_rk3328.o sdram_pctl_px30.o sdram_phy_px30.o
 obj-$(CONFIG_ROCKCHIP_RK3399) += sdram_rk3399.o
+obj-$(CONFIG_ROCKCHIP_RK3528) += sdram_rk3528.o
+obj-$(CONFIG_ROCKCHIP_RK3562) += sdram_rk3562.o
 obj-$(CONFIG_ROCKCHIP_RK3568) += sdram_rk3568.o
 obj-$(CONFIG_ROCKCHIP_RK3588) += sdram_rk3588.o
 obj-$(CONFIG_ROCKCHIP_PX30) += sdram_px30.o sdram_pctl_px30.o sdram_phy_px30.o
diff --git a/u-boot/drivers/ram/rockchip/sdram_rk3528.c b/u-boot/drivers/ram/rockchip/sdram_rk3528.c
new file mode 100644
index 0000000..e8b0b36
--- /dev/null
+++ b/u-boot/drivers/ram/rockchip/sdram_rk3528.c
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * (C) Copyright 2020 Rockchip Electronics Co., Ltd.
+ */
+
+#include <common.h>
+
+#ifdef CONFIG_TPL_BUILD
+#ifndef CONFIG_TPL_TINY_FRAMEWORK
+#error please defined CONFIG_TPL_TINY_FRAMEWORK for RK3528 !!!
+#endif
+#endif
+
+#ifdef CONFIG_TPL_BUILD
+
+/* return: 0 = success, other = fail */
+int sdram_init(void)
+{
+	return (-1);
+}
+#endif /* CONFIG_TPL_BUILD */
diff --git a/u-boot/drivers/ram/rockchip/sdram_rk3562.c b/u-boot/drivers/ram/rockchip/sdram_rk3562.c
new file mode 100644
index 0000000..60f2987
--- /dev/null
+++ b/u-boot/drivers/ram/rockchip/sdram_rk3562.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#include <common.h>
+#include <debug_uart.h>
+#include <dm.h>
+#include <ram.h>
+#include <syscon.h>
+#include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/rk_atags.h>
+#include <asm/arch/cru_rk3562.h>
+#include <asm/arch/grf_rk3562.h>
+
+#ifdef CONFIG_TPL_BUILD
+#ifndef CONFIG_TPL_TINY_FRAMEWORK
+#error please defined CONFIG_TPL_TINY_FRAMEWORK for RK3562 !!!
+#endif
+#endif
+
+#ifdef CONFIG_TPL_BUILD
+
+/* return: 0 = success, other = fail */
+int sdram_init(void)
+{
+	return (-1);
+}
+#endif /* CONFIG_TPL_BUILD */
diff --git a/u-boot/drivers/ram/rockchip/sdram_rv1126.c b/u-boot/drivers/ram/rockchip/sdram_rv1126.c
index bb2ce37..65f08a2 100644
--- a/u-boot/drivers/ram/rockchip/sdram_rv1126.c
+++ b/u-boot/drivers/ram/rockchip/sdram_rv1126.c
@@ -374,6 +374,8 @@
 			break;
 		delay--;
 	}
+	if (delay <= 0)
+		printascii("ERROR: DPLL lock timeout!\n");
 
 	writel(DPLL_MODE(CLOCK_FROM_PLL), &dram->cru->mode);
 }
@@ -557,11 +559,18 @@
 {
 	void __iomem *phy_base = dram->phy;
 	u32 fbdiv, prediv, postdiv, postdiv_en;
+	int delay = 1000;
 
 	if (wait) {
 		clrbits_le32(PHY_REG(phy_base, 0x53), PHY_PD_DISB);
-		while (!(readl(PHY_REG(phy_base, 0x90)) & PHY_PLL_LOCK))
-			continue;
+		while (!(readl(PHY_REG(phy_base, 0x90)) & PHY_PLL_LOCK)) {
+			udelay(1);
+			if (delay-- <= 0) {
+				printascii("ERROR: phy pll lock timeout!\n");
+				while (1)
+					;
+			}
+		}
 	} else {
 		freq /= MHz;
 		prediv = 1;
@@ -2484,13 +2493,13 @@
 	return 0;
 }
 
-static int sdram_init_(struct dram_info *dram,
-		       struct rv1126_sdram_params *sdram_params, u32 post_init)
+int sdram_init_(struct dram_info *dram, struct rv1126_sdram_params *sdram_params, u32 post_init)
 {
 	void __iomem *pctl_base = dram->pctl;
 	void __iomem *phy_base = dram->phy;
 	u32 ddr4_vref;
 	u32 mr_tmp, tmp;
+	int delay = 1000;
 
 	rkclk_configure_ddr(dram, sdram_params);
 
@@ -2538,8 +2547,14 @@
 
 	rkclk_ddr_reset(dram, 0, 0, 0, 0);
 
-	while ((readl(pctl_base + DDR_PCTL2_STAT) & 0x7) == 0)
-		continue;
+	while ((readl(pctl_base + DDR_PCTL2_STAT) & 0x7) == 0) {
+		udelay(1);
+		if (delay-- <= 0) {
+			printascii("ERROR: Cannot wait dfi_init_done!\n");
+			while (1)
+				;
+		}
+	}
 
 	if (sdram_params->base.dramtype == LPDDR3) {
 		pctl_write_mr(dram->pctl, 3, 11, lp3_odt_value, LPDDR3);
@@ -3300,6 +3315,7 @@
 	struct rv1126_sdram_params *sdram_params_new;
 	void __iomem *pctl_base = dram->pctl;
 	void __iomem *phy_base = dram->phy;
+	int delay = 1000;
 
 	lp_stat = low_power_update(dram, 0);
 	sdram_params_new = get_default_sdram_config(freq);
@@ -3388,8 +3404,14 @@
 					(0x0 << ACLK_DDR_UPCTL_EN_SHIFT),
 			BUS_SGRF_BASE_ADDR + SGRF_SOC_CON12);
 	while ((readl(pctl_base + DDR_PCTL2_DFISTAT) &
-	       PCTL2_DFI_INIT_COMPLETE) != PCTL2_DFI_INIT_COMPLETE)
-		continue;
+	       PCTL2_DFI_INIT_COMPLETE) != PCTL2_DFI_INIT_COMPLETE) {
+		udelay(1);
+		if (delay-- <= 0) {
+			printascii("ERROR: Cannot wait DFI_INIT_COMPLETE\n");
+			while (1)
+				;
+		}
+	}
 
 	sw_set_req(dram);
 	setbits_le32(pctl_base + DDR_PCTL2_MSTR, 0x1 << 29);
diff --git a/u-boot/drivers/rkflash/sfc_nand.c b/u-boot/drivers/rkflash/sfc_nand.c
index 82a5f52..ae5c999 100644
--- a/u-boot/drivers/rkflash/sfc_nand.c
+++ b/u-boot/drivers/rkflash/sfc_nand.c
@@ -49,6 +49,12 @@
 	{ 0xC2, 0x92, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 	/* MX35UF2GE4AC */
 	{ 0xC2, 0xA2, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
+	/* MX35UF1GE4AD */
+	{ 0xC2, 0x96, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
+	/* MX35UF2GE4AD */
+	{ 0xC2, 0xA6, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
+	/* MX35UF4GE4AD */
+	{ 0xC2, 0xB7, 0x00, 8, 0x40, 1, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x08, 0x14, 0x18 }, &sfc_nand_get_ecc_status0 },
 
 	/* GD5F1GQ4UAYIG */
 	{ 0xC8, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
@@ -93,6 +99,8 @@
 	{ 0xEF, 0xBA, 0x22, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status0 },
 	/* W25N512GVEIG */
 	{ 0xEF, 0xAA, 0x20, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
+	/* W25N01KV */
+	{ 0xEF, 0xAE, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 
 	/* HYF2GQ4UAACAE */
 	{ 0xC9, 0x52, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
@@ -105,7 +113,11 @@
 	/* HYF2GQ4UHCCAE */
 	{ 0xC9, 0x5A, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 	/* HYF4GQ4UAACBE */
-	{ 0xC9, 0xD4, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0x4, 1, { 0x20, 0x40, 0x24, 0x44 }, &sfc_nand_get_ecc_status0 },
+	{ 0xC9, 0xD4, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0xE, 1, { 0x20, 0x40, 0x24, 0x44 }, &sfc_nand_get_ecc_status0 },
+	/* HYF2GQ4IAACAE */
+	{ 0xC9, 0x82, 0x00, 4, 0x40, 1, 2048, 0x4C, 20, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
+	/* HYF1GQ4IDACAE */
+	{ 0xC9, 0x81, 0x00, 4, 0x40, 1, 1024, 0x4C, 20, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 
 	/* FS35ND01G-S1 */
 	{ 0xCD, 0xB1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x10, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status5 },
@@ -124,7 +136,7 @@
 	/* F35SQA512M */
 	{ 0xCD, 0x70, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* F35UQA512M */
-	{ 0xCD, 0x70, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
+	{ 0xCD, 0x60, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 
 	/* DS35Q1GA-IB */
 	{ 0xE5, 0x71, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
@@ -142,6 +154,10 @@
 	{ 0xE5, 0xF4, 0x00, 4, 0x40, 2, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
 	/* DS35M1GB-IB */
 	{ 0xE5, 0xA1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
+	/* DS35Q12B-IB */
+	{ 0xE5, 0xF5, 0x00, 4, 0x40, 1, 512, 0x0C, 17, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
+	/* DS35M12B-IB */
+	{ 0xE5, 0xA5, 0x00, 4, 0x40, 1, 512, 0x0C, 17, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
 
 	/* EM73C044VCC-H */
 	{ 0xD5, 0x22, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
@@ -199,8 +215,16 @@
 	{ 0xEA, 0xC1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* TX25G01 */
 	{ 0xA1, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 },
+	/* ANV1GCP0CLG, HYF1GQ4UTXCAE */
+	{ 0x01, 0x15, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status9 },
+	/* S35ML02G3, ANV1GCP0CLG */
+	{ 0x01, 0x25, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x4, 0, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 },
 	/* S35ML04G3 */
-	{ 0x01, 0x35, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 },
+	{ 0x01, 0x35, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 0, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 },
+	/* GSS01GSAK1 */
+	{ 0x52, 0xBA, 0x13, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
+	/* GSS02GSAK1 */
+	{ 0x52, 0xBA, 0x23, 4, 0x40, 1, 2048, 0x4C, 19, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 };
 
 static struct nand_info *p_nand_info;
diff --git a/u-boot/drivers/rkflash/sfc_nor.c b/u-boot/drivers/rkflash/sfc_nor.c
index afbcbd7..6471efa 100644
--- a/u-boot/drivers/rkflash/sfc_nor.c
+++ b/u-boot/drivers/rkflash/sfc_nor.c
@@ -32,10 +32,14 @@
 	{ 0xc86016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 13, 9, 0 },
 	/* GD25B512MEYIG */
 	{ 0xc8471A, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 17, 0, 0 },
+	/* GD55B01GE */
+	{ 0xc8471B, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 18, 0, 0 },
 	/* GD25LQ255E and GD25LQ256C */
 	{ 0xc86019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1D, 16, 9, 0 },
 	/* GD25LB512MEYIG */
 	{ 0xc8671A, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 17, 0, 0 },
+	/* GD55LB01GEFIRR */
+	{ 0xc8671B, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 18, 0, 0 },
 
 	/* W25Q32JV */
 	{ 0xef4016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 },
@@ -112,6 +116,10 @@
 	{ 0x0b4016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 13, 9, 0 },
 	/* XT25F16BS */
 	{ 0x0b4015, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 12, 9, 0 },
+	/* XT25Q64D */
+	{ 0x0b6017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
+	/* XT25Q128D */
+	{ 0x0b6018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
 
 	/* EN25QH64A */
 	{ 0x1c7017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 0, 0 },
@@ -124,7 +132,11 @@
 	/* EN25S64A */
 	{ 0x1c3817, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 0, 0 },
 	/* EN25QH256A */
-	{ 0x1c7019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x3C, 16, 0, 0 },
+	{ 0x1c7019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 0, 0 },
+	/* EN25QX256A */
+	{ 0x1c7119, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 },
+	/* EN25QX128A */
+	{ 0x1c7118, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
 
 	/* P25Q64H */
 	{ 0x856017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
@@ -134,8 +146,12 @@
 	{ 0x856015, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 12, 9, 0 },
 	/* P25Q32SL P25Q32SH-SSH-IT */
 	{ 0x856016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 },
+	/* PY25Q64HA */
+	{ 0x852017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
 	/* PY25Q128H */
 	{ 0x852018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
+	/* PY25Q256H */
+	{ 0x852019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 },
 
 	/* ZB25VQ64 */
 	{ 0x5e4017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
@@ -153,6 +169,8 @@
 	{ 0xA14018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
 	/* FM25Q64-SOB-T-G */
 	{ 0xA14017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
+	/* FM25Q256I3 */
+	{ 0xA14019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 },
 
 	/* FM25Q64A */
 	{ 0xf83217, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 9, 0 },
@@ -174,6 +192,9 @@
 
 	/* BY25Q256FSEIG */
 	{ 0x684919, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 },
+
+	/* NM25Q128EVB */
+	{ 0x522118, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 10, 0 },
 };
 
 static int snor_write_en(void)
diff --git a/u-boot/drivers/rng/rockchip_rng.c b/u-boot/drivers/rng/rockchip_rng.c
index 7287afd..d85cf65 100644
--- a/u-boot/drivers/rng/rockchip_rng.c
+++ b/u-boot/drivers/rng/rockchip_rng.c
@@ -2,13 +2,14 @@
 /*
  * Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd
  */
+#include <common.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <rng.h>
 #include <asm/arch-rockchip/hardware.h>
 #include <asm/io.h>
-#include <common.h>
-#include <dm.h>
 #include <linux/iopoll.h>
 #include <linux/string.h>
-#include <rng.h>
 
 #define RK_HW_RNG_MAX 32
 
@@ -70,6 +71,27 @@
 #define TRNG_v1_VERSION_CODE			0x46BC
 /* end of TRNG V1 register define */
 
+/* start of RKRNG register define */
+#define RKRNG_CTRL				0x0010
+#define RKRNG_CTRL_INST_REQ			BIT(0)
+#define RKRNG_CTRL_RESEED_REQ			BIT(1)
+#define RKRNG_CTRL_TEST_REQ			BIT(2)
+#define RKRNG_CTRL_SW_DRNG_REQ			BIT(3)
+#define RKRNG_CTRL_SW_TRNG_REQ			BIT(4)
+
+#define RKRNG_STATE				0x0014
+#define RKRNG_STATE_INST_ACK			BIT(0)
+#define RKRNG_STATE_RESEED_ACK			BIT(1)
+#define RKRNG_STATE_TEST_ACK			BIT(2)
+#define RKRNG_STATE_SW_DRNG_ACK			BIT(3)
+#define RKRNG_STATE_SW_TRNG_ACK			BIT(4)
+
+/* DRNG_DATA_0 ~ DNG_DATA_7 */
+#define RKRNG_DRNG_DATA_0			0x0070
+#define RKRNG_DRNG_DATA_7			0x008C
+
+/* end of RKRNG register define */
+
 #define RK_RNG_TIME_OUT	50000  /* max 50ms */
 
 #define trng_write(pdata, pos, val)	writel(val, (pdata)->base + (pos))
@@ -83,7 +105,36 @@
 struct rk_rng_platdata {
 	fdt_addr_t base;
 	struct rk_rng_soc_data *soc_data;
+	struct clk hclk;
 };
+
+static int rk_rng_do_enable_clk(struct udevice *dev, int enable)
+{
+	struct rk_rng_platdata *pdata = dev_get_priv(dev);
+	int ret;
+
+	if (!pdata->hclk.dev)
+		return 0;
+
+	ret = enable ? clk_enable(&pdata->hclk) : clk_disable(&pdata->hclk);
+	if (ret == -ENOSYS || !ret)
+		return 0;
+
+	printf("rk rng: failed to %s clk, ret=%d\n",
+	       enable ? "enable" : "disable", ret);
+
+	return ret;
+}
+
+static int rk_rng_enable_clk(struct udevice *dev)
+{
+	return rk_rng_do_enable_clk(dev, 1);
+}
+
+static int rk_rng_disable_clk(struct udevice *dev)
+{
+	return rk_rng_do_enable_clk(dev, 0);
+}
 
 static int rk_rng_read_regs(fdt_addr_t addr, void *buf, size_t size)
 {
@@ -106,7 +157,7 @@
 	return 0;
 }
 
-static int rk_cryptov1_rng_read(struct udevice *dev, void *data, size_t len)
+static int cryptov1_rng_read(struct udevice *dev, void *data, size_t len)
 {
 	struct rk_rng_platdata *pdata = dev_get_priv(dev);
 	u32 reg = 0;
@@ -137,7 +188,7 @@
 	return 0;
 }
 
-static int rk_cryptov2_rng_read(struct udevice *dev, void *data, size_t len)
+static int cryptov2_rng_read(struct udevice *dev, void *data, size_t len)
 {
 	struct rk_rng_platdata *pdata = dev_get_priv(dev);
 	u32 reg = 0;
@@ -171,7 +222,7 @@
 	return retval;
 }
 
-static int rk_trngv1_init(struct udevice *dev)
+static int trngv1_init(struct udevice *dev)
 {
 	u32 status, version;
 	u32 auto_reseed_cnt = 1000;
@@ -198,7 +249,7 @@
 	return 0;
 }
 
-static int rk_trngv1_rng_read(struct udevice *dev, void *data, size_t len)
+static int trngv1_rng_read(struct udevice *dev, void *data, size_t len)
 {
 	struct rk_rng_platdata *pdata = dev_get_priv(dev);
 	u32 reg = 0;
@@ -224,6 +275,53 @@
 exit:
 	/* close TRNG */
 	trng_write(pdata, TRNG_V1_CTRL, TRNG_V1_CTRL_NOP);
+
+	return retval;
+}
+
+static int rkrng_init(struct udevice *dev)
+{
+	struct rk_rng_platdata *pdata = dev_get_priv(dev);
+	u32 reg = 0;
+
+	rk_clrreg(pdata->base + RKRNG_CTRL, 0xffff);
+
+	reg = trng_read(pdata, RKRNG_STATE);
+	trng_write(pdata, RKRNG_STATE, reg);
+
+	return 0;
+}
+
+static int rkrng_rng_read(struct udevice *dev, void *data, size_t len)
+{
+	struct rk_rng_platdata *pdata = dev_get_priv(dev);
+	u32 reg = 0;
+	int retval;
+
+	if (len > RK_HW_RNG_MAX)
+		return -EINVAL;
+
+	rk_rng_enable_clk(dev);
+
+	reg = RKRNG_CTRL_SW_DRNG_REQ;
+
+	rk_clrsetreg(pdata->base + RKRNG_CTRL, 0xffff, reg);
+
+	retval = readl_poll_timeout(pdata->base + RKRNG_STATE, reg,
+				    (reg & RKRNG_STATE_SW_DRNG_ACK),
+				    RK_RNG_TIME_OUT);
+	if (retval)
+		goto exit;
+
+	trng_write(pdata, RKRNG_STATE, reg);
+
+	rk_rng_read_regs(pdata->base + RKRNG_DRNG_DATA_0, data, len);
+
+exit:
+	/* close TRNG */
+	rk_clrreg(pdata->base + RKRNG_CTRL, 0xffff);
+
+	rk_rng_disable_clk(dev);
 
 	return retval;
 }
@@ -266,6 +364,8 @@
 	if (!pdata->base)
 		return -ENOMEM;
 
+	clk_get_by_index(dev, 0, &pdata->hclk);
+
 	return 0;
 }
 
@@ -282,17 +382,22 @@
 	return ret;
 }
 
-static const struct rk_rng_soc_data rk_cryptov1_soc_data = {
-	.rk_rng_read = rk_cryptov1_rng_read,
+static const struct rk_rng_soc_data cryptov1_soc_data = {
+	.rk_rng_read = cryptov1_rng_read,
 };
 
-static const struct rk_rng_soc_data rk_cryptov2_soc_data = {
-	.rk_rng_read = rk_cryptov2_rng_read,
+static const struct rk_rng_soc_data cryptov2_soc_data = {
+	.rk_rng_read = cryptov2_rng_read,
 };
 
-static const struct rk_rng_soc_data rk_trngv1_soc_data = {
-	.rk_rng_init = rk_trngv1_init,
-	.rk_rng_read = rk_trngv1_rng_read,
+static const struct rk_rng_soc_data trngv1_soc_data = {
+	.rk_rng_init = trngv1_init,
+	.rk_rng_read = trngv1_rng_read,
+};
+
+static const struct rk_rng_soc_data rkrng_soc_data = {
+	.rk_rng_init = rkrng_init,
+	.rk_rng_read = rkrng_rng_read,
 };
 
 static const struct dm_rng_ops rockchip_rng_ops = {
@@ -302,15 +407,19 @@
 static const struct udevice_id rockchip_rng_match[] = {
 	{
 		.compatible = "rockchip,cryptov1-rng",
-		.data = (ulong)&rk_cryptov1_soc_data,
+		.data = (ulong)&cryptov1_soc_data,
 	},
 	{
 		.compatible = "rockchip,cryptov2-rng",
-		.data = (ulong)&rk_cryptov2_soc_data,
+		.data = (ulong)&cryptov2_soc_data,
 	},
 	{
 		.compatible = "rockchip,trngv1",
-		.data = (ulong)&rk_trngv1_soc_data,
+		.data = (ulong)&trngv1_soc_data,
+	},
+	{
+		.compatible = "rockchip,rkrng",
+		.data = (ulong)&rkrng_soc_data,
 	},
 	{},
 };
diff --git a/u-boot/drivers/scsi/scsi.c b/u-boot/drivers/scsi/scsi.c
index 1a65a3f..9089c29 100644
--- a/u-boot/drivers/scsi/scsi.c
+++ b/u-boot/drivers/scsi/scsi.c
@@ -172,6 +172,7 @@
 	      block_dev->devnum, start, blks, (unsigned long)buffer);
 	do {
 		pccb->pdata = (unsigned char *)buf_addr;
+		pccb->dma_dir = DMA_FROM_DEVICE;
 #ifdef CONFIG_SYS_64BIT_LBA
 		if (start > SCSI_LBA48_READ) {
 			unsigned long blocks;
@@ -247,6 +248,7 @@
 	      __func__, block_dev->devnum, start, blks, (unsigned long)buffer);
 	do {
 		pccb->pdata = (unsigned char *)buf_addr;
+		pccb->dma_dir = DMA_TO_DEVICE;
 		if (blks > SCSI_MAX_WRITE_BLK) {
 			pccb->datalen = (block_dev->blksz *
 					 SCSI_MAX_WRITE_BLK);
@@ -395,6 +397,7 @@
 	pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
 
 	pccb->datalen = 16;
+	pccb->dma_dir = DMA_FROM_DEVICE;
 	if (scsi_exec(dev, pccb))
 		return 1;
 
@@ -500,6 +503,7 @@
 	pccb->lun = lun;
 	pccb->pdata = (unsigned char *)&tempbuff;
 	pccb->datalen = 512;
+	pccb->dma_dir = DMA_FROM_DEVICE;
 	scsi_setup_inquiry(pccb);
 	if (scsi_exec(dev, pccb)) {
 		if (pccb->contr_stat == SCSI_SEL_TIME_OUT) {
diff --git a/u-boot/drivers/spi/rockchip_sfc.c b/u-boot/drivers/spi/rockchip_sfc.c
index 63ca2c0..13e4ab0 100644
--- a/u-boot/drivers/spi/rockchip_sfc.c
+++ b/u-boot/drivers/spi/rockchip_sfc.c
@@ -108,6 +108,7 @@
 #define  SFC_VER_4			0x4
 #define  SFC_VER_5			0x5
 #define  SFC_VER_6			0x6
+#define  SFC_VER_8			0x8
 
 /* Delay line controller resiter */
 #define SFC_DLL_CTRL0			0x3C
@@ -225,6 +226,7 @@
 static u32 rockchip_sfc_get_max_dll_cells(struct rockchip_sfc *sfc)
 {
 	switch (rockchip_sfc_get_version(sfc)) {
+	case SFC_VER_8:
 	case SFC_VER_6:
 	case SFC_VER_5:
 		return SFC_DLL_CTRL0_DLL_MAX_VER5;
diff --git a/u-boot/drivers/spi/soft_spi.c b/u-boot/drivers/spi/soft_spi.c
index 1690cd7..64a4862 100644
--- a/u-boot/drivers/spi/soft_spi.c
+++ b/u-boot/drivers/spi/soft_spi.c
@@ -201,10 +201,8 @@
 static int soft_spi_ofdata_to_platdata(struct udevice *dev)
 {
 	struct soft_spi_platdata *plat = dev->platdata;
-	const void *blob = gd->fdt_blob;
-	int node = dev_of_offset(dev);
 
-	plat->spi_delay_us = fdtdec_get_int(blob, node, "spi-delay-us", 0);
+	plat->spi_delay_us = dev_read_u32_default(dev, "spi-delay-us", 0);
 
 	return 0;
 }
@@ -216,24 +214,34 @@
 	int cs_flags, clk_flags;
 	int ret;
 
-	cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW;
-	clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0;
+	if (slave) {
+		cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW;
+		clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0;
+	} else {
+		cs_flags = GPIOD_ACTIVE_LOW;
+		clk_flags = 0;
+	}
 
-	if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs,
-				 GPIOD_IS_OUT | cs_flags) ||
-	    gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk,
-				 GPIOD_IS_OUT | clk_flags))
+	if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs, GPIOD_IS_OUT | cs_flags) ||
+	    (gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk, GPIOD_IS_OUT | clk_flags) &&
+	     gpio_request_by_name(dev, "sck-gpios", 0, &plat->sclk, GPIOD_IS_OUT | clk_flags)))
 		return -EINVAL;
 
 	ret = gpio_request_by_name(dev, "gpio-mosi", 0, &plat->mosi,
 				   GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE);
-	if (ret)
-		plat->flags |= SPI_MASTER_NO_TX;
+	if (ret) {
+		if (gpio_request_by_name(dev, "mosi-gpios", 0, &plat->mosi,
+		    GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE))
+			plat->flags |= SPI_MASTER_NO_TX;
+	}
 
 	ret = gpio_request_by_name(dev, "gpio-miso", 0, &plat->miso,
 				   GPIOD_IS_IN);
-	if (ret)
-		plat->flags |= SPI_MASTER_NO_RX;
+	if (ret) {
+		if (gpio_request_by_name(dev, "miso-gpios", 0, &plat->miso,
+		    GPIOD_IS_IN))
+			plat->flags |= SPI_MASTER_NO_RX;
+	}
 
 	if ((plat->flags & (SPI_MASTER_NO_RX | SPI_MASTER_NO_TX)) ==
 	    (SPI_MASTER_NO_RX | SPI_MASTER_NO_TX))
diff --git a/u-boot/drivers/thermal/rockchip_thermal.c b/u-boot/drivers/thermal/rockchip_thermal.c
index 1bd6e31..e5551d4 100644
--- a/u-boot/drivers/thermal/rockchip_thermal.c
+++ b/u-boot/drivers/thermal/rockchip_thermal.c
@@ -78,6 +78,7 @@
 #define TSADCV2_AUTO_PERIOD_HT			0x6c
 #define TSADCV3_AUTO_PERIOD			0x154
 #define TSADCV3_AUTO_PERIOD_HT			0x158
+#define TSADCV3_Q_MAX				0x210
 
 #define TSADCV2_AUTO_EN				BIT(0)
 #define TSADCV2_AUTO_EN_MASK			BIT(16)
@@ -88,6 +89,7 @@
 #define TSADCV2_AUTO_TSHUT_POLARITY_MASK	BIT(24)
 
 #define TSADCV3_AUTO_Q_SEL_EN			BIT(1)
+#define TSADCV3_AUTO_Q_SEL_EN_MASK		BIT(17)
 
 #define TSADCV2_INT_SRC_EN(chn)			BIT(chn)
 #define TSADCV2_INT_SRC_EN_MASK(chn)		BIT(16 + (chn))
@@ -101,6 +103,7 @@
 #define TSADCV2_DATA_MASK			0xfff
 #define TSADCV3_DATA_MASK			0x3ff
 #define TSADCV4_DATA_MASK			0x1ff
+#define TSADCV5_DATA_MASK			0x7ff
 
 #define TSADCV2_HIGHT_INT_DEBOUNCE_COUNT	4
 #define TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT	4
@@ -112,6 +115,14 @@
 #define TSADCV5_AUTO_PERIOD_HT_TIME		1622 /* 2.5ms */
 #define TSADCV6_AUTO_PERIOD_TIME		5000 /* 2.5ms */
 #define TSADCV6_AUTO_PERIOD_HT_TIME		5000 /* 2.5ms */
+#define TSADCV7_AUTO_PERIOD_TIME		3000 /* 2.5ms */
+#define TSADCV7_AUTO_PERIOD_HT_TIME		3000 /* 2.5ms */
+#define TSADCV3_Q_MAX_VAL			0x7ff /* 11bit 2047 */
+#define TSADCV12_AUTO_PERIOD_TIME		3000 /* 2.5ms */
+#define TSADCV12_AUTO_PERIOD_HT_TIME		3000 /* 2.5ms */
+#define TSADCV12_Q_MAX_VAL			0xfff /* 12bit 4095 */
+#define TSADCV9_Q_MAX				0x210
+#define TSADCV9_Q_MAX_VAL			(0xffff0400 << 0)
 
 #define TSADCV2_USER_INTER_PD_SOC		0x340	/* 13 clocks */
 #define TSADCV5_USER_INTER_PD_SOC		0xfc0 /* 97us, at least 90us */
@@ -123,7 +134,10 @@
 #define PX30_GRF_SOC_CON0			0x0400
 #define PX30_GRF_SOC_CON2			0x0408
 
+#define RK3562_GRF_TSADC_CON			0x0580
+
 #define RK3568_GRF_TSADC_CON			0x0600
+#define RK3528_GRF_TSADC_CON			0x40030
 #define RK3568_GRF_TSADC_ANA_REG0		(0x10001 << 0)
 #define RK3568_GRF_TSADC_ANA_REG1		(0x10001 << 1)
 #define RK3568_GRF_TSADC_ANA_REG2		(0x10001 << 2)
@@ -137,9 +151,10 @@
 #define GRF_CON_TSADC_CH_INV			(0x10001 << 1)
 #define PX30S_TSADC_TDC_MODE                    (0x10001 << 4)
 
-#define MIN_TEMP				(-40000)
+/* -40 to 125 is reliable, outside the range existed unreliability */
+#define MIN_TEMP				(-60000)
 #define LOWEST_TEMP				(-273000)
-#define MAX_TEMP				(125000)
+#define MAX_TEMP				(180000)
 #define MAX_ENV_TEMP				(85000)
 
 #define BASE					(1024)
@@ -208,7 +223,8 @@
 };
 
 static const struct tsadc_table rk1808_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{3423, MIN_TEMP},
 	{3455, -40000},
 	{3463, -35000},
 	{3471, -30000},
@@ -243,11 +259,13 @@
 	{3709, 115000},
 	{3718, 120000},
 	{3726, 125000},
-	{TSADCV2_DATA_MASK, 125000},
+	{3820, MAX_TEMP},
+	{TSADCV2_DATA_MASK, MAX_TEMP},
 };
 
 static const struct tsadc_table rk3228_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{568, MIN_TEMP},
 	{588, -40000},
 	{593, -35000},
 	{598, -30000},
@@ -282,11 +300,13 @@
 	{749, 115000},
 	{754, 120000},
 	{760, 125000},
-	{TSADCV2_DATA_MASK, 125000},
+	{821, MAX_TEMP},
+	{TSADCV2_DATA_MASK, MAX_TEMP},
 };
 
 static const struct tsadc_table rk3288_code_table[] = {
-	{TSADCV2_DATA_MASK, -40000},
+	{TSADCV2_DATA_MASK, MIN_TEMP},
+	{3833, MIN_TEMP},
 	{3800, -40000},
 	{3792, -35000},
 	{3783, -30000},
@@ -321,10 +341,15 @@
 	{3452, 115000},
 	{3437, 120000},
 	{3421, 125000},
+	{3350, 145000},
+	{3270, 165000},
+	{3195, MAX_TEMP},
+	{0, MAX_TEMP},
 };
 
 static const struct tsadc_table rk3328_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{261, MIN_TEMP},
 	{296, -40000},
 	{304, -35000},
 	{313, -30000},
@@ -358,11 +383,15 @@
 	{644, 115000},
 	{659, 120000},
 	{675, 125000},
-	{TSADCV2_DATA_MASK, 125000},
+	{745, 145000},
+	{825, 165000},
+	{900, MAX_TEMP},
+	{TSADCV2_DATA_MASK, MAX_TEMP},
 };
 
 static const struct tsadc_table rk3368_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{98, MIN_TEMP},
 	{106, -40000},
 	{108, -35000},
 	{110, -30000},
@@ -397,11 +426,13 @@
 	{167, 115000},
 	{169, 120000},
 	{171, 125000},
-	{TSADCV3_DATA_MASK, 125000},
+	{193, MAX_TEMP},
+	{TSADCV3_DATA_MASK, MAX_TEMP},
 };
 
 static const struct tsadc_table rk3399_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{368, MIN_TEMP},
 	{402, -40000},
 	{410, -35000},
 	{419, -30000},
@@ -436,11 +467,95 @@
 	{668, 115000},
 	{677, 120000},
 	{685, 125000},
-	{TSADCV3_DATA_MASK, 125000},
+	{782, MAX_TEMP},
+	{TSADCV3_DATA_MASK, MAX_TEMP},
+};
+
+static const struct tsadc_table rk3528_code_table[] = {
+	{0, MIN_TEMP},
+	{1386, MIN_TEMP},
+	{1419, -40000},
+	{1427, -35000},
+	{1435, -30000},
+	{1443, -25000},
+	{1452, -20000},
+	{1460, -15000},
+	{1468, -10000},
+	{1477, -5000},
+	{1486, 0},
+	{1494, 5000},
+	{1502, 10000},
+	{1510, 15000},
+	{1519, 20000},
+	{1527, 25000},
+	{1535, 30000},
+	{1544, 35000},
+	{1552, 40000},
+	{1561, 45000},
+	{1569, 50000},
+	{1578, 55000},
+	{1586, 60000},
+	{1594, 65000},
+	{1603, 70000},
+	{1612, 75000},
+	{1620, 80000},
+	{1628, 85000},
+	{1637, 90000},
+	{1646, 95000},
+	{1654, 100000},
+	{1662, 105000},
+	{1671, 110000},
+	{1679, 115000},
+	{1688, 120000},
+	{1696, 125000},
+	{1790, MAX_TEMP},
+	{TSADCV5_DATA_MASK, MAX_TEMP},
+};
+
+static const struct tsadc_table rk3562_code_table[] = {
+	{0, MIN_TEMP},
+	{1385, MIN_TEMP},
+	{1419, -40000},
+	{1428, -35000},
+	{1436, -30000},
+	{1445, -25000},
+	{1453, -20000},
+	{1462, -15000},
+	{1470, -10000},
+	{1479, -5000},
+	{1487, 0},
+	{1496, 5000},
+	{1504, 10000},
+	{1512, 15000},
+	{1521, 20000},
+	{1529, 25000},
+	{1538, 30000},
+	{1546, 35000},
+	{1555, 40000},
+	{1563, 45000},
+	{1572, 50000},
+	{1580, 55000},
+	{1589, 60000},
+	{1598, 65000},
+	{1606, 70000},
+	{1615, 75000},
+	{1623, 80000},
+	{1632, 85000},
+	{1640, 90000},
+	{1648, 95000},
+	{1657, 100000},
+	{1666, 105000},
+	{1674, 110000},
+	{1682, 115000},
+	{1691, 120000},
+	{1699, 125000},
+	{1793, MAX_TEMP},
+	{TSADCV2_DATA_MASK, MAX_TEMP},
 };
 
 static const struct tsadc_table rk3568_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{1448, MIN_TEMP},
 	{1584, -40000},
 	{1620, -35000},
 	{1652, -30000},
@@ -475,16 +590,19 @@
 	{2636, 115000},
 	{2672, 120000},
 	{2704, 125000},
-	{TSADCV2_DATA_MASK, 125000},
+	{3076, MAX_TEMP},
+	{TSADCV2_DATA_MASK, MAX_TEMP},
 };
 
 static const struct tsadc_table rk3588_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{194, MIN_TEMP},
 	{215, -40000},
 	{285, 25000},
 	{350, 85000},
 	{395, 125000},
-	{TSADCV4_DATA_MASK, 125000},
+	{455, MAX_TEMP},
+	{TSADCV4_DATA_MASK, MAX_TEMP},
 };
 
 /*
@@ -806,6 +924,81 @@
 	tsadc_init_v2(dev);
 	if (!IS_ERR(priv->grf))
 		writel(PX30S_TSADC_TDC_MODE, priv->grf + PX30_GRF_SOC_CON0);
+}
+
+static void tsadc_init_v11(struct udevice *dev)
+{
+	struct rockchip_thermal_priv *priv = dev_get_priv(dev);
+
+	writel(TSADCV7_AUTO_PERIOD_TIME, priv->base + TSADCV3_AUTO_PERIOD);
+	writel(TSADCV7_AUTO_PERIOD_HT_TIME,
+	       priv->base + TSADCV3_AUTO_PERIOD_HT);
+	writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
+	       priv->base + TSADCV3_HIGHT_INT_DEBOUNCE);
+	writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
+	       priv->base + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
+	writel(TSADCV3_Q_MAX_VAL, priv->base + TSADCV3_Q_MAX);
+	writel(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
+	       priv->base + TSADCV2_AUTO_CON);
+
+	if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE)
+		writel(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
+		       TSADCV2_AUTO_TSHUT_POLARITY_MASK,
+		       priv->base + TSADCV2_AUTO_CON);
+	else
+		writel(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
+		       priv->base + TSADCV2_AUTO_CON);
+
+	if (!IS_ERR(priv->grf)) {
+		writel(RK3568_GRF_TSADC_TSEN,
+		       priv->grf + RK3528_GRF_TSADC_CON);
+		udelay(15);
+		writel(RK3568_GRF_TSADC_ANA_REG0,
+		       priv->grf + RK3528_GRF_TSADC_CON);
+		writel(RK3568_GRF_TSADC_ANA_REG1,
+		       priv->grf + RK3528_GRF_TSADC_CON);
+		writel(RK3568_GRF_TSADC_ANA_REG2,
+		       priv->grf + RK3528_GRF_TSADC_CON);
+		udelay(200);
+	}
+}
+
+static void tsadc_init_v12(struct udevice *dev)
+{
+	struct rockchip_thermal_priv *priv = dev_get_priv(dev);
+
+	writel(TSADCV12_AUTO_PERIOD_TIME,
+	       priv->base + TSADCV3_AUTO_PERIOD);
+	writel(TSADCV12_AUTO_PERIOD_HT_TIME,
+	       priv->base + TSADCV3_AUTO_PERIOD_HT);
+	writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
+	       priv->base + TSADCV3_HIGHT_INT_DEBOUNCE);
+	writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
+	       priv->base + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
+	writel(TSADCV12_Q_MAX_VAL,
+	       priv->base + TSADCV9_Q_MAX);
+	writel(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
+	       priv->base + TSADCV2_AUTO_CON);
+	if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE)
+		writel(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
+		       TSADCV2_AUTO_TSHUT_POLARITY_MASK,
+		       priv->base + TSADCV2_AUTO_CON);
+	else
+		writel(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
+		       priv->base + TSADCV2_AUTO_CON);
+
+	if (!IS_ERR(priv->grf)) {
+		writel(RK3568_GRF_TSADC_TSEN,
+		       priv->grf + RK3562_GRF_TSADC_CON);
+		udelay(15);
+		writel(RK3568_GRF_TSADC_ANA_REG0,
+		       priv->grf + RK3562_GRF_TSADC_CON);
+		writel(RK3568_GRF_TSADC_ANA_REG1,
+		       priv->grf + RK3562_GRF_TSADC_CON);
+		writel(RK3568_GRF_TSADC_ANA_REG2,
+		       priv->grf + RK3562_GRF_TSADC_CON);
+		udelay(200);
+	}
 }
 
 static int tsadc_get_temp_v2(struct udevice *dev,
@@ -1381,6 +1574,54 @@
 	},
 };
 
+static const struct rockchip_tsadc_chip rk3528_tsadc_data = {
+	.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
+	.chn_num = 1, /* one channels for tsadc */
+
+	.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via GPIO give PMIC */
+	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
+	.tshut_temp = 95000,
+
+	.tsadc_init = tsadc_init_v11,
+	.tsadc_control = tsadc_control_v4,
+	.tsadc_get_temp = tsadc_get_temp_v4,
+	.irq_ack = tsadc_irq_ack_v4,
+	.set_alarm_temp = tsadc_alarm_temp_v3,
+	.set_tshut_temp = tsadc_tshut_temp_v3,
+	.set_tshut_mode = tsadc_tshut_mode_v4,
+
+	.table = {
+		.id = rk3528_code_table,
+		.length = ARRAY_SIZE(rk3528_code_table),
+		.data_mask = TSADCV2_DATA_MASK,
+		.mode = ADC_INCREMENT,
+	},
+};
+
+static const struct rockchip_tsadc_chip rk3562_tsadc_data = {
+	.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
+	.chn_num = 1, /* one channels for tsadc */
+
+	.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
+	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
+	.tshut_temp = 95000,
+
+	.tsadc_init = tsadc_init_v12,
+	.tsadc_control = tsadc_control_v4,
+	.tsadc_get_temp = tsadc_get_temp_v4,
+	.irq_ack = tsadc_irq_ack_v4,
+	.set_alarm_temp = tsadc_alarm_temp_v3,
+	.set_tshut_temp = tsadc_tshut_temp_v3,
+	.set_tshut_mode = tsadc_tshut_mode_v4,
+
+	.table = {
+		.id = rk3562_code_table,
+		.length = ARRAY_SIZE(rk3562_code_table),
+		.data_mask = TSADCV2_DATA_MASK,
+		.mode = ADC_INCREMENT,
+	},
+};
+
 static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
 	.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
 	.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
@@ -1477,6 +1718,14 @@
 		.data = (ulong)&rk3399_tsadc_data,
 	},
 	{
+		.compatible = "rockchip,rk3528-tsadc",
+		.data = (ulong)&rk3528_tsadc_data,
+	},
+	{
+		.compatible = "rockchip,rk3562-tsadc",
+		.data = (ulong)&rk3562_tsadc_data,
+	},
+	{
 		.compatible = "rockchip,rk3568-tsadc",
 		.data = (ulong)&rk3568_tsadc_data,
 	},
diff --git a/u-boot/drivers/ufs/Kconfig b/u-boot/drivers/ufs/Kconfig
new file mode 100644
index 0000000..69ea18e
--- /dev/null
+++ b/u-boot/drivers/ufs/Kconfig
@@ -0,0 +1,24 @@
+menu "UFS Host Controller Support"
+
+config UFS
+	bool "Support UFS controllers"
+	depends on DM_SCSI
+	select CHARSET
+	help
+	  This selects support for Universal Flash Subsystem (UFS).
+	  Say Y here if you want UFS Support.
+
+config CADENCE_UFS
+	bool "Cadence platform driver for UFS"
+	depends on UFS
+        help
+	  This selects the platform driver for the Cadence UFS host
+	  controller present on present TI's J721e devices.
+
+config TI_J721E_UFS
+	bool "Glue Layer driver for UFS on TI J721E devices"
+	help
+	  This selects the glue layer driver for Cadence controller
+	  present on TI's J721E devices.
+
+endmenu
diff --git a/u-boot/drivers/ufs/Makefile b/u-boot/drivers/ufs/Makefile
new file mode 100644
index 0000000..62ed016
--- /dev/null
+++ b/u-boot/drivers/ufs/Makefile
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
+#
+
+obj-$(CONFIG_UFS) += ufs.o ufs-uclass.o
+obj-$(CONFIG_CADENCE_UFS) += cdns-platform.o
+obj-$(CONFIG_TI_J721E_UFS) += ti-j721e-ufs.o
diff --git a/u-boot/drivers/ufs/cdns-platform.c b/u-boot/drivers/ufs/cdns-platform.c
new file mode 100644
index 0000000..dc78c9d
--- /dev/null
+++ b/u-boot/drivers/ufs/cdns-platform.c
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: GPL-2.0+
+/**
+ * cdns-platform.c - Platform driver for Cadence UFSHCI device
+ *
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
+ */
+
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+#include <ufs.h>
+#include <asm/io.h>
+#include <linux/bitops.h>
+#include <linux/err.h>
+
+#include "ufs.h"
+
+#define USEC_PER_SEC	1000000L
+
+#define CDNS_UFS_REG_HCLKDIV	0xFC
+#define CDNS_UFS_REG_PHY_XCFGD1	0x113C
+
+static int cdns_ufs_link_startup_notify(struct ufs_hba *hba,
+					enum ufs_notify_change_status status)
+{
+	hba->quirks |= UFSHCD_QUIRK_BROKEN_LCC;
+	switch (status) {
+	case PRE_CHANGE:
+		return ufshcd_dme_set(hba,
+				      UIC_ARG_MIB(PA_LOCAL_TX_LCC_ENABLE),
+				      0);
+	case POST_CHANGE:
+	;
+	}
+
+	return 0;
+}
+
+static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba)
+{
+	struct clk clk;
+	unsigned long core_clk_rate = 0;
+	u32 core_clk_div = 0;
+	int ret;
+
+	ret = clk_get_by_name(hba->dev, "core_clk", &clk);
+	if (ret) {
+		dev_err(hba->dev, "failed to get core_clk clock\n");
+		return ret;
+	}
+
+	core_clk_rate = clk_get_rate(&clk);
+	if (IS_ERR_VALUE(core_clk_rate)) {
+		dev_err(hba->dev, "%s: unable to find core_clk rate\n",
+			__func__);
+		return core_clk_rate;
+	}
+
+	core_clk_div = core_clk_rate / USEC_PER_SEC;
+	ufshcd_writel(hba, core_clk_div, CDNS_UFS_REG_HCLKDIV);
+
+	return 0;
+}
+
+static int cdns_ufs_hce_enable_notify(struct ufs_hba *hba,
+				      enum ufs_notify_change_status status)
+{
+	switch (status) {
+	case PRE_CHANGE:
+		return cdns_ufs_set_hclkdiv(hba);
+	case POST_CHANGE:
+	;
+	}
+
+	return 0;
+}
+
+static int cdns_ufs_init(struct ufs_hba *hba)
+{
+	u32 data;
+
+	/* Increase RX_Advanced_Min_ActivateTime_Capability */
+	data = ufshcd_readl(hba, CDNS_UFS_REG_PHY_XCFGD1);
+	data |= BIT(24);
+	ufshcd_writel(hba, data, CDNS_UFS_REG_PHY_XCFGD1);
+
+	return 0;
+}
+
+static struct ufs_hba_ops cdns_pltfm_hba_ops = {
+	.init = cdns_ufs_init,
+	.hce_enable_notify = cdns_ufs_hce_enable_notify,
+	.link_startup_notify = cdns_ufs_link_startup_notify,
+};
+
+static int cdns_ufs_pltfm_probe(struct udevice *dev)
+{
+	int err = ufshcd_probe(dev, &cdns_pltfm_hba_ops);
+	if (err)
+		dev_err(dev, "ufshcd_probe() failed %d\n", err);
+
+	return err;
+}
+
+static int cdns_ufs_pltfm_bind(struct udevice *dev)
+{
+	struct udevice *scsi_dev;
+
+	return ufs_scsi_bind(dev, &scsi_dev);
+}
+
+static const struct udevice_id cdns_ufs_pltfm_ids[] = {
+	{
+		.compatible = "cdns,ufshc-m31-16nm",
+	},
+	{},
+};
+
+U_BOOT_DRIVER(cdns_ufs_pltfm) = {
+	.name		= "cdns-ufs-pltfm",
+	.id		=  UCLASS_UFS,
+	.of_match	= cdns_ufs_pltfm_ids,
+	.probe		= cdns_ufs_pltfm_probe,
+	.bind		= cdns_ufs_pltfm_bind,
+};
diff --git a/u-boot/drivers/ufs/ti-j721e-ufs.c b/u-boot/drivers/ufs/ti-j721e-ufs.c
new file mode 100644
index 0000000..7b157ed
--- /dev/null
+++ b/u-boot/drivers/ufs/ti-j721e-ufs.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+#include <asm/io.h>
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+//#include <dm/device_compat.h>
+#include <linux/bitops.h>
+#include <linux/err.h>
+
+#define UFS_SS_CTRL             0x4
+#define UFS_SS_RST_N_PCS        BIT(0)
+#define UFS_SS_CLK_26MHZ        BIT(4)
+
+static int ti_j721e_ufs_probe(struct udevice *dev)
+{
+	void __iomem *base;
+	unsigned int clock;
+	struct clk clk;
+	u32 reg = 0;
+	int ret;
+
+	ret = clk_get_by_index(dev, 0, &clk);
+	if (ret) {
+		dev_err(dev, "failed to get M-PHY clock\n");
+		return ret;
+	}
+
+	clock = clk_get_rate(&clk);
+	if (IS_ERR_VALUE(clock)) {
+		dev_err(dev, "failed to get rate\n");
+		return ret;
+	}
+
+	base = dev_remap_addr_index(dev, 0);
+
+	if (clock == 26000000)
+		reg |= UFS_SS_CLK_26MHZ;
+	/* Take UFS slave device out of reset */
+	reg |= UFS_SS_RST_N_PCS;
+	writel(reg, base + UFS_SS_CTRL);
+
+	return 0;
+}
+
+static int ti_j721e_ufs_remove(struct udevice *dev)
+{
+	void __iomem *base = dev_remap_addr_index(dev, 0);
+	u32 reg = readl(base + UFS_SS_CTRL);
+
+	reg &= ~UFS_SS_RST_N_PCS;
+	writel(reg, base + UFS_SS_CTRL);
+
+	return 0;
+}
+
+static const struct udevice_id ti_j721e_ufs_ids[] = {
+	{
+		.compatible = "ti,j721e-ufs",
+	},
+	{},
+};
+
+U_BOOT_DRIVER(ti_j721e_ufs) = {
+	.name			= "ti-j721e-ufs",
+	.id			= UCLASS_MISC,
+	.of_match		= ti_j721e_ufs_ids,
+	.probe			= ti_j721e_ufs_probe,
+	.remove			= ti_j721e_ufs_remove,
+	.flags			= DM_FLAG_OS_PREPARE,
+};
diff --git a/u-boot/drivers/ufs/ufs-uclass.c b/u-boot/drivers/ufs/ufs-uclass.c
new file mode 100644
index 0000000..6612f44
--- /dev/null
+++ b/u-boot/drivers/ufs/ufs-uclass.c
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0
+/**
+ * ufs-uclass.c - Universal Flash Subsystem (UFS) Uclass driver
+ *
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
+ */
+
+#define LOG_CATEGORY UCLASS_UFS
+
+#include <common.h>
+#include "ufs.h"
+#include <dm.h>
+
+UCLASS_DRIVER(ufs) = {
+	.id	= UCLASS_UFS,
+	.name	= "ufs",
+	.per_device_auto_alloc_size = sizeof(struct ufs_hba),
+};
diff --git a/u-boot/drivers/ufs/ufs.c b/u-boot/drivers/ufs/ufs.c
new file mode 100644
index 0000000..6273b29
--- /dev/null
+++ b/u-boot/drivers/ufs/ufs.c
@@ -0,0 +1,1970 @@
+// SPDX-License-Identifier: GPL-2.0+
+/**
+ * ufs.c - Universal Flash Subsystem (UFS) driver
+ *
+ * Taken from Linux Kernel v5.2 (drivers/scsi/ufs/ufshcd.c) and ported
+ * to u-boot.
+ *
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
+ */
+#include <charset.h>
+#include <common.h>
+#include <dm.h>
+#include <log.h>
+#include <dm/lists.h>
+#include <dm/device-internal.h>
+#include <malloc.h>
+#include <hexdump.h>
+#include <scsi.h>
+#include <asm/io.h>
+#include <asm/dma-mapping.h>
+#include <linux/bitops.h>
+#include <linux/delay.h>
+
+#include "ufs.h"
+
+#define UFSHCD_ENABLE_INTRS	(UTP_TRANSFER_REQ_COMPL |\
+				 UTP_TASK_REQ_COMPL |\
+				 UFSHCD_ERROR_MASK)
+/* maximum number of link-startup retries */
+#define DME_LINKSTARTUP_RETRIES 3
+
+/* maximum number of retries for a general UIC command  */
+#define UFS_UIC_COMMAND_RETRIES 3
+
+/* Query request retries */
+#define QUERY_REQ_RETRIES 3
+/* Query request timeout */
+#define QUERY_REQ_TIMEOUT 1500 /* 1.5 seconds */
+
+/* maximum timeout in ms for a general UIC command */
+#define UFS_UIC_CMD_TIMEOUT	1000
+/* NOP OUT retries waiting for NOP IN response */
+#define NOP_OUT_RETRIES    10
+/* Timeout after 30 msecs if NOP OUT hangs without response */
+#define NOP_OUT_TIMEOUT    30 /* msecs */
+
+/* Only use one Task Tag for all requests */
+#define TASK_TAG	0
+
+/* Expose the flag value from utp_upiu_query.value */
+#define MASK_QUERY_UPIU_FLAG_LOC 0xFF
+
+#define MAX_PRDT_ENTRY	262144
+
+/* maximum bytes per request */
+#define UFS_MAX_BYTES	(128 * 256 * 1024)
+
+static inline bool ufshcd_is_hba_active(struct ufs_hba *hba);
+static inline void ufshcd_hba_stop(struct ufs_hba *hba);
+static int ufshcd_hba_enable(struct ufs_hba *hba);
+
+/*
+ * ufshcd_wait_for_register - wait for register value to change
+ */
+static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
+				    u32 val, unsigned long timeout_ms)
+{
+	int err = 0;
+	unsigned long start = get_timer(0);
+
+	/* ignore bits that we don't intend to wait on */
+	val = val & mask;
+
+	while ((ufshcd_readl(hba, reg) & mask) != val) {
+		if (get_timer(start) > timeout_ms) {
+			if ((ufshcd_readl(hba, reg) & mask) != val)
+				err = -ETIMEDOUT;
+			break;
+		}
+	}
+
+	return err;
+}
+
+/**
+ * ufshcd_init_pwr_info - setting the POR (power on reset)
+ * values in hba power info
+ */
+static void ufshcd_init_pwr_info(struct ufs_hba *hba)
+{
+	hba->pwr_info.gear_rx = UFS_PWM_G1;
+	hba->pwr_info.gear_tx = UFS_PWM_G1;
+	hba->pwr_info.lane_rx = 1;
+	hba->pwr_info.lane_tx = 1;
+	hba->pwr_info.pwr_rx = SLOWAUTO_MODE;
+	hba->pwr_info.pwr_tx = SLOWAUTO_MODE;
+	hba->pwr_info.hs_rate = 0;
+}
+
+/**
+ * ufshcd_print_pwr_info - print power params as saved in hba
+ * power info
+ */
+static void ufshcd_print_pwr_info(struct ufs_hba *hba)
+{
+	static const char * const names[] = {
+		"INVALID MODE",
+		"FAST MODE",
+		"SLOW_MODE",
+		"INVALID MODE",
+		"FASTAUTO_MODE",
+		"SLOWAUTO_MODE",
+		"INVALID MODE",
+	};
+
+	dev_err(hba->dev, "[RX, TX]: gear=[%d, %d], lane[%d, %d], pwr[%s, %s], rate = %d\n",
+		hba->pwr_info.gear_rx, hba->pwr_info.gear_tx,
+		hba->pwr_info.lane_rx, hba->pwr_info.lane_tx,
+		names[hba->pwr_info.pwr_rx],
+		names[hba->pwr_info.pwr_tx],
+		hba->pwr_info.hs_rate);
+}
+
+/**
+ * ufshcd_ready_for_uic_cmd - Check if controller is ready
+ *                            to accept UIC commands
+ */
+static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba)
+{
+	if (ufshcd_readl(hba, REG_CONTROLLER_STATUS) & UIC_COMMAND_READY)
+		return true;
+	else
+		return false;
+}
+
+/**
+ * ufshcd_get_uic_cmd_result - Get the UIC command result
+ */
+static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba)
+{
+	return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2) &
+	       MASK_UIC_COMMAND_RESULT;
+}
+
+/**
+ * ufshcd_get_dme_attr_val - Get the value of attribute returned by UIC command
+ */
+static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba)
+{
+	return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3);
+}
+
+/**
+ * ufshcd_is_device_present - Check if any device connected to
+ *			      the host controller
+ */
+static inline bool ufshcd_is_device_present(struct ufs_hba *hba)
+{
+	return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) &
+						DEVICE_PRESENT) ? true : false;
+}
+
+/**
+ * ufshcd_send_uic_cmd - UFS Interconnect layer command API
+ *
+ */
+static int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
+{
+	unsigned long start = 0;
+	u32 intr_status;
+	u32 enabled_intr_status;
+
+	if (!ufshcd_ready_for_uic_cmd(hba)) {
+		dev_err(hba->dev,
+			"Controller not ready to accept UIC commands\n");
+		return -EIO;
+	}
+
+	debug("sending uic command:%d\n", uic_cmd->command);
+
+	/* Write Args */
+	ufshcd_writel(hba, uic_cmd->argument1, REG_UIC_COMMAND_ARG_1);
+	ufshcd_writel(hba, uic_cmd->argument2, REG_UIC_COMMAND_ARG_2);
+	ufshcd_writel(hba, uic_cmd->argument3, REG_UIC_COMMAND_ARG_3);
+
+	/* Write UIC Cmd */
+	ufshcd_writel(hba, uic_cmd->command & COMMAND_OPCODE_MASK,
+		      REG_UIC_COMMAND);
+
+	start = get_timer(0);
+	do {
+		intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
+		enabled_intr_status = intr_status & hba->intr_mask;
+		ufshcd_writel(hba, intr_status, REG_INTERRUPT_STATUS);
+
+		if (get_timer(start) > UFS_UIC_CMD_TIMEOUT) {
+			dev_err(hba->dev,
+				"Timedout waiting for UIC response\n");
+
+			return -ETIMEDOUT;
+		}
+
+		if (enabled_intr_status & UFSHCD_ERROR_MASK) {
+			dev_err(hba->dev, "Error in status:%08x\n",
+				enabled_intr_status);
+
+			return -1;
+		}
+	} while (!(enabled_intr_status & UFSHCD_UIC_MASK));
+
+	uic_cmd->argument2 = ufshcd_get_uic_cmd_result(hba);
+	uic_cmd->argument3 = ufshcd_get_dme_attr_val(hba);
+
+	debug("Sent successfully\n");
+
+	return 0;
+}
+
+/**
+ * ufshcd_dme_set_attr - UIC command for DME_SET, DME_PEER_SET
+ *
+ */
+int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set,
+			u32 mib_val, u8 peer)
+{
+	struct uic_command uic_cmd = {0};
+	static const char *const action[] = {
+		"dme-set",
+		"dme-peer-set"
+	};
+	const char *set = action[!!peer];
+	int ret;
+	int retries = UFS_UIC_COMMAND_RETRIES;
+
+	uic_cmd.command = peer ?
+		UIC_CMD_DME_PEER_SET : UIC_CMD_DME_SET;
+	uic_cmd.argument1 = attr_sel;
+	uic_cmd.argument2 = UIC_ARG_ATTR_TYPE(attr_set);
+	uic_cmd.argument3 = mib_val;
+
+	do {
+		/* for peer attributes we retry upon failure */
+		ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
+		if (ret)
+			dev_dbg(hba->dev, "%s: attr-id 0x%x val 0x%x error code %d\n",
+				set, UIC_GET_ATTR_ID(attr_sel), mib_val, ret);
+	} while (ret && peer && --retries);
+
+	if (ret)
+		dev_err(hba->dev, "%s: attr-id 0x%x val 0x%x failed %d retries\n",
+			set, UIC_GET_ATTR_ID(attr_sel), mib_val,
+			UFS_UIC_COMMAND_RETRIES - retries);
+
+	return ret;
+}
+
+/**
+ * ufshcd_dme_get_attr - UIC command for DME_GET, DME_PEER_GET
+ *
+ */
+int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
+			u32 *mib_val, u8 peer)
+{
+	struct uic_command uic_cmd = {0};
+	static const char *const action[] = {
+		"dme-get",
+		"dme-peer-get"
+	};
+	const char *get = action[!!peer];
+	int ret;
+	int retries = UFS_UIC_COMMAND_RETRIES;
+
+	uic_cmd.command = peer ?
+		UIC_CMD_DME_PEER_GET : UIC_CMD_DME_GET;
+	uic_cmd.argument1 = attr_sel;
+
+	do {
+		/* for peer attributes we retry upon failure */
+		ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
+		if (ret)
+			dev_dbg(hba->dev, "%s: attr-id 0x%x error code %d\n",
+				get, UIC_GET_ATTR_ID(attr_sel), ret);
+	} while (ret && peer && --retries);
+
+	if (ret)
+		dev_err(hba->dev, "%s: attr-id 0x%x failed %d retries\n",
+			get, UIC_GET_ATTR_ID(attr_sel),
+			UFS_UIC_COMMAND_RETRIES - retries);
+
+	if (mib_val && !ret)
+		*mib_val = uic_cmd.argument3;
+
+	return ret;
+}
+
+static int ufshcd_disable_tx_lcc(struct ufs_hba *hba, bool peer)
+{
+	u32 tx_lanes, i, err = 0;
+
+	if (!peer)
+		ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES),
+			       &tx_lanes);
+	else
+		ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES),
+				    &tx_lanes);
+	for (i = 0; i < tx_lanes; i++) {
+		if (!peer)
+			err = ufshcd_dme_set(hba,
+					     UIC_ARG_MIB_SEL(TX_LCC_ENABLE,
+					     UIC_ARG_MPHY_TX_GEN_SEL_INDEX(i)),
+					     0);
+		else
+			err = ufshcd_dme_peer_set(hba,
+					UIC_ARG_MIB_SEL(TX_LCC_ENABLE,
+					UIC_ARG_MPHY_TX_GEN_SEL_INDEX(i)),
+					0);
+		if (err) {
+			dev_err(hba->dev, "%s: TX LCC Disable failed, peer = %d, lane = %d, err = %d",
+				__func__, peer, i, err);
+			break;
+		}
+	}
+
+	return err;
+}
+
+static inline int ufshcd_disable_device_tx_lcc(struct ufs_hba *hba)
+{
+	return ufshcd_disable_tx_lcc(hba, true);
+}
+
+/**
+ * ufshcd_dme_link_startup - Notify Unipro to perform link startup
+ *
+ */
+static int ufshcd_dme_link_startup(struct ufs_hba *hba)
+{
+	struct uic_command uic_cmd = {0};
+	int ret;
+
+	uic_cmd.command = UIC_CMD_DME_LINK_STARTUP;
+
+	ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
+	if (ret)
+		dev_dbg(hba->dev,
+			"dme-link-startup: error code %d\n", ret);
+	return ret;
+}
+
+/**
+ * ufshcd_disable_intr_aggr - Disables interrupt aggregation.
+ *
+ */
+static inline void ufshcd_disable_intr_aggr(struct ufs_hba *hba)
+{
+	ufshcd_writel(hba, 0, REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL);
+}
+
+/**
+ * ufshcd_get_lists_status - Check UCRDY, UTRLRDY and UTMRLRDY
+ */
+static inline int ufshcd_get_lists_status(u32 reg)
+{
+	return !((reg & UFSHCD_STATUS_READY) == UFSHCD_STATUS_READY);
+}
+
+/**
+ * ufshcd_enable_run_stop_reg - Enable run-stop registers,
+ *			When run-stop registers are set to 1, it indicates the
+ *			host controller that it can process the requests
+ */
+static void ufshcd_enable_run_stop_reg(struct ufs_hba *hba)
+{
+	ufshcd_writel(hba, UTP_TASK_REQ_LIST_RUN_STOP_BIT,
+		      REG_UTP_TASK_REQ_LIST_RUN_STOP);
+	ufshcd_writel(hba, UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT,
+		      REG_UTP_TRANSFER_REQ_LIST_RUN_STOP);
+}
+
+/**
+ * ufshcd_enable_intr - enable interrupts
+ */
+static void ufshcd_enable_intr(struct ufs_hba *hba, u32 intrs)
+{
+	u32 set = ufshcd_readl(hba, REG_INTERRUPT_ENABLE);
+	u32 rw;
+
+	if (hba->version == UFSHCI_VERSION_10) {
+		rw = set & INTERRUPT_MASK_RW_VER_10;
+		set = rw | ((set ^ intrs) & intrs);
+	} else {
+		set |= intrs;
+	}
+
+	ufshcd_writel(hba, set, REG_INTERRUPT_ENABLE);
+
+	hba->intr_mask = set;
+}
+
+/**
+ * ufshcd_make_hba_operational - Make UFS controller operational
+ *
+ * To bring UFS host controller to operational state,
+ * 1. Enable required interrupts
+ * 2. Configure interrupt aggregation
+ * 3. Program UTRL and UTMRL base address
+ * 4. Configure run-stop-registers
+ *
+ */
+static int ufshcd_make_hba_operational(struct ufs_hba *hba)
+{
+	int err = 0;
+	u32 reg;
+
+	/* Enable required interrupts */
+	ufshcd_enable_intr(hba, UFSHCD_ENABLE_INTRS);
+
+	/* Disable interrupt aggregation */
+	ufshcd_disable_intr_aggr(hba);
+
+	/* Configure UTRL and UTMRL base address registers */
+	ufshcd_writel(hba, lower_32_bits((dma_addr_t)hba->utrdl),
+		      REG_UTP_TRANSFER_REQ_LIST_BASE_L);
+	ufshcd_writel(hba, upper_32_bits((dma_addr_t)hba->utrdl),
+		      REG_UTP_TRANSFER_REQ_LIST_BASE_H);
+	ufshcd_writel(hba, lower_32_bits((dma_addr_t)hba->utmrdl),
+		      REG_UTP_TASK_REQ_LIST_BASE_L);
+	ufshcd_writel(hba, upper_32_bits((dma_addr_t)hba->utmrdl),
+		      REG_UTP_TASK_REQ_LIST_BASE_H);
+
+	/*
+	 * UCRDY, UTMRLDY and UTRLRDY bits must be 1
+	 */
+	reg = ufshcd_readl(hba, REG_CONTROLLER_STATUS);
+	if (!(ufshcd_get_lists_status(reg))) {
+		ufshcd_enable_run_stop_reg(hba);
+	} else {
+		dev_err(hba->dev,
+			"Host controller not ready to process requests");
+		err = -EIO;
+		goto out;
+	}
+
+out:
+	return err;
+}
+
+/**
+ * ufshcd_link_startup - Initialize unipro link startup
+ */
+static int ufshcd_link_startup(struct ufs_hba *hba)
+{
+	int ret;
+	int retries = DME_LINKSTARTUP_RETRIES;
+	bool link_startup_again = true;
+
+link_startup:
+	do {
+		ufshcd_ops_link_startup_notify(hba, PRE_CHANGE);
+
+		ret = ufshcd_dme_link_startup(hba);
+
+		/* check if device is detected by inter-connect layer */
+		if (!ret && !ufshcd_is_device_present(hba)) {
+			dev_err(hba->dev, "%s: Device not present\n", __func__);
+			ret = -ENXIO;
+			goto out;
+		}
+
+		/*
+		 * DME link lost indication is only received when link is up,
+		 * but we can't be sure if the link is up until link startup
+		 * succeeds. So reset the local Uni-Pro and try again.
+		 */
+		if (ret && ufshcd_hba_enable(hba))
+			goto out;
+	} while (ret && retries--);
+
+	if (ret)
+		/* failed to get the link up... retire */
+		goto out;
+
+	if (link_startup_again) {
+		link_startup_again = false;
+		retries = DME_LINKSTARTUP_RETRIES;
+		goto link_startup;
+	}
+
+	/* Mark that link is up in PWM-G1, 1-lane, SLOW-AUTO mode */
+	ufshcd_init_pwr_info(hba);
+
+	if (hba->quirks & UFSHCD_QUIRK_BROKEN_LCC) {
+		ret = ufshcd_disable_device_tx_lcc(hba);
+		if (ret)
+			goto out;
+	}
+
+	/* Include any host controller configuration via UIC commands */
+	ret = ufshcd_ops_link_startup_notify(hba, POST_CHANGE);
+	if (ret)
+		goto out;
+
+	ret = ufshcd_make_hba_operational(hba);
+out:
+	if (ret)
+		dev_err(hba->dev, "link startup failed %d\n", ret);
+
+	return ret;
+}
+
+/**
+ * ufshcd_hba_stop - Send controller to reset state
+ */
+static inline void ufshcd_hba_stop(struct ufs_hba *hba)
+{
+	int err;
+
+	ufshcd_writel(hba, CONTROLLER_DISABLE,  REG_CONTROLLER_ENABLE);
+	err = ufshcd_wait_for_register(hba, REG_CONTROLLER_ENABLE,
+				       CONTROLLER_ENABLE, CONTROLLER_DISABLE,
+				       10);
+	if (err)
+		dev_err(hba->dev, "%s: Controller disable failed\n", __func__);
+}
+
+/**
+ * ufshcd_is_hba_active - Get controller state
+ */
+static inline bool ufshcd_is_hba_active(struct ufs_hba *hba)
+{
+	return (ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & CONTROLLER_ENABLE)
+		? false : true;
+}
+
+/**
+ * ufshcd_hba_start - Start controller initialization sequence
+ */
+static inline void ufshcd_hba_start(struct ufs_hba *hba)
+{
+	ufshcd_writel(hba, CONTROLLER_ENABLE, REG_CONTROLLER_ENABLE);
+}
+
+/**
+ * ufshcd_hba_enable - initialize the controller
+ */
+static int ufshcd_hba_enable(struct ufs_hba *hba)
+{
+	int retry;
+
+	if (!ufshcd_is_hba_active(hba))
+		/* change controller state to "reset state" */
+		ufshcd_hba_stop(hba);
+
+	ufshcd_ops_hce_enable_notify(hba, PRE_CHANGE);
+
+	/* start controller initialization sequence */
+	ufshcd_hba_start(hba);
+
+	/*
+	 * To initialize a UFS host controller HCE bit must be set to 1.
+	 * During initialization the HCE bit value changes from 1->0->1.
+	 * When the host controller completes initialization sequence
+	 * it sets the value of HCE bit to 1. The same HCE bit is read back
+	 * to check if the controller has completed initialization sequence.
+	 * So without this delay the value HCE = 1, set in the previous
+	 * instruction might be read back.
+	 * This delay can be changed based on the controller.
+	 */
+	mdelay(1);
+
+	/* wait for the host controller to complete initialization */
+	retry = 10;
+	while (ufshcd_is_hba_active(hba)) {
+		if (retry) {
+			retry--;
+		} else {
+			dev_err(hba->dev, "Controller enable failed\n");
+			return -EIO;
+		}
+		mdelay(5);
+	}
+
+	/* enable UIC related interrupts */
+	ufshcd_enable_intr(hba, UFSHCD_UIC_MASK);
+
+	ufshcd_ops_hce_enable_notify(hba, POST_CHANGE);
+
+	return 0;
+}
+
+/**
+ * ufshcd_host_memory_configure - configure local reference block with
+ *				memory offsets
+ */
+static void ufshcd_host_memory_configure(struct ufs_hba *hba)
+{
+	struct utp_transfer_req_desc *utrdlp;
+	dma_addr_t cmd_desc_dma_addr;
+	u16 response_offset;
+	u16 prdt_offset;
+
+	utrdlp = hba->utrdl;
+	cmd_desc_dma_addr = (dma_addr_t)hba->ucdl;
+
+	utrdlp->command_desc_base_addr_lo =
+				cpu_to_le32(lower_32_bits(cmd_desc_dma_addr));
+	utrdlp->command_desc_base_addr_hi =
+				cpu_to_le32(upper_32_bits(cmd_desc_dma_addr));
+
+	response_offset = offsetof(struct utp_transfer_cmd_desc, response_upiu);
+	prdt_offset = offsetof(struct utp_transfer_cmd_desc, prd_table);
+
+	utrdlp->response_upiu_offset = cpu_to_le16(response_offset >> 2);
+	utrdlp->prd_table_offset = cpu_to_le16(prdt_offset >> 2);
+	utrdlp->response_upiu_length = cpu_to_le16(ALIGNED_UPIU_SIZE >> 2);
+
+	hba->ucd_req_ptr = (struct utp_upiu_req *)hba->ucdl;
+	hba->ucd_rsp_ptr =
+		(struct utp_upiu_rsp *)&hba->ucdl->response_upiu;
+	hba->ucd_prdt_ptr =
+		(struct ufshcd_sg_entry *)&hba->ucdl->prd_table;
+}
+
+/**
+ * ufshcd_memory_alloc - allocate memory for host memory space data structures
+ */
+static int ufshcd_memory_alloc(struct ufs_hba *hba)
+{
+	/* Allocate one Transfer Request Descriptor
+	 * Should be aligned to 1k boundary.
+	 */
+	hba->utrdl = memalign(1024, sizeof(struct utp_transfer_req_desc));
+	if (!hba->utrdl) {
+		dev_err(hba->dev, "Transfer Descriptor memory allocation failed\n");
+		return -ENOMEM;
+	}
+
+	/* Allocate one Command Descriptor
+	 * Should be aligned to 1k boundary.
+	 */
+	hba->ucdl = memalign(1024, sizeof(struct utp_transfer_cmd_desc));
+	if (!hba->ucdl) {
+		dev_err(hba->dev, "Command descriptor memory allocation failed\n");
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+/**
+ * ufshcd_get_intr_mask - Get the interrupt bit mask
+ */
+static inline u32 ufshcd_get_intr_mask(struct ufs_hba *hba)
+{
+	u32 intr_mask = 0;
+
+	switch (hba->version) {
+	case UFSHCI_VERSION_10:
+		intr_mask = INTERRUPT_MASK_ALL_VER_10;
+		break;
+	case UFSHCI_VERSION_11:
+	case UFSHCI_VERSION_20:
+		intr_mask = INTERRUPT_MASK_ALL_VER_11;
+		break;
+	case UFSHCI_VERSION_21:
+	default:
+		intr_mask = INTERRUPT_MASK_ALL_VER_21;
+		break;
+	}
+
+	return intr_mask;
+}
+
+/**
+ * ufshcd_get_ufs_version - Get the UFS version supported by the HBA
+ */
+static inline u32 ufshcd_get_ufs_version(struct ufs_hba *hba)
+{
+	return ufshcd_readl(hba, REG_UFS_VERSION);
+}
+
+/**
+ * ufshcd_get_upmcrs - Get the power mode change request status
+ */
+static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba)
+{
+	return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) >> 8) & 0x7;
+}
+
+/**
+ * ufshcd_prepare_req_desc_hdr() - Fills the requests header
+ * descriptor according to request
+ */
+static void ufshcd_prepare_req_desc_hdr(struct utp_transfer_req_desc *req_desc,
+					u32 *upiu_flags,
+					enum dma_data_direction cmd_dir)
+{
+	u32 data_direction;
+	u32 dword_0;
+
+	if (cmd_dir == DMA_FROM_DEVICE) {
+		data_direction = UTP_DEVICE_TO_HOST;
+		*upiu_flags = UPIU_CMD_FLAGS_READ;
+	} else if (cmd_dir == DMA_TO_DEVICE) {
+		data_direction = UTP_HOST_TO_DEVICE;
+		*upiu_flags = UPIU_CMD_FLAGS_WRITE;
+	} else {
+		data_direction = UTP_NO_DATA_TRANSFER;
+		*upiu_flags = UPIU_CMD_FLAGS_NONE;
+	}
+
+	dword_0 = data_direction | (0x1 << UPIU_COMMAND_TYPE_OFFSET);
+
+	/* Enable Interrupt for command */
+	dword_0 |= UTP_REQ_DESC_INT_CMD;
+
+	/* Transfer request descriptor header fields */
+	req_desc->header.dword_0 = cpu_to_le32(dword_0);
+	/* dword_1 is reserved, hence it is set to 0 */
+	req_desc->header.dword_1 = 0;
+	/*
+	 * assigning invalid value for command status. Controller
+	 * updates OCS on command completion, with the command
+	 * status
+	 */
+	req_desc->header.dword_2 =
+		cpu_to_le32(OCS_INVALID_COMMAND_STATUS);
+	/* dword_3 is reserved, hence it is set to 0 */
+	req_desc->header.dword_3 = 0;
+
+	req_desc->prd_table_length = 0;
+}
+
+static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
+					      u32 upiu_flags)
+{
+	struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr;
+	struct ufs_query *query = &hba->dev_cmd.query;
+	u16 len = be16_to_cpu(query->request.upiu_req.length);
+
+	/* Query request header */
+	ucd_req_ptr->header.dword_0 =
+				UPIU_HEADER_DWORD(UPIU_TRANSACTION_QUERY_REQ,
+						  upiu_flags, 0, TASK_TAG);
+	ucd_req_ptr->header.dword_1 =
+				UPIU_HEADER_DWORD(0, query->request.query_func,
+						  0, 0);
+
+	/* Data segment length only need for WRITE_DESC */
+	if (query->request.upiu_req.opcode == UPIU_QUERY_OPCODE_WRITE_DESC)
+		ucd_req_ptr->header.dword_2 =
+				UPIU_HEADER_DWORD(0, 0, (len >> 8), (u8)len);
+	else
+		ucd_req_ptr->header.dword_2 = 0;
+
+	/* Copy the Query Request buffer as is */
+	memcpy(&ucd_req_ptr->qr, &query->request.upiu_req, QUERY_OSF_SIZE);
+
+	/* Copy the Descriptor */
+	if (query->request.upiu_req.opcode == UPIU_QUERY_OPCODE_WRITE_DESC)
+		memcpy(ucd_req_ptr + 1, query->descriptor, len);
+
+	memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
+}
+
+static inline void ufshcd_prepare_utp_nop_upiu(struct ufs_hba *hba)
+{
+	struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr;
+
+	memset(ucd_req_ptr, 0, sizeof(struct utp_upiu_req));
+
+	/* command descriptor fields */
+	ucd_req_ptr->header.dword_0 =
+			UPIU_HEADER_DWORD(UPIU_TRANSACTION_NOP_OUT, 0, 0, TASK_TAG);
+	/* clear rest of the fields of basic header */
+	ucd_req_ptr->header.dword_1 = 0;
+	ucd_req_ptr->header.dword_2 = 0;
+
+	memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
+}
+
+/**
+ * ufshcd_comp_devman_upiu - UFS Protocol Information Unit(UPIU)
+ *			     for Device Management Purposes
+ */
+static int ufshcd_comp_devman_upiu(struct ufs_hba *hba,
+				   enum dev_cmd_type cmd_type)
+{
+	u32 upiu_flags;
+	int ret = 0;
+	struct utp_transfer_req_desc *req_desc = hba->utrdl;
+
+	hba->dev_cmd.type = cmd_type;
+
+	ufshcd_prepare_req_desc_hdr(req_desc, &upiu_flags, DMA_NONE);
+	switch (cmd_type) {
+	case DEV_CMD_TYPE_QUERY:
+		ufshcd_prepare_utp_query_req_upiu(hba, upiu_flags);
+		break;
+	case DEV_CMD_TYPE_NOP:
+		ufshcd_prepare_utp_nop_upiu(hba);
+		break;
+	default:
+		ret = -EINVAL;
+	}
+
+	return ret;
+}
+
+static int ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag)
+{
+	unsigned long start;
+	u32 intr_status;
+	u32 enabled_intr_status;
+
+	ufshcd_writel(hba, 1 << task_tag, REG_UTP_TRANSFER_REQ_DOOR_BELL);
+
+	start = get_timer(0);
+	do {
+		intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
+		enabled_intr_status = intr_status & hba->intr_mask;
+		ufshcd_writel(hba, intr_status, REG_INTERRUPT_STATUS);
+
+		if (get_timer(start) > QUERY_REQ_TIMEOUT) {
+			dev_err(hba->dev,
+				"Timedout waiting for UTP response\n");
+
+			return -ETIMEDOUT;
+		}
+
+		if (enabled_intr_status & UFSHCD_ERROR_MASK) {
+			dev_err(hba->dev, "Error in status:%08x\n",
+				enabled_intr_status);
+
+			return -1;
+		}
+	} while (!(enabled_intr_status & UTP_TRANSFER_REQ_COMPL));
+
+	return 0;
+}
+
+/**
+ * ufshcd_get_req_rsp - returns the TR response transaction type
+ */
+static inline int ufshcd_get_req_rsp(struct utp_upiu_rsp *ucd_rsp_ptr)
+{
+	return be32_to_cpu(ucd_rsp_ptr->header.dword_0) >> 24;
+}
+
+/**
+ * ufshcd_get_tr_ocs - Get the UTRD Overall Command Status
+ *
+ */
+static inline int ufshcd_get_tr_ocs(struct ufs_hba *hba)
+{
+	return le32_to_cpu(hba->utrdl->header.dword_2) & MASK_OCS;
+}
+
+static inline int ufshcd_get_rsp_upiu_result(struct utp_upiu_rsp *ucd_rsp_ptr)
+{
+	return be32_to_cpu(ucd_rsp_ptr->header.dword_1) & MASK_RSP_UPIU_RESULT;
+}
+
+static int ufshcd_check_query_response(struct ufs_hba *hba)
+{
+	struct ufs_query_res *query_res = &hba->dev_cmd.query.response;
+
+	/* Get the UPIU response */
+	query_res->response = ufshcd_get_rsp_upiu_result(hba->ucd_rsp_ptr) >>
+				UPIU_RSP_CODE_OFFSET;
+	return query_res->response;
+}
+
+/**
+ * ufshcd_copy_query_response() - Copy the Query Response and the data
+ * descriptor
+ */
+static int ufshcd_copy_query_response(struct ufs_hba *hba)
+{
+	struct ufs_query_res *query_res = &hba->dev_cmd.query.response;
+
+	memcpy(&query_res->upiu_res, &hba->ucd_rsp_ptr->qr, QUERY_OSF_SIZE);
+
+	/* Get the descriptor */
+	if (hba->dev_cmd.query.descriptor &&
+	    hba->ucd_rsp_ptr->qr.opcode == UPIU_QUERY_OPCODE_READ_DESC) {
+		u8 *descp = (u8 *)hba->ucd_rsp_ptr +
+				GENERAL_UPIU_REQUEST_SIZE;
+		u16 resp_len;
+		u16 buf_len;
+
+		/* data segment length */
+		resp_len = be32_to_cpu(hba->ucd_rsp_ptr->header.dword_2) &
+						MASK_QUERY_DATA_SEG_LEN;
+		buf_len =
+			be16_to_cpu(hba->dev_cmd.query.request.upiu_req.length);
+		if (likely(buf_len >= resp_len)) {
+			memcpy(hba->dev_cmd.query.descriptor, descp, resp_len);
+		} else {
+			dev_warn(hba->dev,
+				 "%s: Response size is bigger than buffer",
+				 __func__);
+			return -EINVAL;
+		}
+	}
+
+	return 0;
+}
+
+/**
+ * ufshcd_exec_dev_cmd - API for sending device management requests
+ */
+static int ufshcd_exec_dev_cmd(struct ufs_hba *hba, enum dev_cmd_type cmd_type,
+			       int timeout)
+{
+	int err;
+	int resp;
+
+	err = ufshcd_comp_devman_upiu(hba, cmd_type);
+	if (err)
+		return err;
+
+	err = ufshcd_send_command(hba, TASK_TAG);
+	if (err)
+		return err;
+
+	err = ufshcd_get_tr_ocs(hba);
+	if (err) {
+		dev_err(hba->dev, "Error in OCS:%d\n", err);
+		return -EINVAL;
+	}
+
+	resp = ufshcd_get_req_rsp(hba->ucd_rsp_ptr);
+	switch (resp) {
+	case UPIU_TRANSACTION_NOP_IN:
+		break;
+	case UPIU_TRANSACTION_QUERY_RSP:
+		err = ufshcd_check_query_response(hba);
+		if (!err)
+			err = ufshcd_copy_query_response(hba);
+		break;
+	case UPIU_TRANSACTION_REJECT_UPIU:
+		/* TODO: handle Reject UPIU Response */
+		err = -EPERM;
+		dev_err(hba->dev, "%s: Reject UPIU not fully implemented\n",
+			__func__);
+		break;
+	default:
+		err = -EINVAL;
+		dev_err(hba->dev, "%s: Invalid device management cmd response: %x\n",
+			__func__, resp);
+	}
+
+	return err;
+}
+
+/**
+ * ufshcd_init_query() - init the query response and request parameters
+ */
+static inline void ufshcd_init_query(struct ufs_hba *hba,
+				     struct ufs_query_req **request,
+				     struct ufs_query_res **response,
+				     enum query_opcode opcode,
+				     u8 idn, u8 index, u8 selector)
+{
+	*request = &hba->dev_cmd.query.request;
+	*response = &hba->dev_cmd.query.response;
+	memset(*request, 0, sizeof(struct ufs_query_req));
+	memset(*response, 0, sizeof(struct ufs_query_res));
+	(*request)->upiu_req.opcode = opcode;
+	(*request)->upiu_req.idn = idn;
+	(*request)->upiu_req.index = index;
+	(*request)->upiu_req.selector = selector;
+}
+
+/**
+ * ufshcd_query_flag() - API function for sending flag query requests
+ */
+int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
+		      enum flag_idn idn, bool *flag_res)
+{
+	struct ufs_query_req *request = NULL;
+	struct ufs_query_res *response = NULL;
+	int err, index = 0, selector = 0;
+	int timeout = QUERY_REQ_TIMEOUT;
+
+	ufshcd_init_query(hba, &request, &response, opcode, idn, index,
+			  selector);
+
+	switch (opcode) {
+	case UPIU_QUERY_OPCODE_SET_FLAG:
+	case UPIU_QUERY_OPCODE_CLEAR_FLAG:
+	case UPIU_QUERY_OPCODE_TOGGLE_FLAG:
+		request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
+		break;
+	case UPIU_QUERY_OPCODE_READ_FLAG:
+		request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
+		if (!flag_res) {
+			/* No dummy reads */
+			dev_err(hba->dev, "%s: Invalid argument for read request\n",
+				__func__);
+			err = -EINVAL;
+			goto out;
+		}
+		break;
+	default:
+		dev_err(hba->dev,
+			"%s: Expected query flag opcode but got = %d\n",
+			__func__, opcode);
+		err = -EINVAL;
+		goto out;
+	}
+
+	err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, timeout);
+
+	if (err) {
+		dev_err(hba->dev,
+			"%s: Sending flag query for idn %d failed, err = %d\n",
+			__func__, idn, err);
+		goto out;
+	}
+
+	if (flag_res)
+		*flag_res = (be32_to_cpu(response->upiu_res.value) &
+				MASK_QUERY_UPIU_FLAG_LOC) & 0x1;
+
+out:
+	return err;
+}
+
+static int ufshcd_query_flag_retry(struct ufs_hba *hba,
+				   enum query_opcode opcode,
+				   enum flag_idn idn, bool *flag_res)
+{
+	int ret;
+	int retries;
+
+	for (retries = 0; retries < QUERY_REQ_RETRIES; retries++) {
+		ret = ufshcd_query_flag(hba, opcode, idn, flag_res);
+		if (ret)
+			dev_dbg(hba->dev,
+				"%s: failed with error %d, retries %d\n",
+				__func__, ret, retries);
+		else
+			break;
+	}
+
+	if (ret)
+		dev_err(hba->dev,
+			"%s: query attribute, opcode %d, idn %d, failed with error %d after %d retires\n",
+			__func__, opcode, idn, ret, retries);
+	return ret;
+}
+
+static int __ufshcd_query_descriptor(struct ufs_hba *hba,
+				     enum query_opcode opcode,
+				     enum desc_idn idn, u8 index, u8 selector,
+				     u8 *desc_buf, int *buf_len)
+{
+	struct ufs_query_req *request = NULL;
+	struct ufs_query_res *response = NULL;
+	int err;
+
+	if (!desc_buf) {
+		dev_err(hba->dev, "%s: descriptor buffer required for opcode 0x%x\n",
+			__func__, opcode);
+		err = -EINVAL;
+		goto out;
+	}
+
+	if (*buf_len < QUERY_DESC_MIN_SIZE || *buf_len > QUERY_DESC_MAX_SIZE) {
+		dev_err(hba->dev, "%s: descriptor buffer size (%d) is out of range\n",
+			__func__, *buf_len);
+		err = -EINVAL;
+		goto out;
+	}
+
+	ufshcd_init_query(hba, &request, &response, opcode, idn, index,
+			  selector);
+	hba->dev_cmd.query.descriptor = desc_buf;
+	request->upiu_req.length = cpu_to_be16(*buf_len);
+
+	switch (opcode) {
+	case UPIU_QUERY_OPCODE_WRITE_DESC:
+		request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
+		break;
+	case UPIU_QUERY_OPCODE_READ_DESC:
+		request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
+		break;
+	default:
+		dev_err(hba->dev, "%s: Expected query descriptor opcode but got = 0x%.2x\n",
+			__func__, opcode);
+		err = -EINVAL;
+		goto out;
+	}
+
+	err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT);
+
+	if (err) {
+		dev_err(hba->dev, "%s: opcode 0x%.2x for idn %d failed, index %d, err = %d\n",
+			__func__, opcode, idn, index, err);
+		goto out;
+	}
+
+	hba->dev_cmd.query.descriptor = NULL;
+	*buf_len = be16_to_cpu(response->upiu_res.length);
+
+out:
+	return err;
+}
+
+/**
+ * ufshcd_query_descriptor_retry - API function for sending descriptor requests
+ */
+int ufshcd_query_descriptor_retry(struct ufs_hba *hba, enum query_opcode opcode,
+				  enum desc_idn idn, u8 index, u8 selector,
+				  u8 *desc_buf, int *buf_len)
+{
+	int err;
+	int retries;
+
+	for (retries = QUERY_REQ_RETRIES; retries > 0; retries--) {
+		err = __ufshcd_query_descriptor(hba, opcode, idn, index,
+						selector, desc_buf, buf_len);
+		if (!err || err == -EINVAL)
+			break;
+	}
+
+	return err;
+}
+
+/**
+ * ufshcd_read_desc_length - read the specified descriptor length from header
+ */
+static int ufshcd_read_desc_length(struct ufs_hba *hba, enum desc_idn desc_id,
+				   int desc_index, int *desc_length)
+{
+	int ret;
+	u8 header[QUERY_DESC_HDR_SIZE];
+	int header_len = QUERY_DESC_HDR_SIZE;
+
+	if (desc_id >= QUERY_DESC_IDN_MAX)
+		return -EINVAL;
+
+	ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC,
+					    desc_id, desc_index, 0, header,
+					    &header_len);
+
+	if (ret) {
+		dev_err(hba->dev, "%s: Failed to get descriptor header id %d",
+			__func__, desc_id);
+		return ret;
+	} else if (desc_id != header[QUERY_DESC_DESC_TYPE_OFFSET]) {
+		dev_warn(hba->dev, "%s: descriptor header id %d and desc_id %d mismatch",
+			 __func__, header[QUERY_DESC_DESC_TYPE_OFFSET],
+			 desc_id);
+		ret = -EINVAL;
+	}
+
+	*desc_length = header[QUERY_DESC_LENGTH_OFFSET];
+
+	return ret;
+}
+
+static void ufshcd_init_desc_sizes(struct ufs_hba *hba)
+{
+	int err;
+
+	err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_DEVICE, 0,
+				      &hba->desc_size.dev_desc);
+	if (err)
+		hba->desc_size.dev_desc = QUERY_DESC_DEVICE_DEF_SIZE;
+
+	err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_POWER, 0,
+				      &hba->desc_size.pwr_desc);
+	if (err)
+		hba->desc_size.pwr_desc = QUERY_DESC_POWER_DEF_SIZE;
+
+	err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_INTERCONNECT, 0,
+				      &hba->desc_size.interc_desc);
+	if (err)
+		hba->desc_size.interc_desc = QUERY_DESC_INTERCONNECT_DEF_SIZE;
+
+	err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_CONFIGURATION, 0,
+				      &hba->desc_size.conf_desc);
+	if (err)
+		hba->desc_size.conf_desc = QUERY_DESC_CONFIGURATION_DEF_SIZE;
+
+	err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_UNIT, 0,
+				      &hba->desc_size.unit_desc);
+	if (err)
+		hba->desc_size.unit_desc = QUERY_DESC_UNIT_DEF_SIZE;
+
+	err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_GEOMETRY, 0,
+				      &hba->desc_size.geom_desc);
+	if (err)
+		hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE;
+
+	err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_HEALTH, 0,
+				      &hba->desc_size.hlth_desc);
+	if (err)
+		hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE;
+}
+
+/**
+ * ufshcd_map_desc_id_to_length - map descriptor IDN to its length
+ *
+ */
+int ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id,
+				 int *desc_len)
+{
+	switch (desc_id) {
+	case QUERY_DESC_IDN_DEVICE:
+		*desc_len = hba->desc_size.dev_desc;
+		break;
+	case QUERY_DESC_IDN_POWER:
+		*desc_len = hba->desc_size.pwr_desc;
+		break;
+	case QUERY_DESC_IDN_GEOMETRY:
+		*desc_len = hba->desc_size.geom_desc;
+		break;
+	case QUERY_DESC_IDN_CONFIGURATION:
+		*desc_len = hba->desc_size.conf_desc;
+		break;
+	case QUERY_DESC_IDN_UNIT:
+		*desc_len = hba->desc_size.unit_desc;
+		break;
+	case QUERY_DESC_IDN_INTERCONNECT:
+		*desc_len = hba->desc_size.interc_desc;
+		break;
+	case QUERY_DESC_IDN_STRING:
+		*desc_len = QUERY_DESC_MAX_SIZE;
+		break;
+	case QUERY_DESC_IDN_HEALTH:
+		*desc_len = hba->desc_size.hlth_desc;
+		break;
+	case QUERY_DESC_IDN_RFU_0:
+	case QUERY_DESC_IDN_RFU_1:
+		*desc_len = 0;
+		break;
+	default:
+		*desc_len = 0;
+		return -EINVAL;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(ufshcd_map_desc_id_to_length);
+
+/**
+ * ufshcd_read_desc_param - read the specified descriptor parameter
+ *
+ */
+int ufshcd_read_desc_param(struct ufs_hba *hba, enum desc_idn desc_id,
+			   int desc_index, u8 param_offset, u8 *param_read_buf,
+			   u8 param_size)
+{
+	int ret;
+	u8 *desc_buf;
+	int buff_len;
+	bool is_kmalloc = true;
+
+	/* Safety check */
+	if (desc_id >= QUERY_DESC_IDN_MAX || !param_size)
+		return -EINVAL;
+
+	/* Get the max length of descriptor from structure filled up at probe
+	 * time.
+	 */
+	ret = ufshcd_map_desc_id_to_length(hba, desc_id, &buff_len);
+
+	/* Sanity checks */
+	if (ret || !buff_len) {
+		dev_err(hba->dev, "%s: Failed to get full descriptor length",
+			__func__);
+		return ret;
+	}
+
+	/* Check whether we need temp memory */
+	if (param_offset != 0 || param_size < buff_len) {
+		desc_buf = kmalloc(buff_len, GFP_KERNEL);
+		if (!desc_buf)
+			return -ENOMEM;
+	} else {
+		desc_buf = param_read_buf;
+		is_kmalloc = false;
+	}
+
+	/* Request for full descriptor */
+	ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC,
+					    desc_id, desc_index, 0, desc_buf,
+					    &buff_len);
+
+	if (ret) {
+		dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret %d",
+			__func__, desc_id, desc_index, param_offset, ret);
+		goto out;
+	}
+
+	/* Sanity check */
+	if (desc_buf[QUERY_DESC_DESC_TYPE_OFFSET] != desc_id) {
+		dev_err(hba->dev, "%s: invalid desc_id %d in descriptor header",
+			__func__, desc_buf[QUERY_DESC_DESC_TYPE_OFFSET]);
+		ret = -EINVAL;
+		goto out;
+	}
+
+	/* Check wherher we will not copy more data, than available */
+	if (is_kmalloc && param_size > buff_len)
+		param_size = buff_len;
+
+	if (is_kmalloc)
+		memcpy(param_read_buf, &desc_buf[param_offset], param_size);
+out:
+	if (is_kmalloc)
+		kfree(desc_buf);
+	return ret;
+}
+
+/* replace non-printable or non-ASCII characters with spaces */
+static inline void ufshcd_remove_non_printable(uint8_t *val)
+{
+	if (!val)
+		return;
+
+	if (*val < 0x20 || *val > 0x7e)
+		*val = ' ';
+}
+
+/**
+ * ufshcd_uic_pwr_ctrl - executes UIC commands (which affects the link power
+ * state) and waits for it to take effect.
+ *
+ */
+static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
+{
+	unsigned long start = 0;
+	u8 status;
+	int ret;
+
+	ret = ufshcd_send_uic_cmd(hba, cmd);
+	if (ret) {
+		dev_err(hba->dev,
+			"pwr ctrl cmd 0x%x with mode 0x%x uic error %d\n",
+			cmd->command, cmd->argument3, ret);
+
+		return ret;
+	}
+
+	start = get_timer(0);
+	do {
+		status = ufshcd_get_upmcrs(hba);
+		if (get_timer(start) > UFS_UIC_CMD_TIMEOUT) {
+			dev_err(hba->dev,
+				"pwr ctrl cmd 0x%x failed, host upmcrs:0x%x\n",
+				cmd->command, status);
+			ret = (status != PWR_OK) ? status : -1;
+			break;
+		}
+	} while (status != PWR_LOCAL);
+
+	return ret;
+}
+
+/**
+ * ufshcd_uic_change_pwr_mode - Perform the UIC power mode change
+ *				using DME_SET primitives.
+ */
+static int ufshcd_uic_change_pwr_mode(struct ufs_hba *hba, u8 mode)
+{
+	struct uic_command uic_cmd = {0};
+	int ret;
+
+	uic_cmd.command = UIC_CMD_DME_SET;
+	uic_cmd.argument1 = UIC_ARG_MIB(PA_PWRMODE);
+	uic_cmd.argument3 = mode;
+	ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd);
+
+	return ret;
+}
+
+static
+void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufs_hba *hba,
+				      struct scsi_cmd *pccb, u32 upiu_flags)
+{
+	struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr;
+	unsigned int cdb_len;
+
+	/* command descriptor fields */
+	ucd_req_ptr->header.dword_0 =
+			UPIU_HEADER_DWORD(UPIU_TRANSACTION_COMMAND, upiu_flags,
+					  pccb->lun, TASK_TAG);
+	ucd_req_ptr->header.dword_1 =
+			UPIU_HEADER_DWORD(UPIU_COMMAND_SET_TYPE_SCSI, 0, 0, 0);
+
+	/* Total EHS length and Data segment length will be zero */
+	ucd_req_ptr->header.dword_2 = 0;
+
+	ucd_req_ptr->sc.exp_data_transfer_len = cpu_to_be32(pccb->datalen);
+
+	cdb_len = min_t(unsigned short, pccb->cmdlen, UFS_CDB_SIZE);
+	memset(ucd_req_ptr->sc.cdb, 0, UFS_CDB_SIZE);
+	memcpy(ucd_req_ptr->sc.cdb, pccb->cmd, cdb_len);
+
+	memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
+}
+
+static inline void prepare_prdt_desc(struct ufshcd_sg_entry *entry,
+				     unsigned char *buf, ulong len)
+{
+	entry->size = cpu_to_le32(len) | GENMASK(1, 0);
+	entry->base_addr = cpu_to_le32(lower_32_bits((unsigned long)buf));
+	entry->upper_addr = cpu_to_le32(upper_32_bits((unsigned long)buf));
+}
+
+static void prepare_prdt_table(struct ufs_hba *hba, struct scsi_cmd *pccb)
+{
+	struct utp_transfer_req_desc *req_desc = hba->utrdl;
+	struct ufshcd_sg_entry *prd_table = hba->ucd_prdt_ptr;
+	ulong datalen = pccb->datalen;
+	int table_length;
+	u8 *buf;
+	int i;
+
+	if (!datalen) {
+		req_desc->prd_table_length = 0;
+		return;
+	}
+
+	table_length = DIV_ROUND_UP(pccb->datalen, MAX_PRDT_ENTRY);
+	buf = pccb->pdata;
+	i = table_length;
+	while (--i) {
+		prepare_prdt_desc(&prd_table[table_length - i - 1], buf,
+				  MAX_PRDT_ENTRY - 1);
+		buf += MAX_PRDT_ENTRY;
+		datalen -= MAX_PRDT_ENTRY;
+	}
+
+	prepare_prdt_desc(&prd_table[table_length - i - 1], buf, datalen - 1);
+
+	req_desc->prd_table_length = table_length;
+}
+
+static int ufs_scsi_exec(struct udevice *scsi_dev, struct scsi_cmd *pccb)
+{
+	struct ufs_hba *hba = dev_get_uclass_priv(scsi_dev->parent);
+	struct utp_transfer_req_desc *req_desc = hba->utrdl;
+	u32 upiu_flags;
+	int ocs, result = 0;
+	u8 scsi_status;
+
+	ufshcd_prepare_req_desc_hdr(req_desc, &upiu_flags, pccb->dma_dir);
+	ufshcd_prepare_utp_scsi_cmd_upiu(hba, pccb, upiu_flags);
+	prepare_prdt_table(hba, pccb);
+
+	ufshcd_send_command(hba, TASK_TAG);
+
+	ocs = ufshcd_get_tr_ocs(hba);
+	switch (ocs) {
+	case OCS_SUCCESS:
+		result = ufshcd_get_req_rsp(hba->ucd_rsp_ptr);
+		switch (result) {
+		case UPIU_TRANSACTION_RESPONSE:
+			result = ufshcd_get_rsp_upiu_result(hba->ucd_rsp_ptr);
+
+			scsi_status = result & MASK_SCSI_STATUS;
+			if (scsi_status)
+				return -EINVAL;
+
+			break;
+		case UPIU_TRANSACTION_REJECT_UPIU:
+			/* TODO: handle Reject UPIU Response */
+			dev_err(hba->dev,
+				"Reject UPIU not fully implemented\n");
+			return -EINVAL;
+		default:
+			dev_err(hba->dev,
+				"Unexpected request response code = %x\n",
+				result);
+			return -EINVAL;
+		}
+		break;
+	default:
+		dev_err(hba->dev, "OCS error from controller = %x\n", ocs);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static inline int ufshcd_read_desc(struct ufs_hba *hba, enum desc_idn desc_id,
+				   int desc_index, u8 *buf, u32 size)
+{
+	return ufshcd_read_desc_param(hba, desc_id, desc_index, 0, buf, size);
+}
+
+static int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size)
+{
+	return ufshcd_read_desc(hba, QUERY_DESC_IDN_DEVICE, 0, buf, size);
+}
+
+/**
+ * ufshcd_read_string_desc - read string descriptor
+ *
+ */
+int ufshcd_read_string_desc(struct ufs_hba *hba, int desc_index,
+			    u8 *buf, u32 size, bool ascii)
+{
+	int err = 0;
+
+	err = ufshcd_read_desc(hba, QUERY_DESC_IDN_STRING, desc_index, buf,
+			       size);
+
+	if (err) {
+		dev_err(hba->dev, "%s: reading String Desc failed after %d retries. err = %d\n",
+			__func__, QUERY_REQ_RETRIES, err);
+		goto out;
+	}
+
+	if (ascii) {
+		int desc_len;
+		int ascii_len;
+		int i;
+		u8 *buff_ascii;
+
+		desc_len = buf[0];
+		/* remove header and divide by 2 to move from UTF16 to UTF8 */
+		ascii_len = (desc_len - QUERY_DESC_HDR_SIZE) / 2 + 1;
+		if (size < ascii_len + QUERY_DESC_HDR_SIZE) {
+			dev_err(hba->dev, "%s: buffer allocated size is too small\n",
+				__func__);
+			err = -ENOMEM;
+			goto out;
+		}
+
+		buff_ascii = kmalloc(ascii_len, GFP_KERNEL);
+		if (!buff_ascii) {
+			err = -ENOMEM;
+			goto out;
+		}
+
+		/*
+		 * the descriptor contains string in UTF16 format
+		 * we need to convert to utf-8 so it can be displayed
+		 */
+		utf16_to_utf8(buff_ascii,
+			      (uint16_t *)&buf[QUERY_DESC_HDR_SIZE], ascii_len);
+
+		/* replace non-printable or non-ASCII characters with spaces */
+		for (i = 0; i < ascii_len; i++)
+			ufshcd_remove_non_printable(&buff_ascii[i]);
+
+		memset(buf + QUERY_DESC_HDR_SIZE, 0,
+		       size - QUERY_DESC_HDR_SIZE);
+		memcpy(buf + QUERY_DESC_HDR_SIZE, buff_ascii, ascii_len);
+		buf[QUERY_DESC_LENGTH_OFFSET] = ascii_len + QUERY_DESC_HDR_SIZE;
+		kfree(buff_ascii);
+	}
+out:
+	return err;
+}
+
+static int ufs_get_device_desc(struct ufs_hba *hba,
+			       struct ufs_dev_desc *dev_desc)
+{
+	int err;
+	size_t buff_len;
+	u8 model_index;
+	u8 *desc_buf;
+
+	buff_len = max_t(size_t, hba->desc_size.dev_desc,
+			 QUERY_DESC_MAX_SIZE + 1);
+	desc_buf = kmalloc(buff_len, GFP_KERNEL);
+	if (!desc_buf) {
+		err = -ENOMEM;
+		goto out;
+	}
+
+	err = ufshcd_read_device_desc(hba, desc_buf, hba->desc_size.dev_desc);
+	if (err) {
+		dev_err(hba->dev, "%s: Failed reading Device Desc. err = %d\n",
+			__func__, err);
+		goto out;
+	}
+
+	/*
+	 * getting vendor (manufacturerID) and Bank Index in big endian
+	 * format
+	 */
+	dev_desc->wmanufacturerid = desc_buf[DEVICE_DESC_PARAM_MANF_ID] << 8 |
+				     desc_buf[DEVICE_DESC_PARAM_MANF_ID + 1];
+
+	model_index = desc_buf[DEVICE_DESC_PARAM_PRDCT_NAME];
+
+	/* Zero-pad entire buffer for string termination. */
+	memset(desc_buf, 0, buff_len);
+
+	err = ufshcd_read_string_desc(hba, model_index, desc_buf,
+				      QUERY_DESC_MAX_SIZE, true/*ASCII*/);
+	if (err) {
+		dev_err(hba->dev, "%s: Failed reading Product Name. err = %d\n",
+			__func__, err);
+		goto out;
+	}
+
+	desc_buf[QUERY_DESC_MAX_SIZE] = '\0';
+	strlcpy(dev_desc->model, (char *)(desc_buf + QUERY_DESC_HDR_SIZE),
+		min_t(u8, desc_buf[QUERY_DESC_LENGTH_OFFSET],
+		      MAX_MODEL_LEN));
+
+	/* Null terminate the model string */
+	dev_desc->model[MAX_MODEL_LEN] = '\0';
+
+out:
+	kfree(desc_buf);
+	return err;
+}
+
+/**
+ * ufshcd_get_max_pwr_mode - reads the max power mode negotiated with device
+ */
+static int ufshcd_get_max_pwr_mode(struct ufs_hba *hba)
+{
+	struct ufs_pa_layer_attr *pwr_info = &hba->max_pwr_info.info;
+
+	if (hba->max_pwr_info.is_valid)
+		return 0;
+
+	pwr_info->pwr_tx = FAST_MODE;
+	pwr_info->pwr_rx = FAST_MODE;
+	pwr_info->hs_rate = PA_HS_MODE_B;
+
+	/* Get the connected lane count */
+	ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES),
+		       &pwr_info->lane_rx);
+	ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES),
+		       &pwr_info->lane_tx);
+
+	if (!pwr_info->lane_rx || !pwr_info->lane_tx) {
+		dev_err(hba->dev, "%s: invalid connected lanes value. rx=%d, tx=%d\n",
+			__func__, pwr_info->lane_rx, pwr_info->lane_tx);
+		return -EINVAL;
+	}
+
+	/*
+	 * First, get the maximum gears of HS speed.
+	 * If a zero value, it means there is no HSGEAR capability.
+	 * Then, get the maximum gears of PWM speed.
+	 */
+	ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), &pwr_info->gear_rx);
+	if (!pwr_info->gear_rx) {
+		ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR),
+			       &pwr_info->gear_rx);
+		if (!pwr_info->gear_rx) {
+			dev_err(hba->dev, "%s: invalid max pwm rx gear read = %d\n",
+				__func__, pwr_info->gear_rx);
+			return -EINVAL;
+		}
+		pwr_info->pwr_rx = SLOW_MODE;
+	}
+
+	ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR),
+			    &pwr_info->gear_tx);
+	if (!pwr_info->gear_tx) {
+		ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR),
+				    &pwr_info->gear_tx);
+		if (!pwr_info->gear_tx) {
+			dev_err(hba->dev, "%s: invalid max pwm tx gear read = %d\n",
+				__func__, pwr_info->gear_tx);
+			return -EINVAL;
+		}
+		pwr_info->pwr_tx = SLOW_MODE;
+	}
+
+	hba->max_pwr_info.is_valid = true;
+	return 0;
+}
+
+static int ufshcd_change_power_mode(struct ufs_hba *hba,
+				    struct ufs_pa_layer_attr *pwr_mode)
+{
+	int ret;
+
+	/* if already configured to the requested pwr_mode */
+	if (pwr_mode->gear_rx == hba->pwr_info.gear_rx &&
+	    pwr_mode->gear_tx == hba->pwr_info.gear_tx &&
+	    pwr_mode->lane_rx == hba->pwr_info.lane_rx &&
+	    pwr_mode->lane_tx == hba->pwr_info.lane_tx &&
+	    pwr_mode->pwr_rx == hba->pwr_info.pwr_rx &&
+	    pwr_mode->pwr_tx == hba->pwr_info.pwr_tx &&
+	    pwr_mode->hs_rate == hba->pwr_info.hs_rate) {
+		dev_dbg(hba->dev, "%s: power already configured\n", __func__);
+		return 0;
+	}
+
+	/*
+	 * Configure attributes for power mode change with below.
+	 * - PA_RXGEAR, PA_ACTIVERXDATALANES, PA_RXTERMINATION,
+	 * - PA_TXGEAR, PA_ACTIVETXDATALANES, PA_TXTERMINATION,
+	 * - PA_HSSERIES
+	 */
+	ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXGEAR), pwr_mode->gear_rx);
+	ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVERXDATALANES),
+		       pwr_mode->lane_rx);
+	if (pwr_mode->pwr_rx == FASTAUTO_MODE || pwr_mode->pwr_rx == FAST_MODE)
+		ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), TRUE);
+	else
+		ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), FALSE);
+
+	ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXGEAR), pwr_mode->gear_tx);
+	ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVETXDATALANES),
+		       pwr_mode->lane_tx);
+	if (pwr_mode->pwr_tx == FASTAUTO_MODE || pwr_mode->pwr_tx == FAST_MODE)
+		ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), TRUE);
+	else
+		ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), FALSE);
+
+	if (pwr_mode->pwr_rx == FASTAUTO_MODE ||
+	    pwr_mode->pwr_tx == FASTAUTO_MODE ||
+	    pwr_mode->pwr_rx == FAST_MODE ||
+	    pwr_mode->pwr_tx == FAST_MODE)
+		ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HSSERIES),
+			       pwr_mode->hs_rate);
+
+	ret = ufshcd_uic_change_pwr_mode(hba, pwr_mode->pwr_rx << 4 |
+					 pwr_mode->pwr_tx);
+
+	if (ret) {
+		dev_err(hba->dev,
+			"%s: power mode change failed %d\n", __func__, ret);
+
+		return ret;
+	}
+
+	/* Copy new Power Mode to power info */
+	memcpy(&hba->pwr_info, pwr_mode, sizeof(struct ufs_pa_layer_attr));
+
+	return ret;
+}
+
+/**
+ * ufshcd_verify_dev_init() - Verify device initialization
+ *
+ */
+static int ufshcd_verify_dev_init(struct ufs_hba *hba)
+{
+	int retries;
+	int err;
+
+	for (retries = NOP_OUT_RETRIES; retries > 0; retries--) {
+		err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_NOP,
+					  NOP_OUT_TIMEOUT);
+		if (!err || err == -ETIMEDOUT)
+			break;
+
+		dev_dbg(hba->dev, "%s: error %d retrying\n", __func__, err);
+	}
+
+	if (err)
+		dev_err(hba->dev, "%s: NOP OUT failed %d\n", __func__, err);
+
+	return err;
+}
+
+/**
+ * ufshcd_complete_dev_init() - checks device readiness
+ */
+static int ufshcd_complete_dev_init(struct ufs_hba *hba)
+{
+	int i;
+	int err;
+	bool flag_res = 1;
+
+	err = ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_SET_FLAG,
+				      QUERY_FLAG_IDN_FDEVICEINIT, NULL);
+	if (err) {
+		dev_err(hba->dev,
+			"%s setting fDeviceInit flag failed with error %d\n",
+			__func__, err);
+		goto out;
+	}
+
+	/* poll for max. 1000 iterations for fDeviceInit flag to clear */
+	for (i = 0; i < 1000 && !err && flag_res; i++)
+		err = ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_READ_FLAG,
+					      QUERY_FLAG_IDN_FDEVICEINIT,
+					      &flag_res);
+
+	if (err)
+		dev_err(hba->dev,
+			"%s reading fDeviceInit flag failed with error %d\n",
+			__func__, err);
+	else if (flag_res)
+		dev_err(hba->dev,
+			"%s fDeviceInit was not cleared by the device\n",
+			__func__);
+
+out:
+	return err;
+}
+
+static void ufshcd_def_desc_sizes(struct ufs_hba *hba)
+{
+	hba->desc_size.dev_desc = QUERY_DESC_DEVICE_DEF_SIZE;
+	hba->desc_size.pwr_desc = QUERY_DESC_POWER_DEF_SIZE;
+	hba->desc_size.interc_desc = QUERY_DESC_INTERCONNECT_DEF_SIZE;
+	hba->desc_size.conf_desc = QUERY_DESC_CONFIGURATION_DEF_SIZE;
+	hba->desc_size.unit_desc = QUERY_DESC_UNIT_DEF_SIZE;
+	hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE;
+	hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE;
+}
+
+int ufs_start(struct ufs_hba *hba)
+{
+	struct ufs_dev_desc card = {0};
+	int ret;
+
+	ret = ufshcd_link_startup(hba);
+	if (ret)
+		return ret;
+
+	ret = ufshcd_verify_dev_init(hba);
+	if (ret)
+		return ret;
+
+	ret = ufshcd_complete_dev_init(hba);
+	if (ret)
+		return ret;
+
+	/* Init check for device descriptor sizes */
+	ufshcd_init_desc_sizes(hba);
+
+	ret = ufs_get_device_desc(hba, &card);
+	if (ret) {
+		dev_err(hba->dev, "%s: Failed getting device info. err = %d\n",
+			__func__, ret);
+
+		return ret;
+	}
+
+	if (ufshcd_get_max_pwr_mode(hba)) {
+		dev_err(hba->dev,
+			"%s: Failed getting max supported power mode\n",
+			__func__);
+	} else {
+		ret = ufshcd_change_power_mode(hba, &hba->max_pwr_info.info);
+		if (ret) {
+			dev_err(hba->dev, "%s: Failed setting power mode, err = %d\n",
+				__func__, ret);
+
+			return ret;
+		}
+
+		printf("Device at %s up at:", hba->dev->name);
+		ufshcd_print_pwr_info(hba);
+	}
+
+	return 0;
+}
+
+int ufshcd_probe(struct udevice *ufs_dev, struct ufs_hba_ops *hba_ops)
+{
+	struct ufs_hba *hba = dev_get_uclass_priv(ufs_dev);
+	struct scsi_platdata *scsi_plat;
+	struct udevice *scsi_dev;
+	int err;
+
+	device_find_first_child(ufs_dev, &scsi_dev);
+	if (!scsi_dev)
+		return -ENODEV;
+
+	scsi_plat = dev_get_uclass_platdata(scsi_dev);
+	scsi_plat->max_id = UFSHCD_MAX_ID;
+	scsi_plat->max_lun = UFS_MAX_LUNS;
+	//scsi_plat->max_bytes_per_req = UFS_MAX_BYTES;
+
+	hba->dev = ufs_dev;
+	hba->ops = hba_ops;
+	hba->mmio_base = (void *)dev_read_addr(ufs_dev);
+
+	/* Set descriptor lengths to specification defaults */
+	ufshcd_def_desc_sizes(hba);
+
+	ufshcd_ops_init(hba);
+
+	/* Read capabilties registers */
+	hba->capabilities = ufshcd_readl(hba, REG_CONTROLLER_CAPABILITIES);
+
+	/* Get UFS version supported by the controller */
+	hba->version = ufshcd_get_ufs_version(hba);
+	if (hba->version != UFSHCI_VERSION_10 &&
+	    hba->version != UFSHCI_VERSION_11 &&
+	    hba->version != UFSHCI_VERSION_20 &&
+	    hba->version != UFSHCI_VERSION_21)
+		dev_err(hba->dev, "invalid UFS version 0x%x\n",
+			hba->version);
+
+	/* Get Interrupt bit mask per version */
+	hba->intr_mask = ufshcd_get_intr_mask(hba);
+
+	/* Allocate memory for host memory space */
+	err = ufshcd_memory_alloc(hba);
+	if (err) {
+		dev_err(hba->dev, "Memory allocation failed\n");
+		return err;
+	}
+
+	/* Configure Local data structures */
+	ufshcd_host_memory_configure(hba);
+
+	/*
+	 * In order to avoid any spurious interrupt immediately after
+	 * registering UFS controller interrupt handler, clear any pending UFS
+	 * interrupt status and disable all the UFS interrupts.
+	 */
+	ufshcd_writel(hba, ufshcd_readl(hba, REG_INTERRUPT_STATUS),
+		      REG_INTERRUPT_STATUS);
+	ufshcd_writel(hba, 0, REG_INTERRUPT_ENABLE);
+
+	err = ufshcd_hba_enable(hba);
+	if (err) {
+		dev_err(hba->dev, "Host controller enable failed\n");
+		return err;
+	}
+
+	err = ufs_start(hba);
+	if (err)
+		return err;
+
+	return 0;
+}
+
+int ufs_scsi_bind(struct udevice *ufs_dev, struct udevice **scsi_devp)
+{
+	int ret = device_bind_driver(ufs_dev, "ufs_scsi", "ufs_scsi",
+				     scsi_devp);
+
+	return ret;
+}
+
+static struct scsi_ops ufs_ops = {
+	.exec		= ufs_scsi_exec,
+};
+
+int ufs_probe_dev(int index)
+{
+	struct udevice *dev;
+
+	return uclass_get_device(UCLASS_UFS, index, &dev);
+}
+
+int ufs_probe(void)
+{
+	struct udevice *dev;
+	int ret, i;
+
+	for (i = 0;; i++) {
+		ret = uclass_get_device(UCLASS_UFS, i, &dev);
+		if (ret == -ENODEV)
+			break;
+	}
+
+	return 0;
+}
+
+U_BOOT_DRIVER(ufs_scsi) = {
+	.id = UCLASS_SCSI,
+	.name = "ufs_scsi",
+	.ops = &ufs_ops,
+};
diff --git a/u-boot/drivers/ufs/ufs.h b/u-boot/drivers/ufs/ufs.h
new file mode 100644
index 0000000..8a38832
--- /dev/null
+++ b/u-boot/drivers/ufs/ufs.h
@@ -0,0 +1,917 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+#ifndef __UFS_H
+#define __UFS_H
+
+#include "unipro.h"
+
+struct udevice;
+
+#define UFS_CDB_SIZE	16
+#define UPIU_TRANSACTION_UIC_CMD 0x1F
+#define UIC_CMD_SIZE (sizeof(u32) * 4)
+#define RESPONSE_UPIU_SENSE_DATA_LENGTH	18
+#define UFS_MAX_LUNS		0x7F
+
+enum {
+	TASK_REQ_UPIU_SIZE_DWORDS	= 8,
+	TASK_RSP_UPIU_SIZE_DWORDS	= 8,
+	ALIGNED_UPIU_SIZE		= 512,
+};
+
+/* UFS device power modes */
+enum ufs_dev_pwr_mode {
+	UFS_ACTIVE_PWR_MODE	= 1,
+	UFS_SLEEP_PWR_MODE	= 2,
+	UFS_POWERDOWN_PWR_MODE	= 3,
+};
+
+enum ufs_notify_change_status {
+	PRE_CHANGE,
+	POST_CHANGE,
+};
+
+struct ufs_pa_layer_attr {
+	u32 gear_rx;
+	u32 gear_tx;
+	u32 lane_rx;
+	u32 lane_tx;
+	u32 pwr_rx;
+	u32 pwr_tx;
+	u32 hs_rate;
+};
+
+struct ufs_pwr_mode_info {
+	bool is_valid;
+	struct ufs_pa_layer_attr info;
+};
+
+enum ufs_desc_def_size {
+	QUERY_DESC_DEVICE_DEF_SIZE		= 0x40,
+	QUERY_DESC_CONFIGURATION_DEF_SIZE	= 0x90,
+	QUERY_DESC_UNIT_DEF_SIZE		= 0x23,
+	QUERY_DESC_INTERCONNECT_DEF_SIZE	= 0x06,
+	QUERY_DESC_GEOMETRY_DEF_SIZE		= 0x48,
+	QUERY_DESC_POWER_DEF_SIZE		= 0x62,
+	QUERY_DESC_HEALTH_DEF_SIZE		= 0x25,
+};
+
+struct ufs_desc_size {
+	int dev_desc;
+	int pwr_desc;
+	int geom_desc;
+	int interc_desc;
+	int unit_desc;
+	int conf_desc;
+	int hlth_desc;
+};
+
+/*
+ * Request Descriptor Definitions
+ */
+
+/* Transfer request command type */
+enum {
+	UTP_CMD_TYPE_SCSI		= 0x0,
+	UTP_CMD_TYPE_UFS		= 0x1,
+	UTP_CMD_TYPE_DEV_MANAGE		= 0x2,
+};
+
+/* UTP Transfer Request Command Offset */
+#define UPIU_COMMAND_TYPE_OFFSET	28
+
+/* Offset of the response code in the UPIU header */
+#define UPIU_RSP_CODE_OFFSET		8
+
+/* To accommodate UFS2.0 required Command type */
+enum {
+	UTP_CMD_TYPE_UFS_STORAGE	= 0x1,
+};
+
+enum {
+	UTP_SCSI_COMMAND		= 0x00000000,
+	UTP_NATIVE_UFS_COMMAND		= 0x10000000,
+	UTP_DEVICE_MANAGEMENT_FUNCTION	= 0x20000000,
+	UTP_REQ_DESC_INT_CMD		= 0x01000000,
+};
+
+/* UTP Transfer Request Data Direction (DD) */
+enum {
+	UTP_NO_DATA_TRANSFER	= 0x00000000,
+	UTP_HOST_TO_DEVICE	= 0x02000000,
+	UTP_DEVICE_TO_HOST	= 0x04000000,
+};
+
+/* Overall command status values */
+enum {
+	OCS_SUCCESS			= 0x0,
+	OCS_INVALID_CMD_TABLE_ATTR	= 0x1,
+	OCS_INVALID_PRDT_ATTR		= 0x2,
+	OCS_MISMATCH_DATA_BUF_SIZE	= 0x3,
+	OCS_MISMATCH_RESP_UPIU_SIZE	= 0x4,
+	OCS_PEER_COMM_FAILURE		= 0x5,
+	OCS_ABORTED			= 0x6,
+	OCS_FATAL_ERROR			= 0x7,
+	OCS_INVALID_COMMAND_STATUS	= 0x0F,
+	MASK_OCS			= 0x0F,
+};
+
+/* The maximum length of the data byte count field in the PRDT is 256KB */
+#define PRDT_DATA_BYTE_COUNT_MAX	(256 * 1024)
+/* The granularity of the data byte count field in the PRDT is 32-bit */
+#define PRDT_DATA_BYTE_COUNT_PAD	4
+
+#define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req))
+#define QUERY_DESC_MAX_SIZE       255
+#define QUERY_DESC_MIN_SIZE       2
+#define QUERY_DESC_HDR_SIZE       2
+#define QUERY_OSF_SIZE            (GENERAL_UPIU_REQUEST_SIZE - \
+					(sizeof(struct utp_upiu_header)))
+#define RESPONSE_UPIU_SENSE_DATA_LENGTH	18
+#define UPIU_HEADER_DWORD(byte3, byte2, byte1, byte0)\
+			cpu_to_be32((byte3 << 24) | (byte2 << 16) |\
+			 (byte1 << 8) | (byte0))
+/*
+ * UFS Protocol Information Unit related definitions
+ */
+
+/* Task management functions */
+enum {
+	UFS_ABORT_TASK		= 0x01,
+	UFS_ABORT_TASK_SET	= 0x02,
+	UFS_CLEAR_TASK_SET	= 0x04,
+	UFS_LOGICAL_RESET	= 0x08,
+	UFS_QUERY_TASK		= 0x80,
+	UFS_QUERY_TASK_SET	= 0x81,
+};
+
+/* UTP UPIU Transaction Codes Initiator to Target */
+enum {
+	UPIU_TRANSACTION_NOP_OUT	= 0x00,
+	UPIU_TRANSACTION_COMMAND	= 0x01,
+	UPIU_TRANSACTION_DATA_OUT	= 0x02,
+	UPIU_TRANSACTION_TASK_REQ	= 0x04,
+	UPIU_TRANSACTION_QUERY_REQ	= 0x16,
+};
+
+/* UTP UPIU Transaction Codes Target to Initiator */
+enum {
+	UPIU_TRANSACTION_NOP_IN		= 0x20,
+	UPIU_TRANSACTION_RESPONSE	= 0x21,
+	UPIU_TRANSACTION_DATA_IN	= 0x22,
+	UPIU_TRANSACTION_TASK_RSP	= 0x24,
+	UPIU_TRANSACTION_READY_XFER	= 0x31,
+	UPIU_TRANSACTION_QUERY_RSP	= 0x36,
+	UPIU_TRANSACTION_REJECT_UPIU	= 0x3F,
+};
+
+/* UPIU Read/Write flags */
+enum {
+	UPIU_CMD_FLAGS_NONE	= 0x00,
+	UPIU_CMD_FLAGS_WRITE	= 0x20,
+	UPIU_CMD_FLAGS_READ	= 0x40,
+};
+
+/* UPIU Task Attributes */
+enum {
+	UPIU_TASK_ATTR_SIMPLE	= 0x00,
+	UPIU_TASK_ATTR_ORDERED	= 0x01,
+	UPIU_TASK_ATTR_HEADQ	= 0x02,
+	UPIU_TASK_ATTR_ACA	= 0x03,
+};
+
+/* UPIU Query request function */
+enum {
+	UPIU_QUERY_FUNC_STANDARD_READ_REQUEST           = 0x01,
+	UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST          = 0x81,
+};
+
+/* Offset of the response code in the UPIU header */
+#define UPIU_RSP_CODE_OFFSET		8
+
+enum {
+	MASK_SCSI_STATUS		= 0xFF,
+	MASK_TASK_RESPONSE              = 0xFF00,
+	MASK_RSP_UPIU_RESULT            = 0xFFFF,
+	MASK_QUERY_DATA_SEG_LEN         = 0xFFFF,
+	MASK_RSP_UPIU_DATA_SEG_LEN	= 0xFFFF,
+	MASK_RSP_EXCEPTION_EVENT        = 0x10000,
+	MASK_TM_SERVICE_RESP		= 0xFF,
+	MASK_TM_FUNC			= 0xFF,
+};
+
+/* UTP QUERY Transaction Specific Fields OpCode */
+enum query_opcode {
+	UPIU_QUERY_OPCODE_NOP		= 0x0,
+	UPIU_QUERY_OPCODE_READ_DESC	= 0x1,
+	UPIU_QUERY_OPCODE_WRITE_DESC	= 0x2,
+	UPIU_QUERY_OPCODE_READ_ATTR	= 0x3,
+	UPIU_QUERY_OPCODE_WRITE_ATTR	= 0x4,
+	UPIU_QUERY_OPCODE_READ_FLAG	= 0x5,
+	UPIU_QUERY_OPCODE_SET_FLAG	= 0x6,
+	UPIU_QUERY_OPCODE_CLEAR_FLAG	= 0x7,
+	UPIU_QUERY_OPCODE_TOGGLE_FLAG	= 0x8,
+};
+
+/* Query response result code */
+enum {
+	QUERY_RESULT_SUCCESS                    = 0x00,
+	QUERY_RESULT_NOT_READABLE               = 0xF6,
+	QUERY_RESULT_NOT_WRITEABLE              = 0xF7,
+	QUERY_RESULT_ALREADY_WRITTEN            = 0xF8,
+	QUERY_RESULT_INVALID_LENGTH             = 0xF9,
+	QUERY_RESULT_INVALID_VALUE              = 0xFA,
+	QUERY_RESULT_INVALID_SELECTOR           = 0xFB,
+	QUERY_RESULT_INVALID_INDEX              = 0xFC,
+	QUERY_RESULT_INVALID_IDN                = 0xFD,
+	QUERY_RESULT_INVALID_OPCODE             = 0xFE,
+	QUERY_RESULT_GENERAL_FAILURE            = 0xFF,
+};
+
+enum {
+	UPIU_COMMAND_SET_TYPE_SCSI	= 0x0,
+	UPIU_COMMAND_SET_TYPE_UFS	= 0x1,
+	UPIU_COMMAND_SET_TYPE_QUERY	= 0x2,
+};
+
+/* Flag idn for Query Requests*/
+enum flag_idn {
+	QUERY_FLAG_IDN_FDEVICEINIT			= 0x01,
+	QUERY_FLAG_IDN_PERMANENT_WPE			= 0x02,
+	QUERY_FLAG_IDN_PWR_ON_WPE			= 0x03,
+	QUERY_FLAG_IDN_BKOPS_EN				= 0x04,
+	QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE		= 0x05,
+	QUERY_FLAG_IDN_PURGE_ENABLE			= 0x06,
+	QUERY_FLAG_IDN_RESERVED2			= 0x07,
+	QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL		= 0x08,
+	QUERY_FLAG_IDN_BUSY_RTC				= 0x09,
+	QUERY_FLAG_IDN_RESERVED3			= 0x0A,
+	QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE	= 0x0B,
+};
+
+/* Attribute idn for Query requests */
+enum attr_idn {
+	QUERY_ATTR_IDN_BOOT_LU_EN		= 0x00,
+	QUERY_ATTR_IDN_RESERVED			= 0x01,
+	QUERY_ATTR_IDN_POWER_MODE		= 0x02,
+	QUERY_ATTR_IDN_ACTIVE_ICC_LVL		= 0x03,
+	QUERY_ATTR_IDN_OOO_DATA_EN		= 0x04,
+	QUERY_ATTR_IDN_BKOPS_STATUS		= 0x05,
+	QUERY_ATTR_IDN_PURGE_STATUS		= 0x06,
+	QUERY_ATTR_IDN_MAX_DATA_IN		= 0x07,
+	QUERY_ATTR_IDN_MAX_DATA_OUT		= 0x08,
+	QUERY_ATTR_IDN_DYN_CAP_NEEDED		= 0x09,
+	QUERY_ATTR_IDN_REF_CLK_FREQ		= 0x0A,
+	QUERY_ATTR_IDN_CONF_DESC_LOCK		= 0x0B,
+	QUERY_ATTR_IDN_MAX_NUM_OF_RTT		= 0x0C,
+	QUERY_ATTR_IDN_EE_CONTROL		= 0x0D,
+	QUERY_ATTR_IDN_EE_STATUS		= 0x0E,
+	QUERY_ATTR_IDN_SECONDS_PASSED		= 0x0F,
+	QUERY_ATTR_IDN_CNTX_CONF		= 0x10,
+	QUERY_ATTR_IDN_CORR_PRG_BLK_NUM		= 0x11,
+	QUERY_ATTR_IDN_RESERVED2		= 0x12,
+	QUERY_ATTR_IDN_RESERVED3		= 0x13,
+	QUERY_ATTR_IDN_FFU_STATUS		= 0x14,
+	QUERY_ATTR_IDN_PSA_STATE		= 0x15,
+	QUERY_ATTR_IDN_PSA_DATA_SIZE		= 0x16,
+};
+
+/* Descriptor idn for Query requests */
+enum desc_idn {
+	QUERY_DESC_IDN_DEVICE		= 0x0,
+	QUERY_DESC_IDN_CONFIGURATION	= 0x1,
+	QUERY_DESC_IDN_UNIT		= 0x2,
+	QUERY_DESC_IDN_RFU_0		= 0x3,
+	QUERY_DESC_IDN_INTERCONNECT	= 0x4,
+	QUERY_DESC_IDN_STRING		= 0x5,
+	QUERY_DESC_IDN_RFU_1		= 0x6,
+	QUERY_DESC_IDN_GEOMETRY		= 0x7,
+	QUERY_DESC_IDN_POWER		= 0x8,
+	QUERY_DESC_IDN_HEALTH           = 0x9,
+	QUERY_DESC_IDN_MAX,
+};
+
+enum desc_header_offset {
+	QUERY_DESC_LENGTH_OFFSET	= 0x00,
+	QUERY_DESC_DESC_TYPE_OFFSET	= 0x01,
+};
+
+struct ufshcd_sg_entry {
+	__le32    base_addr;
+	__le32    upper_addr;
+	__le32    reserved;
+	__le32    size;
+};
+
+#define MAX_BUFF	128
+/**
+ * struct utp_transfer_cmd_desc - UFS Command Descriptor structure
+ * @command_upiu: Command UPIU Frame address
+ * @response_upiu: Response UPIU Frame address
+ * @prd_table: Physical Region Descriptor
+ */
+struct utp_transfer_cmd_desc {
+	u8 command_upiu[ALIGNED_UPIU_SIZE];
+	u8 response_upiu[ALIGNED_UPIU_SIZE];
+	struct ufshcd_sg_entry    prd_table[MAX_BUFF];
+};
+
+/**
+ * struct request_desc_header - Descriptor Header common to both UTRD and UTMRD
+ * @dword0: Descriptor Header DW0
+ * @dword1: Descriptor Header DW1
+ * @dword2: Descriptor Header DW2
+ * @dword3: Descriptor Header DW3
+ */
+struct request_desc_header {
+	__le32 dword_0;
+	__le32 dword_1;
+	__le32 dword_2;
+	__le32 dword_3;
+};
+
+/**
+ * struct utp_transfer_req_desc - UTRD structure
+ * @header: UTRD header DW-0 to DW-3
+ * @command_desc_base_addr_lo: UCD base address low DW-4
+ * @command_desc_base_addr_hi: UCD base address high DW-5
+ * @response_upiu_length: response UPIU length DW-6
+ * @response_upiu_offset: response UPIU offset DW-6
+ * @prd_table_length: Physical region descriptor length DW-7
+ * @prd_table_offset: Physical region descriptor offset DW-7
+ */
+struct utp_transfer_req_desc {
+	/* DW 0-3 */
+	struct request_desc_header header;
+
+	/* DW 4-5*/
+	__le32  command_desc_base_addr_lo;
+	__le32  command_desc_base_addr_hi;
+
+	/* DW 6 */
+	__le16  response_upiu_length;
+	__le16  response_upiu_offset;
+
+	/* DW 7 */
+	__le16  prd_table_length;
+	__le16  prd_table_offset;
+};
+
+/**
+ * struct utp_upiu_header - UPIU header structure
+ * @dword_0: UPIU header DW-0
+ * @dword_1: UPIU header DW-1
+ * @dword_2: UPIU header DW-2
+ */
+struct utp_upiu_header {
+	__be32 dword_0;
+	__be32 dword_1;
+	__be32 dword_2;
+};
+
+/**
+ * struct utp_upiu_query - upiu request buffer structure for
+ * query request.
+ * @opcode: command to perform B-0
+ * @idn: a value that indicates the particular type of data B-1
+ * @index: Index to further identify data B-2
+ * @selector: Index to further identify data B-3
+ * @reserved_osf: spec reserved field B-4,5
+ * @length: number of descriptor bytes to read/write B-6,7
+ * @value: Attribute value to be written DW-5
+ * @reserved: spec reserved DW-6,7
+ */
+struct utp_upiu_query {
+	__u8 opcode;
+	__u8 idn;
+	__u8 index;
+	__u8 selector;
+	__be16 reserved_osf;
+	__be16 length;
+	__be32 value;
+	__be32 reserved[2];
+};
+
+/**
+ * struct utp_upiu_cmd - Command UPIU structure
+ * @data_transfer_len: Data Transfer Length DW-3
+ * @cdb: Command Descriptor Block CDB DW-4 to DW-7
+ */
+struct utp_upiu_cmd {
+	__be32 exp_data_transfer_len;
+	u8 cdb[UFS_CDB_SIZE];
+};
+
+/*
+ * UTMRD structure.
+ */
+struct utp_task_req_desc {
+	/* DW 0-3 */
+	struct request_desc_header header;
+
+	/* DW 4-11 - Task request UPIU structure */
+	struct utp_upiu_header	req_header;
+	__be32			input_param1;
+	__be32			input_param2;
+	__be32			input_param3;
+	__be32			__reserved1[2];
+
+	/* DW 12-19 - Task Management Response UPIU structure */
+	struct utp_upiu_header	rsp_header;
+	__be32			output_param1;
+	__be32			output_param2;
+	__be32			__reserved2[3];
+};
+
+/**
+ * struct utp_upiu_req - general upiu request structure
+ * @header:UPIU header structure DW-0 to DW-2
+ * @sc: fields structure for scsi command DW-3 to DW-7
+ * @qr: fields structure for query request DW-3 to DW-7
+ */
+struct utp_upiu_req {
+	struct utp_upiu_header header;
+	union {
+		struct utp_upiu_cmd		sc;
+		struct utp_upiu_query		qr;
+		struct utp_upiu_query		tr;
+		/* use utp_upiu_query to host the 4 dwords of uic command */
+		struct utp_upiu_query		uc;
+	};
+};
+
+/**
+ * struct utp_cmd_rsp - Response UPIU structure
+ * @residual_transfer_count: Residual transfer count DW-3
+ * @reserved: Reserved double words DW-4 to DW-7
+ * @sense_data_len: Sense data length DW-8 U16
+ * @sense_data: Sense data field DW-8 to DW-12
+ */
+struct utp_cmd_rsp {
+	__be32 residual_transfer_count;
+	__be32 reserved[4];
+	__be16 sense_data_len;
+	u8 sense_data[RESPONSE_UPIU_SENSE_DATA_LENGTH];
+};
+
+/**
+ * struct utp_upiu_rsp - general upiu response structure
+ * @header: UPIU header structure DW-0 to DW-2
+ * @sr: fields structure for scsi command DW-3 to DW-12
+ * @qr: fields structure for query request DW-3 to DW-7
+ */
+struct utp_upiu_rsp {
+	struct utp_upiu_header header;
+	union {
+		struct utp_cmd_rsp sr;
+		struct utp_upiu_query qr;
+	};
+};
+
+#define MAX_MODEL_LEN 16
+/**
+ * ufs_dev_desc - ufs device details from the device descriptor
+ *
+ * @wmanufacturerid: card details
+ * @model: card model
+ */
+struct ufs_dev_desc {
+	u16 wmanufacturerid;
+	char model[MAX_MODEL_LEN + 1];
+};
+
+/* Device descriptor parameters offsets in bytes*/
+enum device_desc_param {
+	DEVICE_DESC_PARAM_LEN			= 0x0,
+	DEVICE_DESC_PARAM_TYPE			= 0x1,
+	DEVICE_DESC_PARAM_DEVICE_TYPE		= 0x2,
+	DEVICE_DESC_PARAM_DEVICE_CLASS		= 0x3,
+	DEVICE_DESC_PARAM_DEVICE_SUB_CLASS	= 0x4,
+	DEVICE_DESC_PARAM_PRTCL			= 0x5,
+	DEVICE_DESC_PARAM_NUM_LU		= 0x6,
+	DEVICE_DESC_PARAM_NUM_WLU		= 0x7,
+	DEVICE_DESC_PARAM_BOOT_ENBL		= 0x8,
+	DEVICE_DESC_PARAM_DESC_ACCSS_ENBL	= 0x9,
+	DEVICE_DESC_PARAM_INIT_PWR_MODE		= 0xA,
+	DEVICE_DESC_PARAM_HIGH_PR_LUN		= 0xB,
+	DEVICE_DESC_PARAM_SEC_RMV_TYPE		= 0xC,
+	DEVICE_DESC_PARAM_SEC_LU		= 0xD,
+	DEVICE_DESC_PARAM_BKOP_TERM_LT		= 0xE,
+	DEVICE_DESC_PARAM_ACTVE_ICC_LVL		= 0xF,
+	DEVICE_DESC_PARAM_SPEC_VER		= 0x10,
+	DEVICE_DESC_PARAM_MANF_DATE		= 0x12,
+	DEVICE_DESC_PARAM_MANF_NAME		= 0x14,
+	DEVICE_DESC_PARAM_PRDCT_NAME		= 0x15,
+	DEVICE_DESC_PARAM_SN			= 0x16,
+	DEVICE_DESC_PARAM_OEM_ID		= 0x17,
+	DEVICE_DESC_PARAM_MANF_ID		= 0x18,
+	DEVICE_DESC_PARAM_UD_OFFSET		= 0x1A,
+	DEVICE_DESC_PARAM_UD_LEN		= 0x1B,
+	DEVICE_DESC_PARAM_RTT_CAP		= 0x1C,
+	DEVICE_DESC_PARAM_FRQ_RTC		= 0x1D,
+	DEVICE_DESC_PARAM_UFS_FEAT		= 0x1F,
+	DEVICE_DESC_PARAM_FFU_TMT		= 0x20,
+	DEVICE_DESC_PARAM_Q_DPTH		= 0x21,
+	DEVICE_DESC_PARAM_DEV_VER		= 0x22,
+	DEVICE_DESC_PARAM_NUM_SEC_WPA		= 0x24,
+	DEVICE_DESC_PARAM_PSA_MAX_DATA		= 0x25,
+	DEVICE_DESC_PARAM_PSA_TMT		= 0x29,
+	DEVICE_DESC_PARAM_PRDCT_REV		= 0x2A,
+};
+
+struct ufs_hba;
+
+enum {
+	UFSHCD_MAX_CHANNEL	= 0,
+	UFSHCD_MAX_ID		= 1,
+};
+
+enum dev_cmd_type {
+	DEV_CMD_TYPE_NOP		= 0x0,
+	DEV_CMD_TYPE_QUERY		= 0x1,
+};
+
+/**
+ * struct uic_command - UIC command structure
+ * @command: UIC command
+ * @argument1: UIC command argument 1
+ * @argument2: UIC command argument 2
+ * @argument3: UIC command argument 3
+ * @cmd_active: Indicate if UIC command is outstanding
+ * @result: UIC command result
+ * @done: UIC command completion
+ */
+struct uic_command {
+	u32 command;
+	u32 argument1;
+	u32 argument2;
+	u32 argument3;
+	int cmd_active;
+	int result;
+};
+
+/* GenSelectorIndex calculation macros for M-PHY attributes */
+#define UIC_ARG_MPHY_TX_GEN_SEL_INDEX(lane) (lane)
+#define UIC_ARG_MPHY_RX_GEN_SEL_INDEX(lane) (PA_MAXDATALANES + (lane))
+
+#define UIC_ARG_MIB_SEL(attr, sel)	((((attr) & 0xFFFF) << 16) |\
+					 ((sel) & 0xFFFF))
+#define UIC_ARG_MIB(attr)		UIC_ARG_MIB_SEL(attr, 0)
+#define UIC_ARG_ATTR_TYPE(t)		(((t) & 0xFF) << 16)
+#define UIC_GET_ATTR_ID(v)		(((v) >> 16) & 0xFFFF)
+
+/* Link Status*/
+enum link_status {
+	UFSHCD_LINK_IS_DOWN	= 1,
+	UFSHCD_LINK_IS_UP	= 2,
+};
+
+#define UIC_ARG_MIB_SEL(attr, sel)	((((attr) & 0xFFFF) << 16) |\
+					 ((sel) & 0xFFFF))
+#define UIC_ARG_MIB(attr)		UIC_ARG_MIB_SEL(attr, 0)
+#define UIC_ARG_ATTR_TYPE(t)		(((t) & 0xFF) << 16)
+#define UIC_GET_ATTR_ID(v)		(((v) >> 16) & 0xFFFF)
+
+/* UIC Commands */
+enum uic_cmd_dme {
+	UIC_CMD_DME_GET			= 0x01,
+	UIC_CMD_DME_SET			= 0x02,
+	UIC_CMD_DME_PEER_GET		= 0x03,
+	UIC_CMD_DME_PEER_SET		= 0x04,
+	UIC_CMD_DME_POWERON		= 0x10,
+	UIC_CMD_DME_POWEROFF		= 0x11,
+	UIC_CMD_DME_ENABLE		= 0x12,
+	UIC_CMD_DME_RESET		= 0x14,
+	UIC_CMD_DME_END_PT_RST		= 0x15,
+	UIC_CMD_DME_LINK_STARTUP	= 0x16,
+	UIC_CMD_DME_HIBER_ENTER		= 0x17,
+	UIC_CMD_DME_HIBER_EXIT		= 0x18,
+	UIC_CMD_DME_TEST_MODE		= 0x1A,
+};
+
+/* UIC Config result code / Generic error code */
+enum {
+	UIC_CMD_RESULT_SUCCESS			= 0x00,
+	UIC_CMD_RESULT_INVALID_ATTR		= 0x01,
+	UIC_CMD_RESULT_FAILURE			= 0x01,
+	UIC_CMD_RESULT_INVALID_ATTR_VALUE	= 0x02,
+	UIC_CMD_RESULT_READ_ONLY_ATTR		= 0x03,
+	UIC_CMD_RESULT_WRITE_ONLY_ATTR		= 0x04,
+	UIC_CMD_RESULT_BAD_INDEX		= 0x05,
+	UIC_CMD_RESULT_LOCKED_ATTR		= 0x06,
+	UIC_CMD_RESULT_BAD_TEST_FEATURE_INDEX	= 0x07,
+	UIC_CMD_RESULT_PEER_COMM_FAILURE	= 0x08,
+	UIC_CMD_RESULT_BUSY			= 0x09,
+	UIC_CMD_RESULT_DME_FAILURE		= 0x0A,
+};
+
+#define MASK_UIC_COMMAND_RESULT			0xFF
+
+/* Host <-> Device UniPro Link state */
+enum uic_link_state {
+	UIC_LINK_OFF_STATE	= 0, /* Link powered down or disabled */
+	UIC_LINK_ACTIVE_STATE	= 1, /* Link is in Fast/Slow/Sleep state */
+	UIC_LINK_HIBERN8_STATE	= 2, /* Link is in Hibernate state */
+};
+
+/* UIC command interfaces for DME primitives */
+#define DME_LOCAL	0
+#define DME_PEER	1
+#define ATTR_SET_NOR	0	/* NORMAL */
+#define ATTR_SET_ST	1	/* STATIC */
+
+int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel,
+			u8 attr_set, u32 mib_val, u8 peer);
+int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
+			u32 *mib_val, u8 peer);
+
+static inline int ufshcd_dme_set(struct ufs_hba *hba, u32 attr_sel,
+				 u32 mib_val)
+{
+	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR,
+				   mib_val, DME_LOCAL);
+}
+
+static inline int ufshcd_dme_get(struct ufs_hba *hba,
+				 u32 attr_sel, u32 *mib_val)
+{
+	return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_LOCAL);
+}
+
+static inline int ufshcd_dme_peer_get(struct ufs_hba *hba,
+				      u32 attr_sel, u32 *mib_val)
+{
+	return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_PEER);
+}
+
+static inline int ufshcd_dme_peer_set(struct ufs_hba *hba, u32 attr_sel,
+				      u32 mib_val)
+{
+	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR,
+				   mib_val, DME_PEER);
+}
+
+/**
+ * struct ufs_query_req - parameters for building a query request
+ * @query_func: UPIU header query function
+ * @upiu_req: the query request data
+ */
+struct ufs_query_req {
+	u8 query_func;
+	struct utp_upiu_query upiu_req;
+};
+
+/**
+ * struct ufs_query_resp - UPIU QUERY
+ * @response: device response code
+ * @upiu_res: query response data
+ */
+struct ufs_query_res {
+	u8 response;
+	struct utp_upiu_query upiu_res;
+};
+
+/**
+ * struct ufs_query - holds relevant data structures for query request
+ * @request: request upiu and function
+ * @descriptor: buffer for sending/receiving descriptor
+ * @response: response upiu and response
+ */
+struct ufs_query {
+	struct ufs_query_req request;
+	u8 *descriptor;
+	struct ufs_query_res response;
+};
+
+/**
+ * struct ufs_dev_cmd - all assosiated fields with device management commands
+ * @type: device management command type - Query, NOP OUT
+ * @tag_wq: wait queue until free command slot is available
+ */
+struct ufs_dev_cmd {
+	enum dev_cmd_type type;
+	struct ufs_query query;
+};
+
+struct ufs_hba_ops {
+	int (*init)(struct ufs_hba *hba);
+	int (*hce_enable_notify)(struct ufs_hba *hba,
+				 enum ufs_notify_change_status);
+	int (*link_startup_notify)(struct ufs_hba *hba,
+				   enum ufs_notify_change_status);
+	int (*phy_initialization)(struct ufs_hba *hba);
+};
+
+struct ufs_hba {
+	struct			udevice *dev;
+	void __iomem		*mmio_base;
+	struct ufs_hba_ops	*ops;
+	struct ufs_desc_size	desc_size;
+	u32			capabilities;
+	u32			version;
+	u32			intr_mask;
+	u32			quirks;
+/*
+ * If UFS host controller is having issue in processing LCC (Line
+ * Control Command) coming from device then enable this quirk.
+ * When this quirk is enabled, host controller driver should disable
+ * the LCC transmission on UFS device (by clearing TX_LCC_ENABLE
+ * attribute of device to 0).
+ */
+#define UFSHCD_QUIRK_BROKEN_LCC				0x1
+
+	/* Virtual memory reference */
+	struct utp_transfer_cmd_desc *ucdl;
+	struct utp_transfer_req_desc *utrdl;
+	/* TODO: Add Task Manegement Support */
+	struct utp_task_req_desc *utmrdl;
+
+	struct utp_upiu_req *ucd_req_ptr;
+	struct utp_upiu_rsp *ucd_rsp_ptr;
+	struct ufshcd_sg_entry *ucd_prdt_ptr;
+
+	/* Power Mode information */
+	enum ufs_dev_pwr_mode curr_dev_pwr_mode;
+	struct ufs_pa_layer_attr pwr_info;
+	struct ufs_pwr_mode_info max_pwr_info;
+
+	struct ufs_dev_cmd dev_cmd;
+};
+
+static inline int ufshcd_ops_init(struct ufs_hba *hba)
+{
+	if (hba->ops && hba->ops->init)
+		return hba->ops->init(hba);
+
+	return 0;
+}
+
+static inline int ufshcd_ops_hce_enable_notify(struct ufs_hba *hba,
+						bool status)
+{
+	if (hba->ops && hba->ops->hce_enable_notify)
+		return hba->ops->hce_enable_notify(hba, status);
+
+	return 0;
+}
+
+static inline int ufshcd_ops_link_startup_notify(struct ufs_hba *hba,
+						 bool status)
+{
+	if (hba->ops && hba->ops->link_startup_notify)
+		return hba->ops->link_startup_notify(hba, status);
+
+	return 0;
+}
+
+/* Controller UFSHCI version */
+enum {
+	UFSHCI_VERSION_10 = 0x00010000, /* 1.0 */
+	UFSHCI_VERSION_11 = 0x00010100, /* 1.1 */
+	UFSHCI_VERSION_20 = 0x00000200, /* 2.0 */
+	UFSHCI_VERSION_21 = 0x00000210, /* 2.1 */
+};
+
+/* Interrupt disable masks */
+enum {
+	/* Interrupt disable mask for UFSHCI v1.0 */
+	INTERRUPT_MASK_ALL_VER_10	= 0x30FFF,
+	INTERRUPT_MASK_RW_VER_10	= 0x30000,
+
+	/* Interrupt disable mask for UFSHCI v1.1 */
+	INTERRUPT_MASK_ALL_VER_11	= 0x31FFF,
+
+	/* Interrupt disable mask for UFSHCI v2.1 */
+	INTERRUPT_MASK_ALL_VER_21	= 0x71FFF,
+};
+
+/* UFSHCI Registers */
+enum {
+	REG_CONTROLLER_CAPABILITIES		= 0x00,
+	REG_UFS_VERSION				= 0x08,
+	REG_CONTROLLER_DEV_ID			= 0x10,
+	REG_CONTROLLER_PROD_ID			= 0x14,
+	REG_AUTO_HIBERNATE_IDLE_TIMER		= 0x18,
+	REG_INTERRUPT_STATUS			= 0x20,
+	REG_INTERRUPT_ENABLE			= 0x24,
+	REG_CONTROLLER_STATUS			= 0x30,
+	REG_CONTROLLER_ENABLE			= 0x34,
+	REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER	= 0x38,
+	REG_UIC_ERROR_CODE_DATA_LINK_LAYER	= 0x3C,
+	REG_UIC_ERROR_CODE_NETWORK_LAYER	= 0x40,
+	REG_UIC_ERROR_CODE_TRANSPORT_LAYER	= 0x44,
+	REG_UIC_ERROR_CODE_DME			= 0x48,
+	REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL	= 0x4C,
+	REG_UTP_TRANSFER_REQ_LIST_BASE_L	= 0x50,
+	REG_UTP_TRANSFER_REQ_LIST_BASE_H	= 0x54,
+	REG_UTP_TRANSFER_REQ_DOOR_BELL		= 0x58,
+	REG_UTP_TRANSFER_REQ_LIST_CLEAR		= 0x5C,
+	REG_UTP_TRANSFER_REQ_LIST_RUN_STOP	= 0x60,
+	REG_UTP_TASK_REQ_LIST_BASE_L		= 0x70,
+	REG_UTP_TASK_REQ_LIST_BASE_H		= 0x74,
+	REG_UTP_TASK_REQ_DOOR_BELL		= 0x78,
+	REG_UTP_TASK_REQ_LIST_CLEAR		= 0x7C,
+	REG_UTP_TASK_REQ_LIST_RUN_STOP		= 0x80,
+	REG_UIC_COMMAND				= 0x90,
+	REG_UIC_COMMAND_ARG_1			= 0x94,
+	REG_UIC_COMMAND_ARG_2			= 0x98,
+	REG_UIC_COMMAND_ARG_3			= 0x9C,
+
+	UFSHCI_REG_SPACE_SIZE			= 0xA0,
+
+	REG_UFS_CCAP				= 0x100,
+	REG_UFS_CRYPTOCAP			= 0x104,
+
+	UFSHCI_CRYPTO_REG_SPACE_SIZE		= 0x400,
+};
+
+/* Controller capability masks */
+enum {
+	MASK_TRANSFER_REQUESTS_SLOTS		= 0x0000001F,
+	MASK_TASK_MANAGEMENT_REQUEST_SLOTS	= 0x00070000,
+	MASK_AUTO_HIBERN8_SUPPORT		= 0x00800000,
+	MASK_64_ADDRESSING_SUPPORT		= 0x01000000,
+	MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT	= 0x02000000,
+	MASK_UIC_DME_TEST_MODE_SUPPORT		= 0x04000000,
+};
+
+/* Interrupt Status 20h */
+#define UTP_TRANSFER_REQ_COMPL			0x1
+#define UIC_DME_END_PT_RESET			0x2
+#define UIC_ERROR				0x4
+#define UIC_TEST_MODE				0x8
+#define UIC_POWER_MODE				0x10
+#define UIC_HIBERNATE_EXIT			0x20
+#define UIC_HIBERNATE_ENTER			0x40
+#define UIC_LINK_LOST				0x80
+#define UIC_LINK_STARTUP			0x100
+#define UTP_TASK_REQ_COMPL			0x200
+#define UIC_COMMAND_COMPL			0x400
+#define DEVICE_FATAL_ERROR			0x800
+#define CONTROLLER_FATAL_ERROR			0x10000
+#define SYSTEM_BUS_FATAL_ERROR			0x20000
+
+#define UFSHCD_UIC_PWR_MASK	(UIC_HIBERNATE_ENTER |\
+				UIC_HIBERNATE_EXIT |\
+				UIC_POWER_MODE)
+
+#define UFSHCD_UIC_MASK		(UIC_COMMAND_COMPL | UIC_POWER_MODE)
+
+#define UFSHCD_ERROR_MASK	(UIC_ERROR |\
+				DEVICE_FATAL_ERROR |\
+				CONTROLLER_FATAL_ERROR |\
+				SYSTEM_BUS_FATAL_ERROR)
+
+#define INT_FATAL_ERRORS	(DEVICE_FATAL_ERROR |\
+				CONTROLLER_FATAL_ERROR |\
+				SYSTEM_BUS_FATAL_ERROR)
+
+/* Host Controller Enable 0x34h */
+#define CONTROLLER_ENABLE	0x1
+#define CONTROLLER_DISABLE	0x0
+/* HCS - Host Controller Status 30h */
+#define DEVICE_PRESENT				0x1
+#define UTP_TRANSFER_REQ_LIST_READY		0x2
+#define UTP_TASK_REQ_LIST_READY			0x4
+#define UIC_COMMAND_READY			0x8
+#define HOST_ERROR_INDICATOR			0x10
+#define DEVICE_ERROR_INDICATOR			0x20
+#define UIC_POWER_MODE_CHANGE_REQ_STATUS_MASK	UFS_MASK(0x7, 8)
+
+#define UFSHCD_STATUS_READY	(UTP_TRANSFER_REQ_LIST_READY |\
+				UTP_TASK_REQ_LIST_READY |\
+				UIC_COMMAND_READY)
+
+enum {
+	PWR_OK		= 0x0,
+	PWR_LOCAL	= 0x01,
+	PWR_REMOTE	= 0x02,
+	PWR_BUSY	= 0x03,
+	PWR_ERROR_CAP	= 0x04,
+	PWR_FATAL_ERROR	= 0x05,
+};
+
+/* UICCMD - UIC Command */
+#define COMMAND_OPCODE_MASK		0xFF
+#define GEN_SELECTOR_INDEX_MASK		0xFFFF
+
+#define MIB_ATTRIBUTE_MASK		UFS_MASK(0xFFFF, 16)
+#define RESET_LEVEL			0xFF
+
+#define ATTR_SET_TYPE_MASK		UFS_MASK(0xFF, 16)
+#define CFG_RESULT_CODE_MASK		0xFF
+#define GENERIC_ERROR_CODE_MASK		0xFF
+
+#define ufshcd_writel(hba, val, reg)   \
+	writel((val), (hba)->mmio_base + (reg))
+#define ufshcd_readl(hba, reg) \
+	readl((hba)->mmio_base + (reg))
+
+/* UTRLRSR - UTP Transfer Request Run-Stop Register 60h */
+#define UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT	0x1
+
+/* UTMRLRSR - UTP Task Management Request Run-Stop Register 80h */
+#define UTP_TASK_REQ_LIST_RUN_STOP_BIT		0x1
+
+int ufshcd_probe(struct udevice *dev, struct ufs_hba_ops *hba_ops);
+
+#endif
diff --git a/u-boot/drivers/ufs/ufshcd-dwc.c b/u-boot/drivers/ufs/ufshcd-dwc.c
new file mode 100644
index 0000000..c67bdb8
--- /dev/null
+++ b/u-boot/drivers/ufs/ufshcd-dwc.c
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * UFS Host driver for Synopsys Designware Core
+ *
+ * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * Authors: Joao Pinto <jpinto@synopsys.com>
+ */
+
+#include "ufs.h"
+#include "unipro.h"
+
+#include "ufshcd-dwc.h"
+#include "ufshci-dwc.h"
+
+int ufshcd_dwc_dme_set_attrs(struct ufs_hba *hba,
+				const struct ufshcd_dme_attr_val *v, int n)
+{
+	int ret = 0;
+	int attr_node = 0;
+
+	for (attr_node = 0; attr_node < n; attr_node++) {
+		ret = ufshcd_dme_set_attr(hba, v[attr_node].attr_sel,
+			ATTR_SET_NOR, v[attr_node].mib_val, v[attr_node].peer);
+
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL(ufshcd_dwc_dme_set_attrs);
+
+/**
+ * ufshcd_dwc_program_clk_div()
+ * This function programs the clk divider value. This value is needed to
+ * provide 1 microsecond tick to unipro layer.
+ * @hba: Private Structure pointer
+ * @divider_val: clock divider value to be programmed
+ *
+ */
+static void ufshcd_dwc_program_clk_div(struct ufs_hba *hba, u32 divider_val)
+{
+	ufshcd_writel(hba, divider_val, DWC_UFS_REG_HCLKDIV);
+}
+
+/**
+ * ufshcd_dwc_link_is_up()
+ * Check if link is up
+ * @hba: private structure pointer
+ *
+ * Returns 0 on success, non-zero value on failure
+ */
+static int ufshcd_dwc_link_is_up(struct ufs_hba *hba)
+{
+	int dme_result = 0;
+
+	ufshcd_dme_get(hba, UIC_ARG_MIB(VS_POWERSTATE), &dme_result);
+
+	if (dme_result == UFSHCD_LINK_IS_UP) 
+		return 0;
+
+	return 1;
+}
+
+/**
+ * ufshcd_dwc_connection_setup()
+ * This function configures both the local side (host) and the peer side
+ * (device) unipro attributes to establish the connection to application/
+ * cport.
+ * This function is not required if the hardware is properly configured to
+ * have this connection setup on reset. But invoking this function does no
+ * harm and should be fine even working with any ufs device.
+ *
+ * @hba: pointer to drivers private data
+ *
+ * Returns 0 on success non-zero value on failure
+ */
+static int ufshcd_dwc_connection_setup(struct ufs_hba *hba)
+{
+	static const struct ufshcd_dme_attr_val setup_attrs[] = {
+		{ UIC_ARG_MIB(T_CONNECTIONSTATE), 0, DME_LOCAL },
+		{ UIC_ARG_MIB(N_DEVICEID), 0, DME_LOCAL },
+		{ UIC_ARG_MIB(N_DEVICEID_VALID), 0, DME_LOCAL },
+		{ UIC_ARG_MIB(T_PEERDEVICEID), 1, DME_LOCAL },
+		{ UIC_ARG_MIB(T_PEERCPORTID), 0, DME_LOCAL },
+		{ UIC_ARG_MIB(T_TRAFFICCLASS), 0, DME_LOCAL },
+		{ UIC_ARG_MIB(T_CPORTFLAGS), 0x6, DME_LOCAL },
+		{ UIC_ARG_MIB(T_CPORTMODE), 1, DME_LOCAL },
+		{ UIC_ARG_MIB(T_CONNECTIONSTATE), 1, DME_LOCAL },
+		{ UIC_ARG_MIB(T_CONNECTIONSTATE), 0, DME_PEER },
+		{ UIC_ARG_MIB(N_DEVICEID), 1, DME_PEER },
+		{ UIC_ARG_MIB(N_DEVICEID_VALID), 1, DME_PEER },
+		{ UIC_ARG_MIB(T_PEERDEVICEID), 1, DME_PEER },
+		{ UIC_ARG_MIB(T_PEERCPORTID), 0, DME_PEER },
+		{ UIC_ARG_MIB(T_TRAFFICCLASS), 0, DME_PEER },
+		{ UIC_ARG_MIB(T_CPORTFLAGS), 0x6, DME_PEER },
+		{ UIC_ARG_MIB(T_CPORTMODE), 1, DME_PEER },
+		{ UIC_ARG_MIB(T_CONNECTIONSTATE), 1, DME_PEER }
+	};
+
+	return ufshcd_dwc_dme_set_attrs(hba, setup_attrs, ARRAY_SIZE(setup_attrs));
+}
+
+/**
+ * ufshcd_dwc_link_startup_notify()
+ * UFS Host DWC specific link startup sequence
+ * @hba: private structure pointer
+ * @status: Callback notify status
+ *
+ * Returns 0 on success, non-zero value on failure
+ */
+int ufshcd_dwc_link_startup_notify(struct ufs_hba *hba,
+					enum ufs_notify_change_status status)
+{
+	int err = 0;
+
+	if (status == PRE_CHANGE) {
+		ufshcd_dwc_program_clk_div(hba, DWC_UFS_REG_HCLKDIV_DIV_125);
+
+		if (hba->ops->phy_initialization) {
+			err = hba->ops->phy_initialization(hba);
+			if (err) {
+				dev_err(hba->dev, "Phy setup failed (%d)\n",
+									err);
+				goto out;
+			}
+		}
+	} else { /* POST_CHANGE */
+		err = ufshcd_dwc_link_is_up(hba);
+		if (err) {
+			dev_err(hba->dev, "Link is not up\n");
+			goto out;
+		}
+
+		err = ufshcd_dwc_connection_setup(hba);
+		if (err)
+			dev_err(hba->dev, "Connection setup failed (%d)\n",
+									err);
+	}
+
+out:
+	return err;
+}
+EXPORT_SYMBOL(ufshcd_dwc_link_startup_notify);
+
+MODULE_AUTHOR("Joao Pinto <Joao.Pinto@synopsys.com>");
+MODULE_DESCRIPTION("UFS Host driver for Synopsys Designware Core");
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/u-boot/drivers/ufs/ufshcd-dwc.h b/u-boot/drivers/ufs/ufshcd-dwc.h
new file mode 100644
index 0000000..4268ca2
--- /dev/null
+++ b/u-boot/drivers/ufs/ufshcd-dwc.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * UFS Host driver for Synopsys Designware Core
+ *
+ * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * Authors: Joao Pinto <jpinto@synopsys.com>
+ */
+
+#ifndef _UFSHCD_DWC_H
+#define _UFSHCD_DWC_H
+
+struct ufshcd_dme_attr_val {
+	u32 attr_sel;
+	u32 mib_val;
+	u8 peer;
+};
+
+int ufshcd_dwc_link_startup_notify(struct ufs_hba *hba,
+					enum ufs_notify_change_status status);
+int ufshcd_dwc_dme_set_attrs(struct ufs_hba *hba,
+				const struct ufshcd_dme_attr_val *v, int n);
+#endif /* End of Header */
diff --git a/u-boot/drivers/ufs/ufshci-dwc.h b/u-boot/drivers/ufs/ufshci-dwc.h
new file mode 100644
index 0000000..6c290e2
--- /dev/null
+++ b/u-boot/drivers/ufs/ufshci-dwc.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * UFS Host driver for Synopsys Designware Core
+ *
+ * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * Authors: Joao Pinto <jpinto@synopsys.com>
+ */
+
+#ifndef _UFSHCI_DWC_H
+#define _UFSHCI_DWC_H
+
+/* DWC HC UFSHCI specific Registers */
+enum dwc_specific_registers {
+	DWC_UFS_REG_HCLKDIV	= 0xFC,
+};
+
+/* Clock Divider Values: Hex equivalent of frequency in MHz */
+enum clk_div_values {
+	DWC_UFS_REG_HCLKDIV_DIV_62_5	= 0x3e,
+	DWC_UFS_REG_HCLKDIV_DIV_125	= 0x7d,
+	DWC_UFS_REG_HCLKDIV_DIV_200	= 0xc8,
+};
+
+/* Selector Index */
+enum selector_index {
+	SELIND_LN0_TX		= 0x00,
+	SELIND_LN1_TX		= 0x01,
+	SELIND_LN0_RX		= 0x04,
+	SELIND_LN1_RX		= 0x05,
+};
+
+#endif /* End of Header */
diff --git a/u-boot/drivers/ufs/unipro.h b/u-boot/drivers/ufs/unipro.h
new file mode 100644
index 0000000..b30b17f
--- /dev/null
+++ b/u-boot/drivers/ufs/unipro.h
@@ -0,0 +1,270 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+#ifndef _UNIPRO_H_
+#define _UNIPRO_H_
+
+/*
+ * M-TX Configuration Attributes
+ */
+#define TX_HIBERN8TIME_CAPABILITY		0x000F
+#define TX_MODE					0x0021
+#define TX_HSRATE_SERIES			0x0022
+#define TX_HSGEAR				0x0023
+#define TX_PWMGEAR				0x0024
+#define TX_AMPLITUDE				0x0025
+#define TX_HS_SLEWRATE				0x0026
+#define TX_SYNC_SOURCE				0x0027
+#define TX_HS_SYNC_LENGTH			0x0028
+#define TX_HS_PREPARE_LENGTH			0x0029
+#define TX_LS_PREPARE_LENGTH			0x002A
+#define TX_HIBERN8_CONTROL			0x002B
+#define TX_LCC_ENABLE				0x002C
+#define TX_PWM_BURST_CLOSURE_EXTENSION		0x002D
+#define TX_BYPASS_8B10B_ENABLE			0x002E
+#define TX_DRIVER_POLARITY			0x002F
+#define TX_HS_UNTERMINATED_LINE_DRIVE_ENABLE	0x0030
+#define TX_LS_TERMINATED_LINE_DRIVE_ENABLE	0x0031
+#define TX_LCC_SEQUENCER			0x0032
+#define TX_MIN_ACTIVATETIME			0x0033
+#define TX_PWM_G6_G7_SYNC_LENGTH		0x0034
+#define TX_REFCLKFREQ				0x00EB
+#define TX_CFGCLKFREQVAL			0x00EC
+#define	CFGEXTRATTR				0x00F0
+#define DITHERCTRL2				0x00F1
+
+/*
+ * M-RX Configuration Attributes
+ */
+#define RX_MODE					0x00A1
+#define RX_HSRATE_SERIES			0x00A2
+#define RX_HSGEAR				0x00A3
+#define RX_PWMGEAR				0x00A4
+#define RX_LS_TERMINATED_ENABLE			0x00A5
+#define RX_HS_UNTERMINATED_ENABLE		0x00A6
+#define RX_ENTER_HIBERN8			0x00A7
+#define RX_BYPASS_8B10B_ENABLE			0x00A8
+#define RX_TERMINATION_FORCE_ENABLE		0x0089
+#define RX_MIN_ACTIVATETIME_CAPABILITY		0x008F
+#define RX_HIBERN8TIME_CAPABILITY		0x0092
+#define RX_REFCLKFREQ				0x00EB
+#define	RX_CFGCLKFREQVAL			0x00EC
+#define CFGWIDEINLN				0x00F0
+#define CFGRXCDR8				0x00BA
+#define ENARXDIRECTCFG4				0x00F2
+#define CFGRXOVR8				0x00BD
+#define RXDIRECTCTRL2				0x00C7
+#define ENARXDIRECTCFG3				0x00F3
+#define RXCALCTRL				0x00B4
+#define ENARXDIRECTCFG2				0x00F4
+#define CFGRXOVR4				0x00E9
+#define RXSQCTRL				0x00B5
+#define CFGRXOVR6				0x00BF
+
+#define is_mphy_tx_attr(attr)			(attr < RX_MODE)
+#define RX_MIN_ACTIVATETIME_UNIT_US		100
+#define HIBERN8TIME_UNIT_US			100
+
+/*
+ * Common Block Attributes
+ */
+#define TX_GLOBALHIBERNATE			UNIPRO_CB_OFFSET(0x002B)
+#define REFCLKMODE				UNIPRO_CB_OFFSET(0x00BF)
+#define DIRECTCTRL19				UNIPRO_CB_OFFSET(0x00CD)
+#define DIRECTCTRL10				UNIPRO_CB_OFFSET(0x00E6)
+#define CDIRECTCTRL6				UNIPRO_CB_OFFSET(0x00EA)
+#define RTOBSERVESELECT				UNIPRO_CB_OFFSET(0x00F0)
+#define CBDIVFACTOR				UNIPRO_CB_OFFSET(0x00F1)
+#define CBDCOCTRL5				UNIPRO_CB_OFFSET(0x00F3)
+#define CBPRGPLL2				UNIPRO_CB_OFFSET(0x00F8)
+#define CBPRGTUNING				UNIPRO_CB_OFFSET(0x00FB)
+
+#define UNIPRO_CB_OFFSET(x)			(0x8000 | x)
+
+/*
+ * PHY Adpater attributes
+ */
+#define PA_ACTIVETXDATALANES	0x1560
+#define PA_ACTIVERXDATALANES	0x1580
+#define PA_TXTRAILINGCLOCKS	0x1564
+#define PA_PHY_TYPE		0x1500
+#define PA_AVAILTXDATALANES	0x1520
+#define PA_AVAILRXDATALANES	0x1540
+#define PA_MINRXTRAILINGCLOCKS	0x1543
+#define PA_TXPWRSTATUS		0x1567
+#define PA_RXPWRSTATUS		0x1582
+#define PA_TXFORCECLOCK		0x1562
+#define PA_TXPWRMODE		0x1563
+#define PA_LEGACYDPHYESCDL	0x1570
+#define PA_MAXTXSPEEDFAST	0x1521
+#define PA_MAXTXSPEEDSLOW	0x1522
+#define PA_MAXRXSPEEDFAST	0x1541
+#define PA_MAXRXSPEEDSLOW	0x1542
+#define PA_TXLINKSTARTUPHS	0x1544
+#define PA_LOCAL_TX_LCC_ENABLE	0x155E
+#define PA_TXSPEEDFAST		0x1565
+#define PA_TXSPEEDSLOW		0x1566
+#define PA_REMOTEVERINFO	0x15A0
+#define PA_TXGEAR		0x1568
+#define PA_TXTERMINATION	0x1569
+#define PA_HSSERIES		0x156A
+#define PA_PWRMODE		0x1571
+#define PA_RXGEAR		0x1583
+#define PA_RXTERMINATION	0x1584
+#define PA_MAXRXPWMGEAR		0x1586
+#define PA_MAXRXHSGEAR		0x1587
+#define PA_RXHSUNTERMCAP	0x15A5
+#define PA_RXLSTERMCAP		0x15A6
+#define PA_GRANULARITY		0x15AA
+#define PA_PACPREQTIMEOUT	0x1590
+#define PA_PACPREQEOBTIMEOUT	0x1591
+#define PA_HIBERN8TIME		0x15A7
+#define PA_LOCALVERINFO		0x15A9
+#define PA_TACTIVATE		0x15A8
+#define PA_PACPFRAMECOUNT	0x15C0
+#define PA_PACPERRORCOUNT	0x15C1
+#define PA_PHYTESTCONTROL	0x15C2
+#define PA_PWRMODEUSERDATA0	0x15B0
+#define PA_PWRMODEUSERDATA1	0x15B1
+#define PA_PWRMODEUSERDATA2	0x15B2
+#define PA_PWRMODEUSERDATA3	0x15B3
+#define PA_PWRMODEUSERDATA4	0x15B4
+#define PA_PWRMODEUSERDATA5	0x15B5
+#define PA_PWRMODEUSERDATA6	0x15B6
+#define PA_PWRMODEUSERDATA7	0x15B7
+#define PA_PWRMODEUSERDATA8	0x15B8
+#define PA_PWRMODEUSERDATA9	0x15B9
+#define PA_PWRMODEUSERDATA10	0x15BA
+#define PA_PWRMODEUSERDATA11	0x15BB
+#define PA_CONNECTEDTXDATALANES	0x1561
+#define PA_CONNECTEDRXDATALANES	0x1581
+#define PA_LOGICALLANEMAP	0x15A1
+#define PA_SLEEPNOCONFIGTIME	0x15A2
+#define PA_STALLNOCONFIGTIME	0x15A3
+#define PA_SAVECONFIGTIME	0x15A4
+
+#define PA_TACTIVATE_TIME_UNIT_US	10
+#define PA_HIBERN8_TIME_UNIT_US		100
+
+/*Other attributes*/
+#define VS_MPHYCFGUPDT		0xD085
+#define VS_DEBUGOMC		0xD09E
+#define VS_POWERSTATE		0xD083
+
+#define PA_GRANULARITY_MIN_VAL	1
+#define PA_GRANULARITY_MAX_VAL	6
+
+/* PHY Adapter Protocol Constants */
+#define PA_MAXDATALANES	4
+
+/* PA power modes */
+enum {
+	FAST_MODE	= 1,
+	SLOW_MODE	= 2,
+	FASTAUTO_MODE	= 4,
+	SLOWAUTO_MODE	= 5,
+	UNCHANGED	= 7,
+};
+
+/* PA TX/RX Frequency Series */
+enum {
+	PA_HS_MODE_A	= 1,
+	PA_HS_MODE_B	= 2,
+};
+
+enum ufs_pwm_gear_tag {
+	UFS_PWM_DONT_CHANGE,	/* Don't change Gear */
+	UFS_PWM_G1,		/* PWM Gear 1 (default for reset) */
+	UFS_PWM_G2,		/* PWM Gear 2 */
+	UFS_PWM_G3,		/* PWM Gear 3 */
+	UFS_PWM_G4,		/* PWM Gear 4 */
+	UFS_PWM_G5,		/* PWM Gear 5 */
+	UFS_PWM_G6,		/* PWM Gear 6 */
+	UFS_PWM_G7,		/* PWM Gear 7 */
+};
+
+enum ufs_hs_gear_tag {
+	UFS_HS_DONT_CHANGE,	/* Don't change Gear */
+	UFS_HS_G1,		/* HS Gear 1 (default for reset) */
+	UFS_HS_G2,		/* HS Gear 2 */
+	UFS_HS_G3,		/* HS Gear 3 */
+};
+
+enum ufs_unipro_ver {
+	UFS_UNIPRO_VER_RESERVED = 0,
+	UFS_UNIPRO_VER_1_40 = 1, /* UniPro version 1.40 */
+	UFS_UNIPRO_VER_1_41 = 2, /* UniPro version 1.41 */
+	UFS_UNIPRO_VER_1_6 = 3,  /* UniPro version 1.6 */
+	UFS_UNIPRO_VER_MAX = 4,  /* UniPro unsupported version */
+	/* UniPro version field mask in PA_LOCALVERINFO */
+	UFS_UNIPRO_VER_MASK = 0xF,
+};
+
+/*
+ * Data Link Layer Attributes
+ */
+#define DL_TC0TXFCTHRESHOLD	0x2040
+#define DL_FC0PROTTIMEOUTVAL	0x2041
+#define DL_TC0REPLAYTIMEOUTVAL	0x2042
+#define DL_AFC0REQTIMEOUTVAL	0x2043
+#define DL_AFC0CREDITTHRESHOLD	0x2044
+#define DL_TC0OUTACKTHRESHOLD	0x2045
+#define DL_TC1TXFCTHRESHOLD	0x2060
+#define DL_FC1PROTTIMEOUTVAL	0x2061
+#define DL_TC1REPLAYTIMEOUTVAL	0x2062
+#define DL_AFC1REQTIMEOUTVAL	0x2063
+#define DL_AFC1CREDITTHRESHOLD	0x2064
+#define DL_TC1OUTACKTHRESHOLD	0x2065
+#define DL_TXPREEMPTIONCAP	0x2000
+#define DL_TC0TXMAXSDUSIZE	0x2001
+#define DL_TC0RXINITCREDITVAL	0x2002
+#define DL_TC0TXBUFFERSIZE	0x2005
+#define DL_PEERTC0PRESENT	0x2046
+#define DL_PEERTC0RXINITCREVAL	0x2047
+#define DL_TC1TXMAXSDUSIZE	0x2003
+#define DL_TC1RXINITCREDITVAL	0x2004
+#define DL_TC1TXBUFFERSIZE	0x2006
+#define DL_PEERTC1PRESENT	0x2066
+#define DL_PEERTC1RXINITCREVAL	0x2067
+
+/*
+ * Network Layer Attributes
+ */
+#define N_DEVICEID		0x3000
+#define N_DEVICEID_VALID	0x3001
+#define N_TC0TXMAXSDUSIZE	0x3020
+#define N_TC1TXMAXSDUSIZE	0x3021
+
+/*
+ * Transport Layer Attributes
+ */
+#define T_NUMCPORTS		0x4000
+#define T_NUMTESTFEATURES	0x4001
+#define T_CONNECTIONSTATE	0x4020
+#define T_PEERDEVICEID		0x4021
+#define T_PEERCPORTID		0x4022
+#define T_TRAFFICCLASS		0x4023
+#define T_PROTOCOLID		0x4024
+#define T_CPORTFLAGS		0x4025
+#define T_TXTOKENVALUE		0x4026
+#define T_RXTOKENVALUE		0x4027
+#define T_LOCALBUFFERSPACE	0x4028
+#define T_PEERBUFFERSPACE	0x4029
+#define T_CREDITSTOSEND		0x402A
+#define T_CPORTMODE		0x402B
+#define T_TC0TXMAXSDUSIZE	0x4060
+#define T_TC1TXMAXSDUSIZE	0x4061
+
+#ifdef FALSE
+#undef FALSE
+#endif
+
+#ifdef TRUE
+#undef TRUE
+#endif
+
+/* Boolean attribute values */
+enum {
+	FALSE = 0,
+	TRUE,
+};
+
+#endif /* _UNIPRO_H_ */
diff --git a/u-boot/drivers/usb/dwc3/gadget.c b/u-boot/drivers/usb/dwc3/gadget.c
index 0923409..1f8d464 100644
--- a/u-boot/drivers/usb/dwc3/gadget.c
+++ b/u-boot/drivers/usb/dwc3/gadget.c
@@ -2482,7 +2482,6 @@
 	while (left > 0) {
 		union dwc3_event event;
 
-		invalidate_dcache_range((uintptr_t)evt->buf, evt->length);
 		event.raw = *(u32 *) (evt->buf + evt->lpos);
 
 		dwc3_process_event_entry(dwc, &event);
@@ -2538,6 +2537,7 @@
 	u32 reg;
 
 	evt = dwc->ev_buffs[buf];
+	dwc3_invalidate_cache((uintptr_t)evt->buf, evt->length);
 
 	count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(buf));
 	count &= DWC3_GEVNTCOUNT_MASK;
diff --git a/u-boot/drivers/usb/dwc3/io.h b/u-boot/drivers/usb/dwc3/io.h
index 810980f..d59f8be 100644
--- a/u-boot/drivers/usb/dwc3/io.h
+++ b/u-boot/drivers/usb/dwc3/io.h
@@ -48,6 +48,11 @@
 	writel(value, base + offs);
 }
 
+static inline void dwc3_invalidate_cache(uintptr_t addr, int length)
+{
+	invalidate_dcache_range(addr, addr + ROUND(length, CACHELINE_SIZE));
+}
+
 static inline void dwc3_flush_cache(uintptr_t addr, int length)
 {
 	flush_dcache_range(addr, addr + ROUND(length, CACHELINE_SIZE));
diff --git a/u-boot/drivers/video/Kconfig b/u-boot/drivers/video/Kconfig
index 27cb8ef..55a27e6 100644
--- a/u-boot/drivers/video/Kconfig
+++ b/u-boot/drivers/video/Kconfig
@@ -14,6 +14,21 @@
 	  option compiles in the video uclass and routes all LCD/video access
 	  through this.
 
+config SPL_DM_VIDEO
+	bool "Enable driver model support for LCD/video in SPL"
+	depends on DM_VIDEO && SPL
+	help
+	  This enables driver model for LCD and video devices in SPL. These support
+	  a bitmap display of various sizes and depths which can be drawn on
+	  to display a command-line console or splash screen. Enabling this
+	  option compiles in the video uclass and routes all LCD/video access
+	  through this.
+
+config SPL_VIDEO_BUF
+	hex "SPL video memory buffer for any use"
+	depends on SPL_DM_VIDEO
+	default 0xa200000
+
 config BACKLIGHT_PWM
 	bool "Generic PWM based Backlight Driver"
 	depends on DM_VIDEO && DM_PWM
@@ -390,6 +405,12 @@
 	help
 	   This enables library for accessing EDID data from an LCD panel.
 
+config SPL_I2C_EDID
+	bool "Enable EDID library in SPL"
+	depends on DM_I2C && SPL_DM_VIDEO
+	help
+	  This enables library in SPL for accessing EDID data from an LCD panel.
+
 config DISPLAY
 	bool "Enable Display support"
 	depends on DM
diff --git a/u-boot/drivers/video/Makefile b/u-boot/drivers/video/Makefile
index 60ffa66..6ce2537 100644
--- a/u-boot/drivers/video/Makefile
+++ b/u-boot/drivers/video/Makefile
@@ -5,6 +5,7 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
+ifndef CONFIG_SPL_BUILD
 ifdef CONFIG_DM
 obj-$(CONFIG_DISPLAY) += display-uclass.o
 obj-$(CONFIG_DM_VIDEO) += backlight-uclass.o
@@ -56,8 +57,11 @@
 obj-${CONFIG_VIDEO_TEGRA124} += tegra124/
 obj-${CONFIG_EXYNOS_FB} += exynos/
 obj-${CONFIG_VIDEO_ROCKCHIP} += rockchip/
-obj-${CONFIG_DRM_ROCKCHIP} += drm/
 obj-${CONFIG_ROCKCHIP_EINK} += rk_eink/
 
 obj-y += bridge/
 obj-y += sunxi/
+endif
+
+obj-${CONFIG_DRM_ROCKCHIP} += drm/
+
diff --git a/u-boot/drivers/video/drm/Kconfig b/u-boot/drivers/video/drm/Kconfig
index cb070f1..cc27f66 100644
--- a/u-boot/drivers/video/drm/Kconfig
+++ b/u-boot/drivers/video/drm/Kconfig
@@ -28,15 +28,6 @@
 	help
 	  Driver for Maxim MAX96745 GMSL2 Serializer with eDP1.4a/DP1.4 Input.
 
-config DRM_MAXIM_MAX96752F
-	bool "Maxim max96752F GMSL2 Deserializer"
-	depends on DRM_ROCKCHIP
-	select I2C_MUX_MAX96752F
-	select PINCTRL_MAX96752F
-	select GPIO_MAX96752F
-	help
-	  Driver for Maxim MAX96752F GMSL2 Deserializer with Dual LVDS Output.
-
 config DRM_MAXIM_MAX96755F
 	bool "Maxim max96755F GMSL2 Serializer"
 	depends on DRM_ROCKCHIP
@@ -45,11 +36,19 @@
 	help
 	  Driver for Maxim MAX96755F GMSL2 Serializer with MIPI-DSI Input.
 
-config DRM_PANEL_MAXIM_DESERIALIZER
-	bool "Maxim deserializer panel driver"
+config DRM_PANEL_ROHM_BU18RL82
+	bool "Rohm BU18RL82-based panels"
 	depends on DRM_ROCKCHIP
 	help
-	  Driver for Maxim deserializer panels.
+	  Say Y if you want to enable support for panels based on the
+	  Rohm BU18RL82.
+
+config DRM_PANEL_MAXIM_MAX96752F
+	bool "Maxim MAX96752F-based panels"
+	depends on DRM_ROCKCHIP
+	help
+	  Say Y if you want to enable support for panels based on the
+	  Maxim MAX96752F.
 
 config DRM_ROCKCHIP_PANEL
 	bool "Rockchip Panel Support"
@@ -216,13 +215,12 @@
 	  Support for Rockchip HDMI/DP Combo PHY HDMI with Samsung
 	  IP block.
 
-config ROCKCHIP_DRM_TVE
+config DRM_ROCKCHIP_TVE
 	bool "Rockchip TVE Support"
 	depends on DRM_ROCKCHIP
 	help
 	  Choose this option to enable support for Rockchip TVE.
-	  Rockchip rk322x and rk322xh SoC has TVE can be used, and
-	  say Y to enable TVE driver.
+	  Say Y to enable TVE driver.
 
 config ROCKCHIP_CUBIC_LUT_SIZE
 	int "Rockchip cubic lut size"
diff --git a/u-boot/drivers/video/drm/Makefile b/u-boot/drivers/video/drm/Makefile
index d5ceeb3..4c28ee1 100644
--- a/u-boot/drivers/video/drm/Makefile
+++ b/u-boot/drivers/video/drm/Makefile
@@ -6,17 +6,18 @@
 
 obj-y += drm_modes.o
 
-obj-y += rockchip_display.o rockchip_crtc.o rockchip_phy.o rockchip_bridge.o \
+ifndef CONFIG_SPL_BUILD
+obj-y += rockchip_display.o rockchip_display_helper.o rockchip_crtc.o rockchip_phy.o rockchip_bridge.o \
 		rockchip_vop.o rockchip_vop_reg.o rockchip_vop2.o bmp_helper.o \
-		rockchip_connector.o
+		rockchip_connector.o rockchip_post_csc.o
 
 obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o
 obj-$(CONFIG_DRM_DP_HELPER) += drm_dp_helper.o
 obj-$(CONFIG_DRM_DSC) += drm_dsc.o
 obj-$(CONFIG_DRM_MAXIM_MAX96745) += max96745.o
-obj-$(CONFIG_DRM_MAXIM_MAX96752F) += max96752f.o
 obj-$(CONFIG_DRM_MAXIM_MAX96755F) += max96755f.o
-obj-$(CONFIG_DRM_PANEL_MAXIM_DESERIALIZER) += panel-maxim-deserializer.o
+obj-$(CONFIG_DRM_PANEL_ROHM_BU18RL82) += panel-rohm-bu18rl82.o
+obj-$(CONFIG_DRM_PANEL_MAXIM_MAX96752F) += panel-maxim-max96752f.o
 obj-$(CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI) += dw_mipi_dsi.o
 obj-$(CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI2) += dw_mipi_dsi2.o
 obj-$(CONFIG_DRM_ROCKCHIP_DW_HDMI) += rockchip_dw_hdmi.o dw_hdmi.o
@@ -27,7 +28,7 @@
 obj-$(CONFIG_DRM_ROCKCHIP_INNO_VIDEO_PHY) += inno_video_phy.o
 obj-$(CONFIG_DRM_ROCKCHIP_INNO_VIDEO_COMBO_PHY) += inno_video_combo_phy.o
 obj-$(CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX_HDMI) += phy-rockchip-samsung-hdptx-hdmi.o
-obj-$(CONFIG_ROCKCHIP_DRM_TVE) += rockchip_drm_tve.o
+obj-$(CONFIG_DRM_ROCKCHIP_TVE) += rockchip_tve.o
 obj-$(CONFIG_DRM_ROCKCHIP_ANALOGIX_DP) += analogix_dp.o analogix_dp_reg.o
 obj-$(CONFIG_DRM_ROCKCHIP_DW_DP) += dw-dp.o
 obj-$(CONFIG_DRM_ROCKCHIP_LVDS) += rockchip_lvds.o
@@ -37,3 +38,7 @@
 obj-$(CONFIG_DRM_ROCKCHIP_RK618) += rk618.o rk618_lvds.o rk618_dsi.o
 obj-$(CONFIG_DRM_ROCKCHIP_RK1000) += rk1000.o rk1000_tve.o
 obj-$(CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY) += samsung_mipi_dcphy.o
+else
+obj-y += rockchip_spl_display.o rockchip_display_helper.o rockchip_crtc.o rockchip_connector.o rockchip_post_csc.o rockchip_vop2.o rockchip_phy.o rockchip-inno-hdmi-phy.o rockchip_dw_hdmi.o dw_hdmi.o
+endif
+
diff --git a/u-boot/drivers/video/drm/analogix_dp.c b/u-boot/drivers/video/drm/analogix_dp.c
index 52d5bf1..70cd620 100644
--- a/u-boot/drivers/video/drm/analogix_dp.c
+++ b/u-boot/drivers/video/drm/analogix_dp.c
@@ -943,6 +943,37 @@
 	.detect = analogix_dp_connector_detect,
 };
 
+static u32 analogix_dp_parse_link_frequencies(struct analogix_dp_device *dp)
+{
+	struct udevice *dev = dp->dev;
+	const struct device_node *endpoint;
+	u64 frequency = 0;
+
+	endpoint = rockchip_of_graph_get_endpoint_by_regs(dev->node, 1, 0);
+	if (!endpoint)
+		return 0;
+
+	if (of_property_read_u64(endpoint, "link-frequencies", &frequency) < 0)
+		return 0;
+
+	if (!frequency)
+		return 0;
+
+	do_div(frequency, 10 * 1000);	/* symbol rate kbytes */
+
+	switch (frequency) {
+	case 162000:
+	case 270000:
+	case 540000:
+		break;
+	default:
+		dev_err(dev, "invalid link frequency value: %llu\n", frequency);
+		return 0;
+	}
+
+	return frequency;
+}
+
 static int analogix_dp_parse_dt(struct analogix_dp_device *dp)
 {
 	struct udevice *dev = dp->dev;
@@ -956,21 +987,9 @@
 	dp->video_info.force_stream_valid =
 		dev_read_bool(dev, "analogix,force-stream-valid");
 
-	max_link_rate = dev_read_u32_default(dev, "max-link-rate", 0);
-	if (max_link_rate) {
-		switch (max_link_rate) {
-		case 1620:
-		case 2700:
-		case 5400:
-			dp->video_info.max_link_rate =
-				min_t(u8, dp->video_info.max_link_rate,
-				      drm_dp_link_rate_to_bw_code(max_link_rate * 100));
-			break;
-		default:
-			dev_err(dev, "invalid max-link-rate %d\n", max_link_rate);
-			break;
-		}
-	}
+	max_link_rate = analogix_dp_parse_link_frequencies(dp);
+	if (max_link_rate && max_link_rate < drm_dp_bw_code_to_link_rate(dp->video_info.max_link_rate))
+		dp->video_info.max_link_rate = drm_dp_link_rate_to_bw_code(max_link_rate);
 
 	if (dev_read_prop(dev, "data-lanes", &len)) {
 		num_lanes = len / sizeof(u32);
@@ -1075,8 +1094,9 @@
 	.lcdsel_big = 0 | BIT(21),
 	.lcdsel_lit = BIT(5) | BIT(21),
 	.chip_type = RK3399_EDP,
+	.ssc = true,
 
-	.max_link_rate = DP_LINK_BW_2_7,
+	.max_link_rate = DP_LINK_BW_5_4,
 	.max_lane_count = 4,
 };
 
diff --git a/u-boot/drivers/video/drm/drm_modes.c b/u-boot/drivers/video/drm/drm_modes.c
index fabae87..2c35919 100644
--- a/u-boot/drivers/video/drm/drm_modes.c
+++ b/u-boot/drivers/video/drm/drm_modes.c
@@ -60,6 +60,19 @@
 }
 
 /**
+ * drm_mode_copy - copy the mode
+ * @dst: mode to overwrite
+ * @src: mode to copy
+ *
+ * Copy an existing mode into another mode, preserving the object id and
+ * list head of the destination mode.
+ */
+void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src)
+{
+	*dst = *src;
+}
+
+/**
  * drm_mode_destroy - remove a mode
  * @mode: mode to remove
  */
@@ -185,6 +198,45 @@
 }
 
 /**
+ * drm_display_mode_from_videomode - fill in @dmode using @vm,
+ * @vm: videomode structure to use as source
+ * @dmode: drm_display_mode structure to use as destination
+ *
+ * Fills out @dmode using the display mode specified in @vm.
+ */
+void drm_display_mode_from_videomode(const struct videomode *vm,
+				     struct drm_display_mode *dmode)
+{
+	dmode->hdisplay = vm->hactive;
+	dmode->hsync_start = dmode->hdisplay + vm->hfront_porch;
+	dmode->hsync_end = dmode->hsync_start + vm->hsync_len;
+	dmode->htotal = dmode->hsync_end + vm->hback_porch;
+
+	dmode->vdisplay = vm->vactive;
+	dmode->vsync_start = dmode->vdisplay + vm->vfront_porch;
+	dmode->vsync_end = dmode->vsync_start + vm->vsync_len;
+	dmode->vtotal = dmode->vsync_end + vm->vback_porch;
+
+	dmode->clock = vm->pixelclock / 1000;
+
+	dmode->flags = 0;
+	if (vm->flags & DISPLAY_FLAGS_HSYNC_HIGH)
+		dmode->flags |= DRM_MODE_FLAG_PHSYNC;
+	else if (vm->flags & DISPLAY_FLAGS_HSYNC_LOW)
+		dmode->flags |= DRM_MODE_FLAG_NHSYNC;
+	if (vm->flags & DISPLAY_FLAGS_VSYNC_HIGH)
+		dmode->flags |= DRM_MODE_FLAG_PVSYNC;
+	else if (vm->flags & DISPLAY_FLAGS_VSYNC_LOW)
+		dmode->flags |= DRM_MODE_FLAG_NVSYNC;
+	if (vm->flags & DISPLAY_FLAGS_INTERLACED)
+		dmode->flags |= DRM_MODE_FLAG_INTERLACE;
+	if (vm->flags & DISPLAY_FLAGS_DOUBLESCAN)
+		dmode->flags |= DRM_MODE_FLAG_DBLSCAN;
+	if (vm->flags & DISPLAY_FLAGS_DOUBLECLK)
+		dmode->flags |= DRM_MODE_FLAG_DBLCLK;
+}
+
+/**
  * drm_display_mode_to_videomode - fill in @vm using @dmode,
  * @dmode: drm_display_mode structure to use as source
  * @vm: videomode structure to use as destination
diff --git a/u-boot/drivers/video/drm/dw-dp.c b/u-boot/drivers/video/drm/dw-dp.c
index e6e5b0b..2af2f82 100644
--- a/u-boot/drivers/video/drm/dw-dp.c
+++ b/u-boot/drivers/video/drm/dw-dp.c
@@ -231,6 +231,7 @@
 
 	bool force_hpd;
 	bool force_output;
+	u32 max_link_rate;
 };
 
 enum {
@@ -562,7 +563,7 @@
 		!!(dpcd & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED);
 
 	link->revision = link->dpcd[DP_DPCD_REV];
-	link->rate = min_t(u32, dp->phy.attrs.max_link_rate * 100,
+	link->rate = min_t(u32, min(dp->max_link_rate, dp->phy.attrs.max_link_rate * 100),
 			   drm_dp_max_link_rate(link->dpcd));
 	link->lanes = min_t(u8, dp->phy.attrs.bus_width,
 			    drm_dp_max_lane_count(link->dpcd));
@@ -1704,6 +1705,49 @@
 	return 0;
 }
 
+static u32 dw_dp_parse_link_frequencies(struct dw_dp *dp)
+{
+	struct udevice *dev = dp->dev;
+	const struct device_node *endpoint;
+	u64 frequency = 0;
+
+	endpoint = rockchip_of_graph_get_endpoint_by_regs(dev->node, 1, 0);
+	if (!endpoint)
+		return 0;
+
+	if (of_property_read_u64(endpoint, "link-frequencies", &frequency) < 0)
+		return 0;
+
+	if (!frequency)
+		return 0;
+
+	do_div(frequency, 10 * 1000);	/* symbol rate kbytes */
+
+	switch (frequency) {
+	case 162000:
+	case 270000:
+	case 540000:
+	case 810000:
+		break;
+	default:
+		dev_err(dev, "invalid link frequency value: %llu\n", frequency);
+		return 0;
+	}
+
+	return frequency;
+}
+
+static int dw_dp_parse_dt(struct dw_dp *dp)
+{
+	dp->force_hpd = dev_read_bool(dp->dev, "force-hpd");
+
+	dp->max_link_rate = dw_dp_parse_link_frequencies(dp);
+	if (!dp->max_link_rate)
+		dp->max_link_rate = 810000;
+
+	return 0;
+}
+
 static int dw_dp_probe(struct udevice *dev)
 {
 	struct dw_dp *dp = dev_get_priv(dev);
@@ -1723,8 +1767,6 @@
 		return ret;
 	}
 
-	dp->force_hpd = dev_read_bool(dev, "force-hpd");
-
 	ret = gpio_request_by_name(dev, "hpd-gpios", 0, &dp->hpd_gpio,
 				   GPIOD_IS_IN);
 	if (ret && ret != -ENOENT) {
@@ -1736,6 +1778,12 @@
 
 	dp->dev = dev;
 
+	ret = dw_dp_parse_dt(dp);
+	if (ret) {
+		dev_err(dev, "failed to parse DT\n");
+		return ret;
+	}
+
 	dw_dp_ddc_init(dp);
 
 	rockchip_connector_bind(&dp->connector, dev, dp->id, &dw_dp_connector_funcs, NULL,
diff --git a/u-boot/drivers/video/drm/dw_hdmi.c b/u-boot/drivers/video/drm/dw_hdmi.c
index f993a21..a30e4d5 100644
--- a/u-boot/drivers/video/drm/dw_hdmi.c
+++ b/u-boot/drivers/video/drm/dw_hdmi.c
@@ -7,6 +7,7 @@
 #include <common.h>
 #include <malloc.h>
 #include <syscon.h>
+#include <asm/gpio.h>
 #include <asm/arch-rockchip/clock.h>
 #include <asm/arch/vendor.h>
 #include <edid.h>
@@ -27,6 +28,7 @@
 #define HDCP_PRIVATE_KEY_SIZE   280
 #define HDCP_KEY_SHA_SIZE       20
 #define HDMI_HDCP1X_ID		5
+#define HDMI_EDID_BLOCK_LEN	128
 /*
  * Unless otherwise noted, entries in this table are 100% optimization.
  * Values can be obtained from hdmi_compute_n() but that function is
@@ -181,6 +183,7 @@
 	bool sink_has_audio;
 	void *regs;
 	void *grf;
+	void *gpio_base;
 	struct dw_hdmi_i2c *i2c;
 
 	struct {
@@ -203,6 +206,8 @@
 
 	bool hdcp1x_enable;
 	bool output_bus_format_rgb;
+
+	struct gpio_desc hpd_gpiod;
 };
 
 static void dw_hdmi_writel(struct dw_hdmi *hdmi, u8 val, int offset)
@@ -409,6 +414,7 @@
 {
 	struct dw_hdmi_i2c *i2c = hdmi->i2c;
 	int interrupt = 0, i = 20;
+	bool read_edid = false;
 
 	if (!i2c->is_regaddr) {
 		printf("set read register address to 0\n");
@@ -416,14 +422,36 @@
 		i2c->is_regaddr = true;
 	}
 
-	while (length--) {
-		hdmi_writeb(hdmi, i2c->slave_reg++, HDMI_I2CM_ADDRESS);
-		if (i2c->is_segment)
-			hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ_EXT,
-				    HDMI_I2CM_OPERATION);
-		else
-			hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ,
-				    HDMI_I2CM_OPERATION);
+	/* edid reads are in 128 bytes. scdc reads are in 1 byte */
+	if (length == HDMI_EDID_BLOCK_LEN)
+		read_edid = true;
+
+	while (length > 0) {
+		hdmi_writeb(hdmi, i2c->slave_reg, HDMI_I2CM_ADDRESS);
+
+		if (read_edid) {
+			i2c->slave_reg += 8;
+			length -= 8;
+		} else {
+			i2c->slave_reg++;
+			length--;
+		}
+
+		if (i2c->is_segment) {
+			if (read_edid)
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ8_EXT,
+					    HDMI_I2CM_OPERATION);
+			else
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ_EXT,
+					    HDMI_I2CM_OPERATION);
+		} else {
+			if (read_edid)
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ8,
+					    HDMI_I2CM_OPERATION);
+			else
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ,
+					    HDMI_I2CM_OPERATION);
+		}
 
 		while (i--) {
 			udelay(1000);
@@ -439,6 +467,10 @@
 		if (!interrupt) {
 			printf("[%s] i2c read reg[0x%02x] no interrupt\n",
 			       __func__, i2c->slave_reg);
+			hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+			hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+				    HDMI_I2CM_OPERATION);
+			udelay(1000);
 			return -EAGAIN;
 		}
 
@@ -446,11 +478,19 @@
 		if (interrupt & HDMI_IH_I2CM_STAT0_ERROR) {
 			printf("[%s] read reg[0x%02x] data error:0x%02x\n",
 			       __func__, i2c->slave_reg, interrupt);
+			hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+			hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+				    HDMI_I2CM_OPERATION);
+			udelay(1000);
 			return -EIO;
 		}
 
 		i = 20;
-		*buf++ = hdmi_readb(hdmi, HDMI_I2CM_DATAI);
+		if (read_edid)
+			for (i = 0; i < 8; i++)
+				*buf++ = hdmi_readb(hdmi, HDMI_I2CM_READ_BUFF0 + i);
+		else
+			*buf++ = hdmi_readb(hdmi, HDMI_I2CM_DATAI);
 	}
 	i2c->is_segment = false;
 
@@ -490,8 +530,22 @@
 				break;
 		}
 
+		if (!interrupt) {
+			printf("[%s] i2c write reg[0x%02x] no interrupt\n",
+			       __func__, i2c->slave_reg);
+			hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+			hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+				    HDMI_I2CM_OPERATION);
+			udelay(1000);
+			return -EAGAIN;
+		}
+
 		if ((interrupt & m_I2CM_ERROR) || (i == -1)) {
 			printf("[%s] write data error\n", __func__);
+			hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+			hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+				    HDMI_I2CM_OPERATION);
+			udelay(1000);
 			return -EIO;
 		} else if (interrupt & m_I2CM_DONE) {
 			printf("[%s] write offset %02x success\n",
@@ -959,6 +1013,7 @@
 	 * but it has a vedor phy.
 	 */
 	if (phy_type == DW_HDMI_PHY_VENDOR_PHY ||
+	    hdmi->dev_type == RK3528_HDMI ||
 	    hdmi->dev_type == RK3328_HDMI ||
 	    hdmi->dev_type == RK3228_HDMI) {
 		/* Vendor PHYs require support from the glue layer. */
@@ -1042,14 +1097,11 @@
 	       vmode->mpixelclock, vmode->mtmdsclock);
 
 	/* Set up HDMI_FC_INVIDCONF
-	 * fc_invidconf.HDCP_keepout must be set (1'b1)
-	 * when activate the scrambler feature.
+	 * Some display equipments require that the interval
+	 * between Video Data and Data island must be at least 58 pixels,
+	 * and fc_invidconf.HDCP_keepout set (1'b1) can meet the requirement.
 	 */
-	inv_val = (vmode->mtmdsclock > 340000000 ||
-		   (hdmi_info->scdc.scrambling.low_rates &&
-		   hdmi->scramble_low_rates) ?
-		   HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE :
-		   HDMI_FC_INVIDCONF_HDCP_KEEPOUT_INACTIVE);
+	inv_val = HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE;
 
 	inv_val |= mode->flags & DRM_MODE_FLAG_PVSYNC ?
 		HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_HIGH :
@@ -1418,13 +1470,8 @@
 		  HDMI_VP_CONF_PR_EN_MASK |
 		  HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);
 
-	if ((color_depth == 5 && hdmi->previous_mode.htotal % 4) ||
-	    (color_depth == 6 && hdmi->previous_mode.htotal % 2))
-		hdmi_modb(hdmi, 0, HDMI_VP_STUFF_IDEFAULT_PHASE_MASK,
-			  HDMI_VP_STUFF);
-	else
-		hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET,
-			  HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF);
+	hdmi_modb(hdmi, 0, HDMI_VP_STUFF_IDEFAULT_PHASE_MASK,
+		  HDMI_VP_STUFF);
 
 	hdmi_writeb(hdmi, remap_size, HDMI_VP_REMAP);
 
@@ -1887,6 +1934,7 @@
 				 hdmi->sample_rate);
 }
 
+#ifndef CONFIG_SPL_BUILD
 static int dw_hdmi_hdcp_load_key(struct dw_hdmi *hdmi)
 {
 	int i, j, ret, val;
@@ -1952,6 +2000,7 @@
 	free(hdcp_keys);
 	return 0;
 }
+#endif
 
 static void hdmi_tx_hdcp_config(struct dw_hdmi *hdmi,
 				const struct drm_display_mode *mode)
@@ -1981,8 +2030,10 @@
 	hdmi_modb(hdmi, hdmi_dvi, HDMI_A_HDCPCFG0_HDMIDVI_MASK,
 		  HDMI_A_HDCPCFG0);
 
+#ifndef CONFIG_SPL_BUILD
 	if (!(hdmi_readb(hdmi, HDMI_HDCPREG_RMSTS) & 0x3f))
 		dw_hdmi_hdcp_load_key(hdmi);
+#endif
 
 	hdmi_modb(hdmi, HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE,
 		  HDMI_FC_INVIDCONF_HDCP_KEEPOUT_MASK,
@@ -2269,13 +2320,18 @@
 {
 	struct connector_state *conn_state = &state->conn_state;
 	const struct dw_hdmi_plat_data *pdata =
+#ifdef CONFIG_SPL_BUILD
+		(const struct dw_hdmi_plat_data *)conn->data;
+#else
 		(const struct dw_hdmi_plat_data *)dev_get_driver_data(conn->dev);
+	ofnode hdmi_node = conn->dev->node;
+	struct device_node *ddc_node;
+	int ret;
+#endif
 	struct crtc_state *crtc_state = &state->crtc_state;
 	struct dw_hdmi *hdmi;
 	struct drm_display_mode *mode_buf;
-	ofnode hdmi_node = conn->dev->node;
 	u32 val;
-	struct device_node *ddc_node;
 
 	hdmi = malloc(sizeof(struct dw_hdmi));
 	if (!hdmi)
@@ -2285,13 +2341,28 @@
 	mode_buf = malloc(MODE_LEN * sizeof(struct drm_display_mode));
 	if (!mode_buf)
 		return -ENOMEM;
+
+#ifdef CONFIG_SPL_BUILD
+	hdmi->id = 0;
+	hdmi->regs = (void *)RK3528_HDMI_BASE;
+	hdmi->io_width = 4;
+	hdmi->scramble_low_rates = false;
+	hdmi->hdcp1x_enable = false;
+	hdmi->output_bus_format_rgb = false;
+	conn_state->type = DRM_MODE_CONNECTOR_HDMIA;
+#else
 	hdmi->id = of_alias_get_id(ofnode_to_np(hdmi_node), "hdmi");
 	if (hdmi->id < 0)
 		hdmi->id = 0;
-	conn_state->disp_info  = rockchip_get_disp_info(conn_state->type, hdmi->id);
+	conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id);
+#endif
 
 	memset(mode_buf, 0, MODE_LEN * sizeof(struct drm_display_mode));
 
+	hdmi->dev_type = pdata->dev_type;
+	hdmi->plat_data = pdata;
+
+#ifndef CONFIG_SPL_BUILD
 	hdmi->regs = dev_read_addr_ptr(conn->dev);
 	hdmi->io_width = ofnode_read_s32_default(hdmi_node, "reg-io-width", -1);
 
@@ -2309,6 +2380,24 @@
 	else
 		hdmi->output_bus_format_rgb = false;
 
+	ret = dev_read_size(conn->dev, "rockchip,phy-table");
+	if (ret > 0 && hdmi->plat_data->phy_config) {
+		u32 phy_config[ret / 4];
+		int i;
+
+		dev_read_u32_array(conn->dev, "rockchip,phy-table", phy_config, ret / 4);
+
+		for (i = 0; i < ret / 16; i++) {
+			if (phy_config[i * 4] != 0)
+				hdmi->plat_data->phy_config[i].mpixelclock = (u64)phy_config[i * 4];
+			else
+				hdmi->plat_data->phy_config[i].mpixelclock = ~0UL;
+			hdmi->plat_data->phy_config[i].sym_ctr = (u16)phy_config[i * 4 + 1];
+			hdmi->plat_data->phy_config[i].term = (u16)phy_config[i * 4 + 2];
+			hdmi->plat_data->phy_config[i].vlev_ctr = (u16)phy_config[i * 4 + 3];
+		}
+	}
+
 	ddc_node = of_parse_phandle(ofnode_to_np(hdmi_node), "ddc-i2c-bus", 0);
 	if (ddc_node) {
 		uclass_get_device_by_ofnode(UCLASS_I2C, np_to_ofnode(ddc_node),
@@ -2316,6 +2405,7 @@
 		if (hdmi->adap.i2c_bus)
 			hdmi->adap.ops = i2c_get_ops(hdmi->adap.i2c_bus);
 	}
+#endif
 
 	hdmi->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
 	if (hdmi->grf <= 0) {
@@ -2323,6 +2413,20 @@
 		       __func__, hdmi->grf);
 		return -ENXIO;
 	}
+
+#ifdef CONFIG_SPL_BUILD
+	hdmi->gpio_base = (void *)RK3528_GPIO_BASE;
+#else
+	ret = gpio_request_by_name(conn->dev, "hpd-gpios", 0,
+				   &hdmi->hpd_gpiod, GPIOD_IS_IN);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get HPD GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+	hdmi->gpio_base = (void *)dev_read_addr_index(conn->dev, 1);
+#endif
+	if (!hdmi->gpio_base)
+		return -ENODEV;
 
 	dw_hdmi_set_reg_wr(hdmi);
 
@@ -2345,24 +2449,28 @@
 	 * Read high and low time from device tree. If not available use
 	 * the default timing scl clock rate is about 99.6KHz.
 	 */
+#ifdef CONFIG_SPL_BUILD
+	hdmi->i2c->scl_high_ns = 9625;
+	hdmi->i2c->scl_low_ns = 10000;
+#else
 	hdmi->i2c->scl_high_ns =
 		ofnode_read_s32_default(hdmi_node,
 					"ddc-i2c-scl-high-time-ns", 4708);
 	hdmi->i2c->scl_low_ns =
 		ofnode_read_s32_default(hdmi_node,
 					"ddc-i2c-scl-low-time-ns", 4916);
+#endif
 
 	dw_hdmi_i2c_init(hdmi);
 	conn_state->output_if |= VOP_OUTPUT_IF_HDMI0;
 	conn_state->output_mode = ROCKCHIP_OUT_MODE_AAAA;
 
-	hdmi->dev_type = pdata->dev_type;
-	hdmi->plat_data = pdata;
 	hdmi->edid_data.mode_buf = mode_buf;
 	hdmi->sample_rate = 48000;
 
 	conn->data = hdmi;
-	dw_hdmi_set_iomux(hdmi->grf, hdmi->dev_type);
+	dw_hdmi_set_iomux(hdmi->grf, hdmi->gpio_base,
+			  &hdmi->hpd_gpiod, hdmi->dev_type);
 	dw_hdmi_detect_phy(hdmi);
 	dw_hdmi_dev_init(hdmi);
 
@@ -2413,7 +2521,7 @@
 
 int rockchip_dw_hdmi_get_timing(struct rockchip_connector *conn, struct display_state *state)
 {
-	int ret, i;
+	int ret, i, vic;
 	struct connector_state *conn_state = &state->conn_state;
 	struct drm_display_mode *mode = &conn_state->mode;
 	struct dw_hdmi *hdmi = conn->data;
@@ -2439,9 +2547,13 @@
 		hdmi->sink_has_audio = true;
 		do_cea_modes(&hdmi->edid_data, def_modes_vic,
 			     sizeof(def_modes_vic));
+		hdmi->edid_data.mode_buf[0].type |= DRM_MODE_TYPE_PREFERRED;
 		hdmi->edid_data.preferred_mode = &hdmi->edid_data.mode_buf[0];
 		printf("failed to get edid\n");
 	}
+#ifdef CONFIG_SPL_BUILD
+	conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id);
+#endif
 	drm_rk_filter_whitelist(&hdmi->edid_data);
 	if (hdmi->phy.ops->mode_valid)
 		hdmi->phy.ops->mode_valid(conn, hdmi, state);
@@ -2452,9 +2564,20 @@
 		return -EINVAL;
 	}
 
-	for (i = 0; i < hdmi->edid_data.modes; i++)
+	for (i = 0; i < hdmi->edid_data.modes; i++) {
 		hdmi->edid_data.mode_buf[i].vrefresh =
 			drm_mode_vrefresh(&hdmi->edid_data.mode_buf[i]);
+
+		vic = drm_match_cea_mode(&hdmi->edid_data.mode_buf[i]);
+		if (hdmi->edid_data.mode_buf[i].picture_aspect_ratio == HDMI_PICTURE_ASPECT_NONE) {
+			if (vic >= 93 && vic <= 95)
+				hdmi->edid_data.mode_buf[i].picture_aspect_ratio =
+					HDMI_PICTURE_ASPECT_16_9;
+			else if (vic == 98)
+				hdmi->edid_data.mode_buf[i].picture_aspect_ratio =
+					HDMI_PICTURE_ASPECT_256_135;
+		}
+	}
 
 	drm_mode_sort(&hdmi->edid_data);
 	drm_rk_selete_output(&hdmi->edid_data, conn_state, &bus_format,
@@ -2463,7 +2586,6 @@
 	*mode = *hdmi->edid_data.preferred_mode;
 	hdmi->vic = drm_match_cea_mode(mode);
 
-	printf("mode:%dx%d\n", mode->hdisplay, mode->vdisplay);
 	if (state->force_output)
 		bus_format = state->force_bus_format;
 	conn_state->bus_format = bus_format;
diff --git a/u-boot/drivers/video/drm/dw_hdmi.h b/u-boot/drivers/video/drm/dw_hdmi.h
index f002dea..3872dae 100644
--- a/u-boot/drivers/video/drm/dw_hdmi.h
+++ b/u-boot/drivers/video/drm/dw_hdmi.h
@@ -1194,6 +1194,7 @@
 	HDMI_A_VIDPOLCFG_HSYNCPOL_ACTIVE_LOW = 0x0,
 
 /* I2CM_OPERATION field values */
+	HDMI_I2CM_OPERATION_BUS_CLEAR = 0x20,
 	HDMI_I2CM_OPERATION_WRITE = 0x10,
 	HDMI_I2CM_OPERATION_READ8_EXT = 0x8,
 	HDMI_I2CM_OPERATION_READ8 = 0x4,
@@ -1411,6 +1412,7 @@
 			  enum dw_hdmi_devtype dev_type,
 			  bool output_bus_format_rgb);
 void inno_dw_hdmi_set_domain(void *grf, int status);
-void dw_hdmi_set_iomux(void *grf, int dev_type);
+void dw_hdmi_set_iomux(void *grf, void *gpio_base, struct gpio_desc *hpd_gpiod,
+		       int dev_type);
 
 #endif /* _ROCKCHIP_HDMI_H_ */
diff --git a/u-boot/drivers/video/drm/dw_hdmi_qp.c b/u-boot/drivers/video/drm/dw_hdmi_qp.c
index 7a8b54f..0e28702 100644
--- a/u-boot/drivers/video/drm/dw_hdmi_qp.c
+++ b/u-boot/drivers/video/drm/dw_hdmi_qp.c
@@ -175,6 +175,9 @@
 	case MEDIA_BUS_FMT_UYVY8_1X16:
 	case MEDIA_BUS_FMT_UYVY10_1X20:
 	case MEDIA_BUS_FMT_UYVY12_1X24:
+	case MEDIA_BUS_FMT_YUYV8_1X16:
+	case MEDIA_BUS_FMT_YUYV10_1X20:
+	case MEDIA_BUS_FMT_YUYV12_1X24:
 		return true;
 
 	default:
@@ -1047,6 +1050,9 @@
 	/* HDMI Initialization Step B.2 */
 	hdmi->phy.ops->set_pll(conn, hdmi->rk_hdmi, state);
 
+	/* Mark yuv422 10bit */
+	if (hdmi->hdmi_data.enc_out_bus_format == MEDIA_BUS_FMT_YUYV10_1X20)
+		hdmi_writel(hdmi, BIT(20), VIDEO_INTERFACE_CONFIG0);
 	rk3588_set_grf_cfg(hdmi->rk_hdmi);
 	link_cfg = dw_hdmi_rockchip_get_link_cfg(hdmi->rk_hdmi);
 
@@ -1094,6 +1100,9 @@
 		hdmi->phy.enabled = true;
 		printf("%s DVI mode\n", __func__);
 	}
+
+	/* Mark uboot hdmi is enabled */
+	hdmi_writel(hdmi, BIT(21), VIDEO_INTERFACE_CONFIG0);
 
 	return 0;
 }
@@ -1239,9 +1248,23 @@
 	return 0;
 }
 
-int rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, struct display_state *state)
+static void rockchip_dw_hdmi_qp_mode_valid(struct dw_hdmi_qp *hdmi)
 {
-	int ret, i;
+	struct hdmi_edid_data *edid_data = &hdmi->edid_data;
+	int i;
+
+	for (i = 0; i < edid_data->modes; i++) {
+		if (edid_data->mode_buf[i].invalid)
+			continue;
+		if (edid_data->mode_buf[i].clock <= 25000)
+			edid_data->mode_buf[i].invalid = true;
+	}
+}
+
+static int _rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn,
+					   struct display_state *state, int edid_status)
+{
+	int i;
 	struct connector_state *conn_state = &state->conn_state;
 	struct drm_display_mode *mode = &conn_state->mode;
 	struct dw_hdmi_qp *hdmi = conn->data;
@@ -1254,14 +1277,13 @@
 	if (!hdmi)
 		return -EFAULT;
 
-	ret = drm_do_get_edid(&hdmi->adap, conn_state->edid);
-	if (!ret) {
+	if (!edid_status) {
 		hdmi->sink_is_hdmi =
 			drm_detect_hdmi_monitor(edid);
 		hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
-		ret = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid);
+		edid_status = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid);
 	}
-	if (ret < 0) {
+	if (edid_status < 0) {
 		hdmi->sink_is_hdmi = true;
 		hdmi->sink_has_audio = true;
 		do_cea_modes(&hdmi->edid_data, def_modes_vic,
@@ -1270,8 +1292,7 @@
 		printf("failed to get edid\n");
 	}
 	drm_rk_filter_whitelist(&hdmi->edid_data);
-	if (hdmi->phy.ops->mode_valid)
-		hdmi->phy.ops->mode_valid(hdmi->rk_hdmi, state);
+	rockchip_dw_hdmi_qp_mode_valid(hdmi);
 	drm_mode_max_resolution_filter(&hdmi->edid_data,
 				       &state->crtc_state.max_output);
 	if (!drm_mode_prune_invalid(&hdmi->edid_data)) {
@@ -1298,15 +1319,17 @@
 	hdmi->hdmi_data.enc_out_bus_format = bus_format;
 
 	switch (bus_format) {
-	case MEDIA_BUS_FMT_UYVY10_1X20:
-		conn_state->bus_format = MEDIA_BUS_FMT_YUV10_1X30;
+	case MEDIA_BUS_FMT_YUYV10_1X20:
+		conn_state->bus_format = MEDIA_BUS_FMT_YUYV10_1X20;
 		hdmi->hdmi_data.enc_in_bus_format =
-			MEDIA_BUS_FMT_YUV10_1X30;
+			MEDIA_BUS_FMT_YUYV10_1X20;
+		conn_state->output_mode = ROCKCHIP_OUT_MODE_YUV422;
 		break;
-	case MEDIA_BUS_FMT_UYVY8_1X16:
-		conn_state->bus_format = MEDIA_BUS_FMT_YUV8_1X24;
+	case MEDIA_BUS_FMT_YUYV8_1X16:
+		conn_state->bus_format = MEDIA_BUS_FMT_YUYV8_1X16;
 		hdmi->hdmi_data.enc_in_bus_format =
-			MEDIA_BUS_FMT_YUV8_1X24;
+			MEDIA_BUS_FMT_YUYV8_1X16;
+		conn_state->output_mode = ROCKCHIP_OUT_MODE_YUV422;
 		break;
 	case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
 	case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
@@ -1334,6 +1357,21 @@
 	return 0;
 }
 
+int rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, struct display_state *state)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct dw_hdmi_qp *hdmi = conn->data;
+	int ret;
+
+	ret = drm_do_get_edid(&hdmi->adap, conn_state->edid);
+
+	if (conn_state->secondary)
+		_rockchip_dw_hdmi_qp_get_timing(conn_state->secondary, state, ret);
+
+	return _rockchip_dw_hdmi_qp_get_timing(conn, state, ret);
+}
+
+
 int rockchip_dw_hdmi_qp_detect(struct rockchip_connector *conn, struct display_state *state)
 {
 	int ret;
diff --git a/u-boot/drivers/video/drm/dw_mipi_dsi.c b/u-boot/drivers/video/drm/dw_mipi_dsi.c
index 2a490d1..bf337f7 100644
--- a/u-boot/drivers/video/drm/dw_mipi_dsi.c
+++ b/u-boot/drivers/video/drm/dw_mipi_dsi.c
@@ -1489,6 +1489,21 @@
 	.max_bit_rate_per_lane = 1500000000UL,
 };
 
+static const u32 rk3562_dsi_grf_reg_fields[MAX_FIELDS] = {
+	[DPIUPDATECFG]		= GRF_REG_FIELD(0x05d0,  2,  2),
+	[DPICOLORM]		= GRF_REG_FIELD(0x05d0,  1,  1),
+	[DPISHUTDN]		= GRF_REG_FIELD(0x05d0,  0,  0),
+	[SKEWCALHS]		= GRF_REG_FIELD(0x05d4, 11, 15),
+	[FORCETXSTOPMODE]	= GRF_REG_FIELD(0x05d4,  4,  7),
+	[TURNDISABLE]		= GRF_REG_FIELD(0x05d4,  2,  2),
+	[FORCERXMODE]		= GRF_REG_FIELD(0x05d4,  0,  0),
+};
+
+static const struct dw_mipi_dsi_plat_data rk3562_mipi_dsi_plat_data = {
+	.dsi0_grf_reg_fields = rk3562_dsi_grf_reg_fields,
+	.max_bit_rate_per_lane = 1200000000UL,
+};
+
 static const u32 rk3568_dsi0_grf_reg_fields[MAX_FIELDS] = {
 	[DPIUPDATECFG]		= GRF_REG_FIELD(0x0360,  2,  2),
 	[DPICOLORM]		= GRF_REG_FIELD(0x0360,  1,  1),
@@ -1573,6 +1588,10 @@
 		.data = (ulong)&rk3399_mipi_dsi_plat_data,
 	},
 	{
+		.compatible = "rockchip,rk3562-mipi-dsi",
+		.data = (ulong)&rk3562_mipi_dsi_plat_data,
+	},
+	{
 		.compatible = "rockchip,rk3568-mipi-dsi",
 		.data = (ulong)&rk3568_mipi_dsi_plat_data,
 	},
diff --git a/u-boot/drivers/video/drm/dw_mipi_dsi2.c b/u-boot/drivers/video/drm/dw_mipi_dsi2.c
index 1ee8652..42f3314 100644
--- a/u-boot/drivers/video/drm/dw_mipi_dsi2.c
+++ b/u-boot/drivers/video/drm/dw_mipi_dsi2.c
@@ -12,6 +12,7 @@
 #include <common.h>
 #include <errno.h>
 #include <asm/unaligned.h>
+#include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/hardware.h>
 #include <dm/device.h>
@@ -22,7 +23,6 @@
 #include <asm/arch-rockchip/clock.h>
 #include <linux/iopoll.h>
 
-#include "rockchip_bridge.h"
 #include "rockchip_display.h"
 #include "rockchip_crtc.h"
 #include "rockchip_connector.h"
@@ -289,6 +289,7 @@
 	struct drm_display_mode mode;
 	bool data_swap;
 
+	struct gpio_desc te_gpio;
 	struct mipi_dsi_device *device;
 	struct mipi_dphy_configure mipi_dphy_cfg;
 	const struct dw_mipi_dsi2_plat_data *pdata;
@@ -693,42 +694,79 @@
 static int dw_mipi_dsi2_connector_pre_init(struct rockchip_connector *conn,
 					   struct display_state *state)
 {
+	struct connector_state *conn_state = &state->conn_state;
 	struct dw_mipi_dsi2 *dsi2 = dev_get_priv(conn->dev);
 	struct mipi_dsi_host *host = dev_get_platdata(dsi2->dev);
 	struct mipi_dsi_device *device;
 	char name[20];
-	struct udevice *dev;
 
-	device = calloc(1, sizeof(struct dw_mipi_dsi2));
-	if (!device)
-		return -ENOMEM;
+	conn_state->type = DRM_MODE_CONNECTOR_DSI;
 
-	if (conn->bridge)
-		dev = conn->bridge->dev;
-	else if (conn->panel)
-		dev = conn->panel->dev;
-	else
-		return -ENODEV;
+	if (conn->bridge) {
+		device = dev_get_platdata(conn->bridge->dev);
+		if (!device)
+			return -ENODEV;
 
-	device->dev = dev;
-	device->host = host;
-	device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
-	device->channel = dev_read_u32_default(dev, "reg", 0);
-	device->format = dev_read_u32_default(dev, "dsi,format",
-					      MIPI_DSI_FMT_RGB888);
-	device->mode_flags = dev_read_u32_default(dev, "dsi,flags",
-						  MIPI_DSI_MODE_VIDEO |
-						  MIPI_DSI_MODE_VIDEO_BURST |
-						  MIPI_DSI_MODE_VIDEO_HBP |
-						  MIPI_DSI_MODE_LPM |
-						  MIPI_DSI_MODE_EOT_PACKET);
+		device->host = host;
+		sprintf(name, "%s.%d", host->dev->name, device->channel);
+		device_set_name(conn->bridge->dev, name);
+		mipi_dsi_attach(device);
+	}
 
-	sprintf(name, "%s.%d", host->dev->name, device->channel);
-	device_set_name(dev, name);
-	dsi2->device = device;
-	dev->parent_platdata = device;
+	return 0;
+}
 
-	mipi_dsi_attach(dsi2->device);
+static int dw_mipi_dsi2_get_dsc_params_from_sink(struct dw_mipi_dsi2 *dsi2)
+{
+	struct udevice *dev = dsi2->device->dev;
+	struct rockchip_cmd_header *header;
+	struct drm_dsc_picture_parameter_set *pps = NULL;
+	u8 *dsc_packed_pps;
+	const void *data;
+	int len;
+
+	dsi2->c_option = dev_read_bool(dev, "phy-c-option");
+	dsi2->scrambling_en = dev_read_bool(dev, "scrambling-enable");
+	dsi2->dsc_enable = dev_read_bool(dev, "compressed-data");
+
+	if (dsi2->slave) {
+		dsi2->slave->c_option = dsi2->c_option;
+		dsi2->slave->scrambling_en = dsi2->scrambling_en;
+		dsi2->slave->dsc_enable = dsi2->dsc_enable;
+	}
+
+	dsi2->slice_width = dev_read_u32_default(dev, "slice-width", 0);
+	dsi2->slice_height = dev_read_u32_default(dev, "slice-height", 0);
+	dsi2->version_major = dev_read_u32_default(dev, "version-major", 0);
+	dsi2->version_minor = dev_read_u32_default(dev, "version-minor", 0);
+
+	data = dev_read_prop(dev, "panel-init-sequence", &len);
+	if (!data)
+		return -EINVAL;
+
+	while (len > sizeof(*header)) {
+		header = (struct rockchip_cmd_header *)data;
+		data += sizeof(*header);
+		len -= sizeof(*header);
+
+		if (header->payload_length > len)
+			return -EINVAL;
+
+		if (header->data_type == MIPI_DSI_PICTURE_PARAMETER_SET) {
+			dsc_packed_pps = calloc(1, header->payload_length);
+			if (!dsc_packed_pps)
+				return -ENOMEM;
+
+			memcpy(dsc_packed_pps, data, header->payload_length);
+			pps = (struct drm_dsc_picture_parameter_set *)dsc_packed_pps;
+			break;
+		}
+
+		data += header->payload_length;
+		len -= header->payload_length;
+	}
+
+	dsi2->pps = pps;
 
 	return 0;
 }
@@ -792,6 +830,13 @@
 		dsi2->slave->dcphy.phy = phy;
 		if (phy->funcs && phy->funcs->init)
 			return phy->funcs->init(phy);
+	}
+
+	dw_mipi_dsi2_get_dsc_params_from_sink(dsi2);
+
+	if (dm_gpio_is_valid(&dsi2->te_gpio)) {
+		cstate->soft_te = true;
+		conn_state->te_gpio = &dsi2->te_gpio;
 	}
 
 	if (dsi2->dsc_enable) {
@@ -905,7 +950,7 @@
 
 static void dw_mipi_dsi2_phy_clk_mode_cfg(struct dw_mipi_dsi2 *dsi2)
 {
-	u32 sys_clk = SYS_CLK / MSEC_PER_SEC;
+	u32 sys_clk = SYS_CLK / USEC_PER_SEC;
 	u32 esc_clk_div;
 	u32 val = 0;
 
@@ -913,7 +958,7 @@
 		val |= NON_CONTINUOUS_CLK;
 
 	/* The Escape clock ranges from 1MHz to 20MHz. */
-	esc_clk_div = DIV_ROUND_UP(sys_clk, 10 * 2);
+	esc_clk_div = DIV_ROUND_UP(sys_clk, 20 * 2);
 	val |= PHY_LPTX_CLK_DIV(esc_clk_div);
 
 	dsi_write(dsi2, DSI2_PHY_CLK_CFG, val);
@@ -1102,6 +1147,41 @@
 	return 0;
 }
 
+static int dw_mipi_dsi2_connector_mode_valid(struct rockchip_connector *conn,
+					     struct display_state *state)
+{
+	struct dw_mipi_dsi2 *dsi2 = dev_get_priv(conn->dev);
+	struct connector_state *conn_state = &state->conn_state;
+	u8 min_pixels = dsi2->slave ? 8 : 4;
+	struct videomode vm;
+
+	drm_display_mode_to_videomode(&conn_state->mode, &vm);
+
+	/*
+	 * the minimum region size (HSA,HBP,HACT,HFP) is 4 pixels
+	 * which is the ip known issues and limitations.
+	 */
+	if (!(vm.hsync_len < min_pixels || vm.hback_porch < min_pixels ||
+	    vm.hfront_porch < min_pixels || vm.hactive < min_pixels))
+		return MODE_OK;
+
+	if (vm.hsync_len < min_pixels)
+		vm.hsync_len = min_pixels;
+
+	if (vm.hback_porch < min_pixels)
+		vm.hback_porch = min_pixels;
+
+	if (vm.hfront_porch < min_pixels)
+		vm.hfront_porch = min_pixels;
+
+	if (vm.hactive < min_pixels)
+		vm.hactive = min_pixels;
+
+	drm_display_mode_from_videomode(&vm, &conn_state->mode);
+
+	return MODE_OK;
+}
+
 static const struct rockchip_connector_funcs dw_mipi_dsi2_connector_funcs = {
 	.pre_init = dw_mipi_dsi2_connector_pre_init,
 	.init = dw_mipi_dsi2_connector_init,
@@ -1109,6 +1189,7 @@
 	.unprepare = dw_mipi_dsi2_connector_unprepare,
 	.enable = dw_mipi_dsi2_connector_enable,
 	.disable = dw_mipi_dsi2_connector_disable,
+	.mode_valid = dw_mipi_dsi2_connector_mode_valid,
 };
 
 static int dw_mipi_dsi2_probe(struct udevice *dev)
@@ -1132,6 +1213,13 @@
 	id = of_alias_get_id(ofnode_to_np(dev->node), "dsi");
 	if (id < 0)
 		id = 0;
+
+	ret = gpio_request_by_name(dev, "te-gpios", 0,
+				   &dsi2->te_gpio, GPIOD_IS_IN);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get TE GPIO: %d\n", __func__, ret);
+		return ret;
+	}
 
 	dsi2->dev = dev;
 	dsi2->pdata = pdata;
@@ -1185,61 +1273,6 @@
 	return dw_mipi_dsi2_transfer(dsi2, msg);
 }
 
-static int dw_mipi_dsi2_get_dsc_params_from_sink(struct dw_mipi_dsi2 *dsi2)
-{
-	struct udevice *dev = dsi2->device->dev;
-	struct rockchip_cmd_header *header;
-	struct drm_dsc_picture_parameter_set *pps = NULL;
-	u8 *dsc_packed_pps;
-	const void *data;
-	int len;
-
-	dsi2->c_option = dev_read_bool(dev, "phy-c-option");
-	dsi2->scrambling_en = dev_read_bool(dev, "scrambling-enable");
-	dsi2->dsc_enable = dev_read_bool(dev, "compressed-data");
-
-	if (dsi2->slave) {
-		dsi2->slave->c_option = dsi2->c_option;
-		dsi2->slave->scrambling_en = dsi2->scrambling_en;
-		dsi2->slave->dsc_enable = dsi2->dsc_enable;
-	}
-
-	dsi2->slice_width = dev_read_u32_default(dev, "slice-width", 0);
-	dsi2->slice_height = dev_read_u32_default(dev, "slice-height", 0);
-	dsi2->version_major = dev_read_u32_default(dev, "version-major", 0);
-	dsi2->version_minor = dev_read_u32_default(dev, "version-minor", 0);
-
-	data = dev_read_prop(dev, "panel-init-sequence", &len);
-	if (!data)
-		return -EINVAL;
-
-	while (len > sizeof(*header)) {
-		header = (struct rockchip_cmd_header *)data;
-		data += sizeof(*header);
-		len -= sizeof(*header);
-
-		if (header->payload_length > len)
-			return -EINVAL;
-
-		if (header->data_type == MIPI_DSI_PICTURE_PARAMETER_SET) {
-			dsc_packed_pps = calloc(1, header->payload_length);
-			if (!dsc_packed_pps)
-				return -ENOMEM;
-
-			memcpy(dsc_packed_pps, data, header->payload_length);
-			pps = (struct drm_dsc_picture_parameter_set *)dsc_packed_pps;
-			break;
-		}
-
-		data += header->payload_length;
-		len -= header->payload_length;
-	}
-
-	dsi2->pps = pps;
-
-	return 0;
-}
-
 static int dw_mipi_dsi2_host_attach(struct mipi_dsi_host *host,
 				   struct mipi_dsi_device *device)
 {
@@ -1252,8 +1285,7 @@
 	dsi2->channel = device->channel;
 	dsi2->format = device->format;
 	dsi2->mode_flags = device->mode_flags;
-
-	dw_mipi_dsi2_get_dsc_params_from_sink(dsi2);
+	dsi2->device = device;
 
 	return 0;
 }
@@ -1273,6 +1305,45 @@
 	return dm_scan_fdt_dev(dev);
 }
 
+static int dw_mipi_dsi2_child_post_bind(struct udevice *dev)
+{
+	struct mipi_dsi_host *host = dev_get_platdata(dev->parent);
+	struct mipi_dsi_device *device = dev_get_parent_platdata(dev);
+	char name[20];
+
+	sprintf(name, "%s.%d", host->dev->name, device->channel);
+	device_set_name(dev, name);
+
+	device->dev = dev;
+	device->host = host;
+	device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
+	device->format = dev_read_u32_default(dev, "dsi,format",
+					      MIPI_DSI_FMT_RGB888);
+	device->mode_flags = dev_read_u32_default(dev, "dsi,flags",
+						  MIPI_DSI_MODE_VIDEO |
+						  MIPI_DSI_MODE_VIDEO_BURST |
+						  MIPI_DSI_MODE_VIDEO_HBP |
+						  MIPI_DSI_MODE_LPM |
+						  MIPI_DSI_MODE_EOT_PACKET);
+	device->channel = dev_read_u32_default(dev, "reg", 0);
+
+	return 0;
+}
+
+static int dw_mipi_dsi2_child_pre_probe(struct udevice *dev)
+{
+	struct mipi_dsi_device *device = dev_get_parent_platdata(dev);
+	int ret;
+
+	ret = mipi_dsi_attach(device);
+	if (ret) {
+		dev_err(dev, "mipi_dsi_attach() failed: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
 U_BOOT_DRIVER(dw_mipi_dsi2) = {
 	.name = "dw_mipi_dsi2",
 	.id = UCLASS_DISPLAY,
@@ -1280,5 +1351,8 @@
 	.probe = dw_mipi_dsi2_probe,
 	.bind = dw_mipi_dsi2_bind,
 	.priv_auto_alloc_size = sizeof(struct dw_mipi_dsi2),
+	.per_child_platdata_auto_alloc_size = sizeof(struct mipi_dsi_device),
 	.platdata_auto_alloc_size = sizeof(struct mipi_dsi_host),
+	.child_post_bind = dw_mipi_dsi2_child_post_bind,
+	.child_pre_probe = dw_mipi_dsi2_child_pre_probe,
 };
diff --git a/u-boot/drivers/video/drm/max96745.c b/u-boot/drivers/video/drm/max96745.c
index c824e01..3750f4d 100644
--- a/u-boot/drivers/video/drm/max96745.c
+++ b/u-boot/drivers/video/drm/max96745.c
@@ -9,41 +9,111 @@
 #include <i2c.h>
 #include <max96745.h>
 #include <video_bridge.h>
+#include <linux/iopoll.h>
 
 #include "rockchip_bridge.h"
 #include "rockchip_display.h"
 #include "rockchip_panel.h"
 
-struct max96745_bridge_priv {
-	struct gpio_desc lock_gpio;
-};
-
-static bool max96745_bridge_detect(struct rockchip_bridge *bridge)
+static bool max96745_bridge_link_locked(struct udevice *dev)
 {
-	struct max96745_bridge_priv *priv = dev_get_priv(bridge->dev);
+	int ret;
 
-	if (!dm_gpio_get_value(&priv->lock_gpio))
+	ret = dm_i2c_reg_read(dev->parent, 0x002a);
+	if (ret < 0)
+		return false;
+
+	if (!FIELD_GET(LINK_LOCKED, ret))
 		return false;
 
 	return true;
 }
 
+static bool max96745_bridge_detect(struct rockchip_bridge *bridge)
+{
+	return max96745_bridge_link_locked(bridge->dev);
+}
+
+static void max96745_bridge_enable(struct rockchip_bridge *bridge)
+{
+	struct udevice *dev = bridge->dev;
+	struct drm_display_mode *mode = &bridge->state->conn_state.mode;
+	u8 cxtp, tx_rate;
+	int ret;
+
+	ret = dm_i2c_reg_read(dev->parent, 0x0011);
+	if (ret < 0)
+		return;
+
+	cxtp = FIELD_GET(CXTP_A, ret);
+
+	ret = dm_i2c_reg_read(dev->parent, 0x0028);
+	if (ret < 0)
+		return;
+
+	tx_rate = FIELD_GET(TX_RATE, ret);
+
+	if (!cxtp && mode->clock > 95000 && tx_rate == 1) {
+		ret = dm_i2c_reg_clrset(dev->parent, 0x0028, TX_RATE,
+					FIELD_PREP(TX_RATE, 2));
+		if (ret < 0)
+			return;
+
+		ret = dm_i2c_reg_clrset(dev->parent, 0x0029, RESET_ONESHOT,
+					FIELD_PREP(RESET_ONESHOT, 1));
+		if (ret < 0)
+			return;
+
+		if (readx_poll_timeout(max96745_bridge_link_locked, dev, ret,
+				       ret, 200000))
+			dev_err(dev, "%s: GMSL link not locked\n", __func__);
+	}
+}
+
+static void max96745_bridge_post_disable(struct rockchip_bridge *bridge)
+{
+	struct udevice *dev = bridge->dev;
+	u8 cxtp, tx_rate;
+	int ret;
+
+	ret = dm_i2c_reg_read(dev->parent, 0x0011);
+	if (ret < 0)
+		return;
+
+	cxtp = FIELD_GET(CXTP_A, ret);
+
+	ret = dm_i2c_reg_read(dev->parent, 0x0028);
+	if (ret < 0)
+		return;
+
+	tx_rate = FIELD_GET(TX_RATE, ret);
+
+	if (!cxtp && tx_rate == 2) {
+		ret = dm_i2c_reg_clrset(dev->parent, 0x0028, TX_RATE,
+					FIELD_PREP(TX_RATE, 1));
+		if (ret < 0)
+			return;
+
+		ret = dm_i2c_reg_clrset(dev->parent, 0x0029, RESET_ONESHOT,
+					FIELD_PREP(RESET_ONESHOT, 1));
+		if (ret < 0)
+			return;
+
+		if (readx_poll_timeout(max96745_bridge_link_locked, dev, ret,
+				       ret, 200000))
+			dev_err(dev, "%s: GMSL link not locked\n", __func__);
+	}
+}
+
 static const struct rockchip_bridge_funcs max96745_bridge_funcs = {
-	.detect = max96745_bridge_detect,
+	.detect		= max96745_bridge_detect,
+	.enable		= max96745_bridge_enable,
+	.post_disable	= max96745_bridge_post_disable,
 };
 
 static int max96745_bridge_probe(struct udevice *dev)
 {
-	struct max96745_bridge_priv *priv = dev_get_priv(dev);
 	struct rockchip_bridge *bridge;
-	int ret;
-
-	ret = gpio_request_by_name(dev, "lock-gpios", 0, &priv->lock_gpio,
-				   GPIOD_IS_IN);
-	if (ret) {
-		dev_err(dev, "failed to get lock GPIO: %d\n", ret);
-		return ret;
-	}
 
 	bridge = calloc(1, sizeof(*bridge));
 	if (!bridge)
@@ -66,5 +136,4 @@
 	.id = UCLASS_VIDEO_BRIDGE,
 	.of_match = max96745_bridge_of_match,
 	.probe = max96745_bridge_probe,
-	.priv_auto_alloc_size = sizeof(struct max96745_bridge_priv),
 };
diff --git a/u-boot/drivers/video/drm/max96752f.c b/u-boot/drivers/video/drm/max96752f.c
deleted file mode 100644
index e7553d1..0000000
--- a/u-boot/drivers/video/drm/max96752f.c
+++ /dev/null
@@ -1,79 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2022 Rockchip Electronics Co., Ltd
- */
-
-#include <common.h>
-#include <dm.h>
-#include <errno.h>
-#include <i2c.h>
-#include <linux/media-bus-format.h>
-#include <max96752f.h>
-#include <video_bridge.h>
-
-#include "rockchip_bridge.h"
-#include "rockchip_display.h"
-#include "rockchip_panel.h"
-
-static void max96752f_bridge_pre_enable(struct rockchip_bridge *bridge)
-{
-	struct udevice *dev = bridge->dev;
-	struct connector_state *conn_state = &bridge->state->conn_state;
-	bool oldi_format, oldi_4th_lane;
-
-	max96752f_init(dev->parent);
-
-	switch (conn_state->bus_format) {
-	case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
-		oldi_4th_lane = false;
-		oldi_format = 0x0;
-		break;
-	case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
-		oldi_4th_lane = true;
-		oldi_format = 0x0;
-		break;
-	case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
-		oldi_4th_lane = false;
-		oldi_format = 0x1;
-		break;
-	default:
-		oldi_4th_lane = false;
-		oldi_format = 0x1;
-		break;
-	}
-
-	dm_i2c_reg_clrset(dev->parent, 0x01ce, OLDI_FORMAT | OLDI_4TH_LANE,
-			  FIELD_PREP(OLDI_4TH_LANE, oldi_4th_lane) |
-			  FIELD_PREP(OLDI_FORMAT, oldi_format));
-}
-
-static const struct rockchip_bridge_funcs max96752f_bridge_funcs = {
-	.pre_enable = max96752f_bridge_pre_enable,
-};
-
-static int max96752f_bridge_probe(struct udevice *dev)
-{
-	struct rockchip_bridge *bridge;
-
-	bridge = calloc(1, sizeof(*bridge));
-	if (!bridge)
-		return -ENOMEM;
-
-	dev->driver_data = (ulong)bridge;
-	bridge->dev = dev;
-	bridge->funcs = &max96752f_bridge_funcs;
-
-	return 0;
-}
-
-static const struct udevice_id max96752f_bridge_of_match[] = {
-	{ .compatible = "maxim,max96752f-bridge", },
-	{ }
-};
-
-U_BOOT_DRIVER(max96752f_bridge) = {
-	.name = "max96752f_bridge",
-	.id = UCLASS_VIDEO_BRIDGE,
-	.of_match = max96752f_bridge_of_match,
-	.probe = max96752f_bridge_probe,
-};
diff --git a/u-boot/drivers/video/drm/max96755f.c b/u-boot/drivers/video/drm/max96755f.c
index e09849f..1e0ec08 100644
--- a/u-boot/drivers/video/drm/max96755f.c
+++ b/u-boot/drivers/video/drm/max96755f.c
@@ -9,6 +9,7 @@
 #include <i2c.h>
 #include <max96755f.h>
 #include <video_bridge.h>
+#include <drm/drm_mipi_dsi.h>
 #include <dm/of_access.h>
 #include <linux/media-bus-format.h>
 
@@ -21,9 +22,18 @@
 	struct drm_display_mode *mode = &priv->mode;
 	u32 hfp, hsa, hbp, hact;
 	u32 vact, vsa, vfp, vbp;
+	u8 lane_map;
 
 	dm_i2c_reg_clrset(priv->dev, 0x0331, NUM_LANES,
 			  FIELD_PREP(NUM_LANES, priv->num_lanes - 1));
+
+	lane_map = (priv->dsi_lane_map[0] & 0xff) << 4 |
+		   (priv->dsi_lane_map[1] & 0xff) << 6 |
+		   (priv->dsi_lane_map[2] & 0xff) << 0 |
+		   (priv->dsi_lane_map[3] & 0xff) << 2;
+
+	dm_i2c_reg_write(priv->dev, 0x0332, lane_map);
+
 	if (!priv->dpi_deskew_en)
 		return;
 
@@ -148,11 +158,26 @@
 	.detect = max96755f_bridge_detect,
 };
 
+static int max96755f_bridge_bind(struct udevice *dev)
+{
+	struct mipi_dsi_device *device = dev_get_platdata(dev);
+
+	device->dev = dev;
+	device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
+	device->format = dev_read_u32_default(dev, "dsi,format",
+					      MIPI_DSI_FMT_RGB888);
+	device->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
+	device->channel = dev_read_u32_default(dev, "reg", 0);
+
+	return 0;
+}
+
 static int max96755f_bridge_probe(struct udevice *dev)
 {
 	struct rockchip_bridge *bridge;
 	struct max96755f_priv *priv = dev_get_priv(dev->parent);
-	int ret;
+	const struct device_node *np = ofnode_to_np(dev->node);
+	int i, len, ret;
 
 	bridge = calloc(1, sizeof(*bridge));
 	if (!bridge)
@@ -165,6 +190,24 @@
 	priv->num_lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
 	priv->dv_swp_ab = dev_read_bool(dev, "vd-swap-ab");
 	priv->dpi_deskew_en = dev_read_bool(dev, "dpi-deskew-en");
+
+	for ( i = 0; i < priv->num_lanes; i++)
+		priv->dsi_lane_map[i] = i;
+
+	if (of_find_property(np, "maxim,dsi-lane-map", &len)) {
+		len /= sizeof(u32);
+		if (priv->num_lanes != len) {
+			printf("invalid number of lane map\n");
+			return -EINVAL;
+		}
+	}
+
+	ret = of_read_u32_array(np, "maxim,dsi-lane-map",
+				priv->dsi_lane_map, priv->num_lanes);
+	if (ret) {
+		printf("get dsi lane map failed\n");
+		return -EINVAL;
+	}
 
 	ret = gpio_request_by_name(dev, "lock-gpios", 0, &priv->lock_gpio,
 				   GPIOD_IS_IN);
@@ -186,4 +229,6 @@
 	.id = UCLASS_VIDEO_BRIDGE,
 	.of_match = max96755f_bridge_of_match,
 	.probe = max96755f_bridge_probe,
+	.bind = max96755f_bridge_bind,
+	.platdata_auto_alloc_size = sizeof(struct mipi_dsi_device),
 };
diff --git a/u-boot/drivers/video/drm/panel-maxim-deserializer.c b/u-boot/drivers/video/drm/panel-maxim-deserializer.c
deleted file mode 100644
index 583f6a4..0000000
--- a/u-boot/drivers/video/drm/panel-maxim-deserializer.c
+++ /dev/null
@@ -1,300 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2022 Rockchip Electronics Co., Ltd
- */
-
-#include <config.h>
-#include <common.h>
-#include <backlight.h>
-#include <errno.h>
-#include <malloc.h>
-#include <video.h>
-
-#include <asm/gpio.h>
-#include <dm/device.h>
-#include <dm/read.h>
-#include <dm/pinctrl.h>
-#include <dm/uclass-id.h>
-#include <linux/media-bus-format.h>
-
-#include "rockchip_display.h"
-#include "rockchip_panel.h"
-
-struct maxim_deserializer_panel;
-
-struct maxim_deserializer_panel_desc {
-	const char *name;
-	u16 id;
-	struct drm_display_mode mode;
-	u32 width_mm;
-	u32 height_mm;
-
-	struct {
-		const char *name;
-		u8 addr;
-		u8 dev_id;
-	} deserializer;
-
-	void (*prepare)(struct maxim_deserializer_panel *p);
-	void (*unprepare)(struct maxim_deserializer_panel *p);
-	void (*enable)(struct maxim_deserializer_panel *p);
-	void (*disable)(struct maxim_deserializer_panel *p);
-};
-
-struct maxim_deserializer_panel {
-	struct udevice *dev;
-	struct udevice *backlight;
-	struct gpio_desc enable_gpio;
-
-	/* the panel desc as detected */
-	const struct maxim_deserializer_panel_desc *desc;
-};
-
-static void maxim_max96752f_panel_prepare(struct maxim_deserializer_panel *p)
-{
-	pinctrl_select_state(p->dev, p->desc->name ?
-			     p->desc->name : p->desc->deserializer.name);
-
-	dm_i2c_reg_write(p->dev, 0x0002, 0x43);
-	dm_i2c_reg_write(p->dev, 0x0140, 0x20);
-
-	dm_i2c_reg_write(p->dev, 0x01ce, 0x5e);	/* oldi */
-	dm_i2c_reg_write(p->dev, 0x020c, 0x84);	/* bl_pwm */
-	dm_i2c_reg_write(p->dev, 0x0206, 0x83);	/* tp_int */
-
-	dm_i2c_reg_write(p->dev, 0x0215, 0x90);	/* lcd_en */
-	mdelay(20);
-}
-
-static void maxim_max96752f_panel_unprepare(struct maxim_deserializer_panel *p)
-{
-	dm_i2c_reg_write(p->dev, 0x0215, 0x80);	/* lcd_en */
-}
-
-static void maxim_max96752f_panel_enable(struct maxim_deserializer_panel *p)
-{
-	dm_i2c_reg_write(p->dev, 0x0227, 0x90);	/* lcd_rst */
-	mdelay(20);
-	dm_i2c_reg_write(p->dev, 0x020f, 0x90);	/* tp_rst */
-	mdelay(100);
-	dm_i2c_reg_write(p->dev, 0x0221, 0x90);	/* lcd_stb */
-	mdelay(60);
-	dm_i2c_reg_write(p->dev, 0x0212, 0x90);	/* bl_current_ctl */
-	dm_i2c_reg_write(p->dev, 0x0209, 0x90);	/* bl_en */
-}
-
-static void maxim_max96752f_panel_disable(struct maxim_deserializer_panel *p)
-{
-	dm_i2c_reg_write(p->dev, 0x0209, 0x80);	/* bl_en */
-	dm_i2c_reg_write(p->dev, 0x0212, 0x80); /* bl_current_ctl */
-	dm_i2c_reg_write(p->dev, 0x0221, 0x80);	/* lcd_stb */
-	dm_i2c_reg_write(p->dev, 0x020f, 0x80);	/* tp_rst */
-	dm_i2c_reg_write(p->dev, 0x0227, 0x80);	/* lcd_rst */
-}
-
-static const struct maxim_deserializer_panel_desc maxim_deserializer_default_panels[] = {
-	{
-		.deserializer = {
-			.name = "max96752f",
-			.addr = 0x48,
-			.dev_id = 0x82,
-		},
-
-		.mode = {
-			.clock = 148500,
-			.hdisplay = 1920,
-			.hsync_start = 1920 + 20,
-			.hsync_end = 1920 + 20 + 20,
-			.htotal = 1920 + 20 + 20 + 20,
-			.vdisplay = 1080,
-			.vsync_start = 1080 + 250,
-			.vsync_end = 1080 + 250 + 2,
-			.vtotal = 1080 + 250 + 2 + 8,
-			.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
-		},
-
-		.prepare = maxim_max96752f_panel_prepare,
-		.enable = maxim_max96752f_panel_enable,
-		.disable = maxim_max96752f_panel_disable,
-		.unprepare = maxim_max96752f_panel_unprepare,
-	},
-};
-
-static void maxim_deserializer_panel_prepare(struct rockchip_panel *panel)
-{
-	struct maxim_deserializer_panel *p = dev_get_priv(panel->dev);
-
-	if (!p->desc)
-		return;
-
-	if (p->desc->prepare)
-		p->desc->prepare(p);
-}
-
-static void maxim_deserializer_panel_unprepare(struct rockchip_panel *panel)
-{
-	struct maxim_deserializer_panel *p = dev_get_priv(panel->dev);
-
-	if (!p->desc)
-		return;
-
-	if (p->desc->unprepare)
-		p->desc->unprepare(p);
-}
-
-static void maxim_deserializer_panel_enable(struct rockchip_panel *panel)
-{
-	struct maxim_deserializer_panel *p = dev_get_priv(panel->dev);
-
-	if (!p->desc)
-		return;
-
-	if (p->desc->enable)
-		p->desc->enable(p);
-
-	if (p->backlight)
-		backlight_enable(p->backlight);
-}
-
-static void maxim_deserializer_panel_disable(struct rockchip_panel *panel)
-{
-	struct maxim_deserializer_panel *p = dev_get_priv(panel->dev);
-
-	if (!p->desc)
-		return;
-
-	if (p->backlight)
-		backlight_disable(p->backlight);
-
-	if (p->desc->disable)
-		p->desc->disable(p);
-}
-
-static u16 maxim_deserializer_panel_get_id(struct maxim_deserializer_panel *p)
-{
-	/* TODO */
-	return 0;
-}
-
-static int maxim_deserializer_panel_detect(struct maxim_deserializer_panel *p)
-{
-	const struct maxim_deserializer_panel_desc *desc = NULL;
-	struct udevice *dev = p->dev;
-	struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
-	u16 id = maxim_deserializer_panel_get_id(p);
-	unsigned int i, ret;
-
-	if (id) {
-		/* TODO */
-	} else {
-		u8 dev_id;
-
-		for (i = 0; i < ARRAY_SIZE(maxim_deserializer_default_panels); i++) {
-			chip->chip_addr = maxim_deserializer_default_panels[i].deserializer.addr;
-
-			ret = dm_i2c_reg_read(dev, 0x000d);
-			if (ret < 0)
-				continue;
-
-			dev_id = ret;
-
-			if (maxim_deserializer_default_panels[i].deserializer.dev_id == dev_id) {
-				desc = &maxim_deserializer_default_panels[i];
-				break;
-			}
-		}
-	}
-
-	if (!desc)
-		return -ENODEV;
-
-	p->desc = desc;
-	chip->chip_addr = desc->deserializer.addr;
-
-	return 0;
-}
-
-static int maxim_deserializer_panel_get_mode(struct rockchip_panel *panel,
-					     struct drm_display_mode *mode)
-{
-	struct maxim_deserializer_panel *p = dev_get_priv(panel->dev);
-	int ret;
-
-	ret = maxim_deserializer_panel_detect(p);
-	if (ret)
-		return ret;
-
-	memcpy(mode, &p->desc->mode, sizeof(struct drm_display_mode));
-	mode->vrefresh = drm_mode_vrefresh(mode);
-
-	return 0;
-}
-
-static const struct rockchip_panel_funcs maxim_deserializer_panel_funcs = {
-	.prepare = maxim_deserializer_panel_prepare,
-	.unprepare = maxim_deserializer_panel_unprepare,
-	.enable = maxim_deserializer_panel_enable,
-	.disable = maxim_deserializer_panel_disable,
-	.get_mode = maxim_deserializer_panel_get_mode,
-};
-
-static void maxim_deserializer_panel_power_on(struct maxim_deserializer_panel *p)
-{
-	if (dm_gpio_is_valid(&p->enable_gpio)) {
-		dm_gpio_set_value(&p->enable_gpio, 1);
-		mdelay(500);
-	}
-}
-
-static int maxim_deserializer_panel_probe(struct udevice *dev)
-{
-	struct maxim_deserializer_panel *p = dev_get_priv(dev);
-	struct rockchip_panel *panel;
-	int ret;
-
-	ret = i2c_set_chip_offset_len(dev, 2);
-	if (ret)
-		return ret;
-
-	p->dev = dev;
-
-	ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
-					   "backlight", &p->backlight);
-	if (ret && ret != -ENOENT) {
-		dev_err(dev, "%s: Cannot get backlight: %d\n", __func__, ret);
-		return ret;
-	}
-
-	ret = gpio_request_by_name(dev, "enable-gpios", 0,
-				   &p->enable_gpio, GPIOD_IS_OUT);
-	if (ret && ret != -ENOENT) {
-		dev_err(dev, "%s: Cannot get enable GPIO: %d\n", __func__, ret);
-		return ret;
-	}
-
-	maxim_deserializer_panel_power_on(p);
-
-	panel = calloc(1, sizeof(*panel));
-	if (!panel)
-		return -ENOMEM;
-
-	dev->driver_data = (ulong)panel;
-	panel->dev = dev;
-	panel->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
-	panel->funcs = &maxim_deserializer_panel_funcs;
-
-	return 0;
-}
-
-static const struct udevice_id maxim_deserializer_panel_of_match[] = {
-	{ .compatible = "maxim,deserializer-panel", },
-	{}
-};
-
-U_BOOT_DRIVER(maxim_deserializer_panel) = {
-	.name = "maxim_deserializer_panel",
-	.id = UCLASS_PANEL,
-	.of_match = maxim_deserializer_panel_of_match,
-	.probe = maxim_deserializer_panel_probe,
-	.priv_auto_alloc_size = sizeof(struct maxim_deserializer_panel),
-};
diff --git a/u-boot/drivers/video/drm/panel-maxim-max96752f.c b/u-boot/drivers/video/drm/panel-maxim-max96752f.c
new file mode 100644
index 0000000..0c28231
--- /dev/null
+++ b/u-boot/drivers/video/drm/panel-maxim-max96752f.c
@@ -0,0 +1,303 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Maxim MAX96752F GMSL2 Deserializer
+ *
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ */
+
+#include <config.h>
+#include <common.h>
+#include <backlight.h>
+#include <errno.h>
+#include <malloc.h>
+#include <video.h>
+
+#include <asm/gpio.h>
+#include <dm/device.h>
+#include <dm/read.h>
+#include <dm/pinctrl.h>
+#include <dm/uclass-id.h>
+#include <linux/media-bus-format.h>
+
+#include "rockchip_display.h"
+#include "rockchip_panel.h"
+
+struct max96752f;
+
+struct panel_desc {
+	const char *name;
+	int (*prepare)(struct max96752f *max96752f);
+	int (*unprepare)(struct max96752f *max96752f);
+	int (*enable)(struct max96752f *max96752f);
+	int (*disable)(struct max96752f *max96752f);
+	int (*backlight_enable)(struct max96752f *max96752f);
+	int (*backlight_disable)(struct max96752f *max96752f);
+};
+
+struct max96752f {
+	struct udevice *dev;
+	struct udevice *serializer;
+	struct udevice *backlight;
+
+	const struct panel_desc *desc;
+};
+
+static void max96752f_panel_prepare(struct rockchip_panel *panel)
+{
+	struct max96752f *max96752f = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = max96752f->desc;
+
+	if (desc->prepare)
+		desc->prepare(max96752f);
+}
+
+static void max96752f_panel_unprepare(struct rockchip_panel *panel)
+{
+	struct max96752f *max96752f = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = max96752f->desc;
+
+	if (desc->unprepare)
+		desc->unprepare(max96752f);
+}
+
+static void max96752f_panel_enable(struct rockchip_panel *panel)
+{
+	struct max96752f *max96752f = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = max96752f->desc;
+
+	if (desc->enable)
+		desc->enable(max96752f);
+
+	if (max96752f->backlight)
+		backlight_enable(max96752f->backlight);
+
+	if (desc->backlight_enable)
+		desc->backlight_enable(max96752f);
+}
+
+static void max96752f_panel_disable(struct rockchip_panel *panel)
+{
+	struct max96752f *max96752f = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = max96752f->desc;
+
+	if (desc->backlight_disable)
+		desc->backlight_disable(max96752f);
+
+	if (max96752f->backlight)
+		backlight_disable(max96752f->backlight);
+
+	if (desc->disable)
+		desc->disable(max96752f);
+}
+
+static const struct rockchip_panel_funcs max96752f_panel_funcs = {
+	.prepare = max96752f_panel_prepare,
+	.unprepare = max96752f_panel_unprepare,
+	.enable = max96752f_panel_enable,
+	.disable = max96752f_panel_disable,
+};
+
+static int max96752f_probe(struct udevice *dev)
+{
+	struct max96752f *max96752f = dev_get_priv(dev);
+	struct rockchip_panel *panel;
+	int ret;
+
+	ret = i2c_set_chip_offset_len(dev, 2);
+	if (ret)
+		return ret;
+
+	max96752f->dev = dev;
+	max96752f->serializer = dev->parent->parent;
+	max96752f->desc = (const struct panel_desc *)dev_get_driver_data(dev);
+
+	ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
+					   "backlight", &max96752f->backlight);
+	if (ret && ret != -ENOENT) {
+		dev_err(dev, "%s: Cannot get backlight: %d\n", __func__, ret);
+		return ret;
+	}
+
+	panel = calloc(1, sizeof(*panel));
+	if (!panel)
+		return -ENOMEM;
+
+	dev->driver_data = (ulong)panel;
+	panel->dev = dev;
+	panel->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+	panel->funcs = &max96752f_panel_funcs;
+
+	return 0;
+}
+
+#define maxim_serializer_write(max96752f, reg, val) do {	\
+		int ret;					\
+		ret = dm_i2c_reg_write(max96752f->serializer,	\
+				       reg, val);		\
+		if (ret)					\
+			return ret;				\
+	} while (0)
+
+#define maxim_deserializer_write(max96752f, reg, val) do {	\
+		int ret;					\
+		ret = dm_i2c_reg_write(max96752f->dev,		\
+				       reg, val);		\
+		if (ret)					\
+			return ret;				\
+	} while (0)
+
+static int boe_av156fht_l83_panel_prepare(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0002, 0x43);
+	maxim_deserializer_write(max96752f, 0x0140, 0x20);
+
+	maxim_deserializer_write(max96752f, 0x01ce, 0x5e);	/* oldi */
+	maxim_deserializer_write(max96752f, 0x020c, 0x84);	/* bl_pwm */
+	maxim_deserializer_write(max96752f, 0x0206, 0x83);	/* tp_int */
+
+	maxim_deserializer_write(max96752f, 0x0215, 0x90);	/* lcd_en */
+	mdelay(20);
+
+	return 0;
+}
+
+static int boe_av156fht_l83_panel_unprepare(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0215, 0x80);	/* lcd_en */
+
+	return 0;
+}
+
+static int boe_av156fht_l83_panel_enable(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0227, 0x90);	/* lcd_rst */
+	mdelay(20);
+	maxim_deserializer_write(max96752f, 0x020f, 0x90);	/* tp_rst */
+	mdelay(100);
+	maxim_deserializer_write(max96752f, 0x0221, 0x90);	/* lcd_stb */
+	mdelay(60);
+	maxim_deserializer_write(max96752f, 0x0212, 0x90);	/* bl_current_ctl */
+	maxim_deserializer_write(max96752f, 0x0209, 0x90);	/* bl_en */
+
+	return 0;
+}
+
+static int boe_av156fht_l83_panel_disable(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0209, 0x80);	/* bl_en */
+	maxim_deserializer_write(max96752f, 0x0212, 0x80);	/* bl_current_ctl */
+	maxim_deserializer_write(max96752f, 0x0221, 0x80);	/* lcd_stb */
+	maxim_deserializer_write(max96752f, 0x020f, 0x80);	/* tp_rst */
+	maxim_deserializer_write(max96752f, 0x0227, 0x80);	/* lcd_rst */
+
+	return 0;
+}
+
+static int boe_av156fht_l83_panel_backlight_enable(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0212, 0x90);	/* bl_current_ctl */
+	maxim_deserializer_write(max96752f, 0x0209, 0x90);	/* bl_en */
+
+	return 0;
+}
+
+static int boe_av156fht_l83_panel_backlight_disable(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0209, 0x80);	/* bl_en */
+	maxim_deserializer_write(max96752f, 0x0212, 0x80);	/* bl_current_ctl */
+
+	return 0;
+}
+
+static const struct panel_desc boe_av156fht_l83 = {
+	.name			= "boe-av156fht-l83",
+	.prepare		= boe_av156fht_l83_panel_prepare,
+	.unprepare		= boe_av156fht_l83_panel_unprepare,
+	.enable			= boe_av156fht_l83_panel_enable,
+	.disable		= boe_av156fht_l83_panel_disable,
+	.backlight_enable	= boe_av156fht_l83_panel_backlight_enable,
+	.backlight_disable	= boe_av156fht_l83_panel_backlight_disable,
+};
+
+static int hannstar_hsd123jpw3_a15_prepare(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0002, 0x43);
+	maxim_deserializer_write(max96752f, 0x0140, 0x20);
+	maxim_deserializer_write(max96752f, 0x01ce, 0x5e);
+
+	maxim_deserializer_write(max96752f, 0x0203, 0x83);	/* GPIO1  <- TP_INT */
+	maxim_deserializer_write(max96752f, 0x0206, 0x84);      /* GPIO2  -> TP_RST */
+	maxim_deserializer_write(max96752f, 0x0224, 0x84);	/* GPIO12 -> LCD_BL_PWM */
+
+	return 0;
+}
+
+static int hannstar_hsd123jpw3_a15_unprepare(struct max96752f *max96752f)
+{
+	return 0;
+}
+
+static int hannstar_hsd123jpw3_a15_enable(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0221, 0x10);	/* GPIO11 -> LCD_RESET */
+	mdelay(20);
+
+	return 0;
+}
+
+static int hannstar_hsd123jpw3_a15_disable(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0221, 0x00);	/* GPIO11 -> LCD_RESET */
+	mdelay(20);
+
+	return 0;
+}
+
+static const struct panel_desc hannstar_hsd123jpw3_a15 = {
+	.name			= "hannstar,hsd123jpw3-a15",
+	.prepare		= hannstar_hsd123jpw3_a15_prepare,
+	.unprepare		= hannstar_hsd123jpw3_a15_unprepare,
+	.enable			= hannstar_hsd123jpw3_a15_enable,
+	.disable		= hannstar_hsd123jpw3_a15_disable,
+};
+
+static int ogm_101fhbllm01_prepare(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x01ce, 0x5e);
+
+	maxim_deserializer_write(max96752f, 0x0203, 0x84);	/* GPIO1 -> BL_PWM */
+	maxim_deserializer_write(max96752f, 0x0206, 0x84);	/* GPIO2 -> TP_RST */
+	maxim_deserializer_write(max96752f, 0x0209, 0x83);	/* GPIO3 <- TP_INT */
+
+	maxim_deserializer_write(max96752f, 0x0001, 0x02);
+
+	return 0;
+}
+
+static int ogm_101fhbllm01_unprepare(struct max96752f *max96752f)
+{
+	maxim_deserializer_write(max96752f, 0x0001, 0x01);
+
+	return 0;
+}
+
+static const struct panel_desc ogm_101fhbllm01 = {
+	.name			= "ogm,101fhbllm01",
+	.prepare		= ogm_101fhbllm01_prepare,
+	.unprepare		= ogm_101fhbllm01_unprepare,
+};
+
+static const struct udevice_id max96752f_of_match[] = {
+	{ .compatible = "boe,av156fht-l83", .data = (ulong)&boe_av156fht_l83 },
+	{ .compatible = "hannstar,hsd123jpw3-a15", .data = (ulong)&hannstar_hsd123jpw3_a15 },
+	{ .compatible = "ogm,101fhbllm01", .data = (ulong)&ogm_101fhbllm01 },
+	{}
+};
+
+U_BOOT_DRIVER(max96752f) = {
+	.name = "max96752f",
+	.id = UCLASS_PANEL,
+	.of_match = max96752f_of_match,
+	.probe = max96752f_probe,
+	.priv_auto_alloc_size = sizeof(struct max96752f),
+};
diff --git a/u-boot/drivers/video/drm/panel-rohm-bu18rl82.c b/u-boot/drivers/video/drm/panel-rohm-bu18rl82.c
new file mode 100644
index 0000000..24792ad
--- /dev/null
+++ b/u-boot/drivers/video/drm/panel-rohm-bu18rl82.c
@@ -0,0 +1,349 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Rohm BU18RL82-based panel driver
+ *
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ */
+
+#include <config.h>
+#include <common.h>
+#include <backlight.h>
+#include <errno.h>
+#include <malloc.h>
+#include <video.h>
+
+#include <asm/gpio.h>
+#include <dm/device.h>
+#include <dm/read.h>
+#include <dm/pinctrl.h>
+#include <dm/uclass-id.h>
+#include <linux/media-bus-format.h>
+
+#include "rockchip_display.h"
+#include "rockchip_panel.h"
+
+struct bu18rl82;
+
+struct panel_desc {
+	const char *name;
+	int (*prepare)(struct bu18rl82 *rl82);
+	int (*unprepare)(struct bu18rl82 *rl82);
+	int (*enable)(struct bu18rl82 *rl82);
+	int (*disable)(struct bu18rl82 *rl82);
+	int (*backlight_enable)(struct bu18rl82 *rl82);
+	int (*backlight_disable)(struct bu18rl82 *rl82);
+};
+
+struct bu18rl82 {
+	struct udevice *dev;
+	struct udevice *backlight;
+	const struct panel_desc *desc;
+};
+
+static void bu18rl82_panel_prepare(struct rockchip_panel *panel)
+{
+	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = rl82->desc;
+
+	if (desc->prepare)
+		desc->prepare(rl82);
+}
+
+static void bu18rl82_panel_unprepare(struct rockchip_panel *panel)
+{
+	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = rl82->desc;
+
+	if (desc->unprepare)
+		desc->unprepare(rl82);
+}
+
+static void bu18rl82_panel_enable(struct rockchip_panel *panel)
+{
+	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = rl82->desc;
+
+	if (desc->enable)
+		desc->enable(rl82);
+
+	if (rl82->backlight)
+		backlight_enable(rl82->backlight);
+
+	if (desc->backlight_enable)
+		desc->backlight_enable(rl82);
+}
+
+static void bu18rl82_panel_disable(struct rockchip_panel *panel)
+{
+	struct bu18rl82 *rl82 = dev_get_priv(panel->dev);
+	const struct panel_desc *desc = rl82->desc;
+
+	if (desc->backlight_disable)
+		desc->backlight_disable(rl82);
+
+	if (rl82->backlight)
+		backlight_disable(rl82->backlight);
+
+	if (desc->disable)
+		desc->disable(rl82);
+}
+
+static const struct rockchip_panel_funcs bu18rl82_panel_funcs = {
+	.prepare = bu18rl82_panel_prepare,
+	.unprepare = bu18rl82_panel_unprepare,
+	.enable = bu18rl82_panel_enable,
+	.disable = bu18rl82_panel_disable,
+};
+
+static int bu18rl82_probe(struct udevice *dev)
+{
+	struct bu18rl82 *rl82 = dev_get_priv(dev);
+	struct rockchip_panel *panel;
+	int ret;
+
+	ret = i2c_set_chip_offset_len(dev, 2);
+	if (ret)
+		return ret;
+
+	rl82->dev = dev;
+	rl82->desc = (const struct panel_desc *)dev_get_driver_data(dev);
+
+	ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
+					   "backlight", &rl82->backlight);
+	if (ret && ret != -ENOENT) {
+		dev_err(dev, "%s: Cannot get backlight: %d\n", __func__, ret);
+		return ret;
+	}
+
+	panel = calloc(1, sizeof(*panel));
+	if (!panel)
+		return -ENOMEM;
+
+	dev->driver_data = (ulong)panel;
+	panel->dev = dev;
+	panel->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+	panel->funcs = &bu18rl82_panel_funcs;
+
+	return 0;
+}
+
+#define rohm_deserializer_write(rl82, reg, val) do {			\
+		int ret;						\
+		ret = dm_i2c_reg_write(rl82->dev, reg, val);		\
+		if (ret) {						\
+			dev_err(rl82->dev,				\
+				"failed to set register 0x%04x\n",	\
+				reg);					\
+			return ret;					\
+		}							\
+	} while (0)
+
+static int csot_mg1561b01_prepare(struct bu18rl82 *rl82)
+{
+	const struct reg_sequence {
+		u16 reg;
+		u8 def;
+	} regs[] = {
+		{ 0x0011, 0x03 }, { 0x0012, 0x03 },
+		{ 0x001f, 0x02 }, { 0x0020, 0x02 },
+		{ 0x0031, 0x41 }, { 0x0032, 0x41 },
+		{ 0x0073, 0x80 }, { 0x0074, 0x07 },
+		{ 0x007b, 0x38 }, { 0x007c, 0x04 },
+		{ 0x0079, 0x0a },
+		{ 0x0429, 0x0a }, { 0x045d, 0x01 },
+		{ 0x0529, 0x0a }, { 0x055d, 0x01 },
+		{ 0x060a, 0xb0 }, { 0x060b, 0xff }, { 0x060c, 0xff },
+		{ 0x0644, 0x18 }, { 0x0645, 0x01 }, { 0x0646, 0x2d },
+	};
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(regs); i++)
+		rohm_deserializer_write(rl82, regs[i].reg, regs[i].def);
+
+	/* BL_PWM - GPIO0 */
+	rohm_deserializer_write(rl82, 0x0057, 0x00);
+	rohm_deserializer_write(rl82, 0x0058, 0x02);
+
+	/* TP_INT - GPIO3 */
+	rohm_deserializer_write(rl82, 0x0060, 0x08);
+	rohm_deserializer_write(rl82, 0x042e, 0x05);
+
+	/* TP_RST - GPIO4 */
+	rohm_deserializer_write(rl82, 0x0063, 0x00);
+	rohm_deserializer_write(rl82, 0x0064, 0x01);
+
+	return 0;
+}
+
+static int csot_mg1561b01_unprepare(struct bu18rl82 *rl82)
+{
+	/* TP_RST - GPIO4 */
+	rohm_deserializer_write(rl82, 0x0064, 0x00);
+
+	return 0;
+}
+
+static int csot_mg1561b01_enable(struct bu18rl82 *rl82)
+{
+	rohm_deserializer_write(rl82, 0x0091, 0x03);
+	rohm_deserializer_write(rl82, 0x0090, 0x01);
+
+	return 0;
+}
+
+static int csot_mg1561b01_disable(struct bu18rl82 *rl82)
+{
+	rohm_deserializer_write(rl82, 0x0090, 0x00);
+	rohm_deserializer_write(rl82, 0x0091, 0x00);
+
+	return 0;
+}
+
+static int csot_mg1561b01_backlight_enable(struct bu18rl82 *rl82)
+{
+	/* BL_EN - GPIO1 */
+	rohm_deserializer_write(rl82, 0x005a, 0x00);
+	rohm_deserializer_write(rl82, 0x005b, 0x01);
+
+	return 0;
+}
+
+static int csot_mg1561b01_backlight_disable(struct bu18rl82 *rl82)
+{
+	/* BL_EN - GPIO1 */
+	rohm_deserializer_write(rl82, 0x005b, 0x00);
+
+	return 0;
+}
+
+static const struct panel_desc csot_mg1561b01 = {
+	.name			= "csot,mg1561b01",
+	.prepare		= csot_mg1561b01_prepare,
+	.unprepare		= csot_mg1561b01_unprepare,
+	.enable			= csot_mg1561b01_enable,
+	.disable		= csot_mg1561b01_disable,
+	.backlight_enable	= csot_mg1561b01_backlight_enable,
+	.backlight_disable	= csot_mg1561b01_backlight_disable,
+};
+
+static int touch_china_v123awf3_r1_prepare(struct bu18rl82 *rl82)
+{
+	const struct reg_sequence {
+		u16 reg;
+		u8 def;
+	} regs[] = {
+		{ 0x0011, 0x03 }, { 0x0012, 0x03 },
+		{ 0x001f, 0x02 }, { 0x0020, 0x02 },
+		{ 0x0031, 0x48 }, { 0x0032, 0x48 },
+		{ 0x0073, 0x80 }, { 0x0074, 0x07 },
+		{ 0x007b, 0xd0 }, { 0x007c, 0x02 },
+		{ 0x0079, 0x0a },
+		{ 0x0429, 0x0a }, { 0x045d, 0x01 },
+		{ 0x0529, 0x0a }, { 0x055d, 0x01 },
+		{ 0x060a, 0xb0 }, { 0x060b, 0xff }, { 0x060c, 0xff },
+		{ 0x0644, 0x90 }, { 0x0646, 0xd2 },
+	};
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(regs); i++)
+		rohm_deserializer_write(rl82, regs[i].reg, regs[i].def);
+
+	/* TP_INT - GPIO4 */
+	rohm_deserializer_write(rl82, 0x0063, 0x08);
+	rohm_deserializer_write(rl82, 0x042f, 0x06);
+
+	/* TP_RST - GPIO3 */
+	rohm_deserializer_write(rl82, 0x0060, 0x00);
+	rohm_deserializer_write(rl82, 0x0061, 0x00);
+
+	/* LCD_BIAS_EN - GPIO2 */
+	rohm_deserializer_write(rl82, 0x005d, 0x00);
+	rohm_deserializer_write(rl82, 0x005e, 0x01);
+	mdelay(6);
+
+	return 0;
+}
+
+static int touch_china_v123awf3_r1_unprepare(struct bu18rl82 *rl82)
+{
+	/* LCD_BIAS_EN - GPIO2 */
+	rohm_deserializer_write(rl82, 0x005e, 0x00);
+
+	return 0;
+}
+
+static int touch_china_v123awf3_r1_enable(struct bu18rl82 *rl82)
+{
+	rohm_deserializer_write(rl82, 0x0091, 0x03);
+	rohm_deserializer_write(rl82, 0x0090, 0x01);
+
+	/* RSEX - GPIO5 */
+	rohm_deserializer_write(rl82, 0x0066, 0x00);
+	rohm_deserializer_write(rl82, 0x0067, 0x01);
+	/* TP_RST - GPIO3 */
+	rohm_deserializer_write(rl82, 0x0060, 0x00);
+	rohm_deserializer_write(rl82, 0x0061, 0x01);
+	mdelay(20);
+	/* LCD_PON - GPIO1 */
+	rohm_deserializer_write(rl82, 0x005a, 0x00);
+	rohm_deserializer_write(rl82, 0x005b, 0x01);
+
+	return 0;
+}
+
+static int touch_china_v123awf3_r1_disable(struct bu18rl82 *rl82)
+{
+	rohm_deserializer_write(rl82, 0x0090, 0x00);
+	rohm_deserializer_write(rl82, 0x0091, 0x00);
+
+	/* LCD_PON - GPIO1 */
+	rohm_deserializer_write(rl82, 0x005b, 0x00);
+	mdelay(100);
+	/* TP_RST - GPIO3 */
+	rohm_deserializer_write(rl82, 0x0061, 0x00);
+	/* RSEX - GPIO5 */
+	rohm_deserializer_write(rl82, 0x0067, 0x00);
+
+	return 0;
+}
+
+static int touch_china_v123awf3_r1_backlight_enable(struct bu18rl82 *rl82)
+{
+	/* BL_PWM - GPIO0 */
+	rohm_deserializer_write(rl82, 0x0057, 0x00);
+	rohm_deserializer_write(rl82, 0x0058, 0x02);
+
+	return 0;
+}
+
+static int touch_china_v123awf3_r1_backlight_disable(struct bu18rl82 *rl82)
+{
+	/* BL_PWM - GPIO0 */
+	rohm_deserializer_write(rl82, 0x0058, 0x00);
+
+	return 0;
+}
+
+static const struct panel_desc touch_china_v123awf3_r1 = {
+	.name			= "touch-china,v123awf3-r1",
+	.prepare		= touch_china_v123awf3_r1_prepare,
+	.unprepare		= touch_china_v123awf3_r1_unprepare,
+	.enable			= touch_china_v123awf3_r1_enable,
+	.disable		= touch_china_v123awf3_r1_disable,
+	.backlight_enable	= touch_china_v123awf3_r1_backlight_enable,
+	.backlight_disable	= touch_china_v123awf3_r1_backlight_disable,
+};
+
+static const struct udevice_id bu18rl82_of_match[] = {
+	{ .compatible = "csot,mg1561b01", .data = (ulong)&csot_mg1561b01 },
+	{ .compatible = "touch-china,v123awf3-r1", .data = (ulong)&touch_china_v123awf3_r1 },
+	{}
+};
+
+U_BOOT_DRIVER(panel_rohm_bu18rl82) = {
+	.name = "panel-rohm-bu18rl82",
+	.id = UCLASS_PANEL,
+	.of_match = bu18rl82_of_match,
+	.probe = bu18rl82_probe,
+	.priv_auto_alloc_size = sizeof(struct bu18rl82),
+};
diff --git a/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c b/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c
index 4a00253..f964ddb 100644
--- a/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c
+++ b/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c
@@ -1278,9 +1278,9 @@
 	hdptx_write(hdptx, CMN_REG0043, 0x00);
 	hdptx_write(hdptx, CMN_REG0044, 0x46);
 	hdptx_write(hdptx, CMN_REG0045, 0x24);
-	hdptx_write(hdptx, CMN_REG0046, 0xff);
+	hdptx_write(hdptx, CMN_REG0046, 0xdd);
 	hdptx_write(hdptx, CMN_REG0047, 0x00);
-	hdptx_write(hdptx, CMN_REG0048, 0x44);
+	hdptx_write(hdptx, CMN_REG0048, 0x11);
 	hdptx_write(hdptx, CMN_REG0049, 0xfa);
 	hdptx_write(hdptx, CMN_REG004A, 0x08);
 	hdptx_write(hdptx, CMN_REG004B, 0x00);
@@ -1457,6 +1457,13 @@
 	hdptx_write(hdptx, LANE_REG0616, 0x02);
 	hdptx_write(hdptx, LANE_REG061B, 0x01);
 	hdptx_write(hdptx, LANE_REG061E, 0x08);
+
+	/* fix Inter-Pair Skew exceed the limits */
+	hdptx_write(hdptx, LANE_REG031E, 0x02);
+	hdptx_write(hdptx, LANE_REG041E, 0x02);
+	hdptx_write(hdptx, LANE_REG051E, 0x02);
+	hdptx_write(hdptx, LANE_REG061E, 0x0a);
+
 	hdptx_write(hdptx, LANE_REG061F, 0x15);
 	hdptx_write(hdptx, LANE_REG0620, 0xa0);
 
@@ -1705,6 +1712,33 @@
 	hdptx_write(hdptx, LANE_REG061F, 0x15);
 	hdptx_write(hdptx, LANE_REG0620, 0xa0);
 
+	hdptx_write(hdptx, LANE_REG031E, 0x02);
+	hdptx_write(hdptx, LANE_REG041E, 0x02);
+	hdptx_write(hdptx, LANE_REG051E, 0x02);
+	hdptx_write(hdptx, LANE_REG061E, 0x02);
+
+	hdptx_write(hdptx, LANE_REG0303, 0x2f);
+	hdptx_write(hdptx, LANE_REG0403, 0x2f);
+	hdptx_write(hdptx, LANE_REG0503, 0x2f);
+	hdptx_write(hdptx, LANE_REG0603, 0x2f);
+	hdptx_write(hdptx, LANE_REG0305, 0x03);
+	hdptx_write(hdptx, LANE_REG0405, 0x03);
+	hdptx_write(hdptx, LANE_REG0505, 0x03);
+	hdptx_write(hdptx, LANE_REG0605, 0x03);
+	hdptx_write(hdptx, LANE_REG0306, 0xfc);
+	hdptx_write(hdptx, LANE_REG0406, 0xfc);
+	hdptx_write(hdptx, LANE_REG0506, 0xfc);
+	hdptx_write(hdptx, LANE_REG0606, 0xfc);
+
+	hdptx_write(hdptx, LANE_REG0305, 0x4f);
+	hdptx_write(hdptx, LANE_REG0405, 0x4f);
+	hdptx_write(hdptx, LANE_REG0505, 0x4f);
+	hdptx_write(hdptx, LANE_REG0605, 0x4f);
+	hdptx_write(hdptx, LANE_REG0304, 0x14);
+	hdptx_write(hdptx, LANE_REG0404, 0x14);
+	hdptx_write(hdptx, LANE_REG0504, 0x14);
+	hdptx_write(hdptx, LANE_REG0604, 0x14);
+
 	return hdptx_post_enable_lane(hdptx);
 }
 
@@ -1774,6 +1808,33 @@
 	hdptx_write(hdptx, LANE_REG061B, 0x01);
 	hdptx_write(hdptx, LANE_REG061F, 0x15);
 	hdptx_write(hdptx, LANE_REG0620, 0xa0);
+
+	hdptx_write(hdptx, LANE_REG031E, 0x02);
+	hdptx_write(hdptx, LANE_REG041E, 0x02);
+	hdptx_write(hdptx, LANE_REG051E, 0x02);
+	hdptx_write(hdptx, LANE_REG061E, 0x02);
+
+	hdptx_write(hdptx, LANE_REG0303, 0x2f);
+	hdptx_write(hdptx, LANE_REG0403, 0x2f);
+	hdptx_write(hdptx, LANE_REG0503, 0x2f);
+	hdptx_write(hdptx, LANE_REG0603, 0x2f);
+	hdptx_write(hdptx, LANE_REG0305, 0x03);
+	hdptx_write(hdptx, LANE_REG0405, 0x03);
+	hdptx_write(hdptx, LANE_REG0505, 0x03);
+	hdptx_write(hdptx, LANE_REG0605, 0x03);
+	hdptx_write(hdptx, LANE_REG0306, 0xfc);
+	hdptx_write(hdptx, LANE_REG0406, 0xfc);
+	hdptx_write(hdptx, LANE_REG0506, 0xfc);
+	hdptx_write(hdptx, LANE_REG0606, 0xfc);
+
+	hdptx_write(hdptx, LANE_REG0305, 0x4f);
+	hdptx_write(hdptx, LANE_REG0405, 0x4f);
+	hdptx_write(hdptx, LANE_REG0505, 0x4f);
+	hdptx_write(hdptx, LANE_REG0605, 0x4f);
+	hdptx_write(hdptx, LANE_REG0304, 0x14);
+	hdptx_write(hdptx, LANE_REG0404, 0x14);
+	hdptx_write(hdptx, LANE_REG0504, 0x14);
+	hdptx_write(hdptx, LANE_REG0604, 0x14);
 
 	return hdptx_post_enable_lane(hdptx);
 }
@@ -1951,12 +2012,14 @@
 
 	subnode = ofnode_find_subnode(parent->node, "clk-port");
 	if (!ofnode_valid(subnode)) {
-		printf("%s: no subnode for %s", __func__, parent->name);
+		free(str);
+		printf("%s: no subnode for %s\n", __func__, parent->name);
 		return -ENXIO;
 	}
 
 	ret = device_bind_driver_to_node(parent, "clk_hdptx", str, subnode, &child);
 	if (ret) {
+		free(str);
 		printf("%s: clk-port cannot bind its driver\n", __func__);
 		return ret;
 	}
@@ -2019,18 +2082,6 @@
 				new_rate = rate;
 				priv->rate = rate;
 			}
-		}
-	} else {
-		if (!hdptx_ropll_cmn_config(hdptx, rate)) {
-			new_rate = rate;
-			priv->rate = rate;
-		}
-	}
-
-	if (rate > (HDMI20_MAX_RATE / 100)) {
-		if (!hdptx_lcpll_cmn_config(hdptx, rate)) {
-			new_rate = rate;
-			priv->rate = rate;
 		}
 	} else {
 		if (!hdptx_ropll_cmn_config(hdptx, rate)) {
diff --git a/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c b/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c
index 71c710f..1f60e1f 100644
--- a/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c
+++ b/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c
@@ -3,6 +3,7 @@
  * (C) Copyright 2008-2016 Fuzhou Rockchip Electronics Co., Ltd
  */
 
+#include <clk-uclass.h>
 #include <config.h>
 #include <common.h>
 #include <errno.h>
@@ -11,7 +12,9 @@
 #include <fdtdec.h>
 #include <fdt_support.h>
 #include <asm/unaligned.h>
+#include <asm/arch/clock.h>
 #include <dm/device.h>
+#include <dm/lists.h>
 #include <dm/read.h>
 #include <asm/io.h>
 #include <linux/list.h>
@@ -20,6 +23,7 @@
 
 #include "rockchip_display.h"
 #include "rockchip_crtc.h"
+#include "rockchip_connector.h"
 #include "rockchip_phy.h"
 
 #define INNO_HDMI_PHY_TIMEOUT_LOOP_COUNT	1000
@@ -145,7 +149,8 @@
 
 enum inno_hdmi_phy_type {
 	INNO_HDMI_PHY_RK3228,
-	INNO_HDMI_PHY_RK3328
+	INNO_HDMI_PHY_RK3328,
+	INNO_HDMI_PHY_RK3528
 };
 
 struct inno_hdmi_phy_drv_data;
@@ -214,6 +219,14 @@
 	const void *data;
 };
 
+struct clk_inno_hdmi {
+	struct udevice *dev;
+	ulong rate;
+};
+
+/* global variables are used to pass reource from phy drivers to clk driver */
+static struct inno_hdmi_phy *g_inno;
+
 static const struct pre_pll_config pre_pll_cfg_table[] = {
 	{ 27000000,  27000000, 1,  90, 3, 2, 2, 10, 3, 3, 4, 0, 0},
 	{ 27000000,  33750000, 1,  90, 1, 3, 3, 10, 3, 3, 4, 0, 0},
@@ -249,9 +262,13 @@
 	{33750000,  1, 10, 2, 4},
 	{74250000,  1, 40, 8, 1},
 	{74250000, 18, 80, 8, 2},
+	{74250000,  1, 20, 4, 8},
 	{148500000, 2, 40, 4, 3},
+	{148500000, 1, 10, 2, 8},
 	{297000000, 4, 40, 2, 3},
+	{297000000, 2, 20, 2, 8},
 	{594000000, 8, 40, 1, 3},
+	{594000000, 4, 20, 1, 8},
 	{     ~0UL, 0,  0, 0, 0}
 };
 
@@ -292,6 +309,30 @@
 		594000000, {
 			0x10, 0x1a, 0x1a, 0x1a, 0x07, 0x15, 0x08, 0x08, 0x08,
 			0x00, 0xac, 0xcc, 0xcc, 0xcc,
+		},
+	}, {
+		~0UL, {
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00,
+		},
+	}
+};
+
+static const struct phy_config rk3528_phy_cfg[] = {
+	/* tmdsclk bias-clk bias-data voltage-clk voltage-data pre-emphasis-data */
+	{	165000000, {
+			0x03, 0x04, 0x0c, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00,
+		},
+	}, {
+		340000000, {
+			0x03, 0x04, 0x0c, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00,
+		},
+	}, {
+		594000000, {
+			0x02, 0x08, 0x0d, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+			0x00, 0x00, 0x00, 0x00, 0x00,
 		},
 	}, {
 		~0UL, {
@@ -398,7 +439,11 @@
 
 static int inno_hdmi_phy_power_on(struct rockchip_phy *phy)
 {
+#ifdef CONFIG_SPL_BUILD
+	struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data;
+#else
 	struct inno_hdmi_phy *inno = dev_get_priv(phy->dev);
+#endif
 	const struct post_pll_config *cfg = post_pll_cfg_table;
 	const struct phy_config *phy_cfg = inno->plat_data->phy_cfg_table;
 	u32 tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, inno->pixclock);
@@ -420,6 +465,8 @@
 	else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3228 &&
 		 tmdsclock <= 33750000)
 		chipversion = 4;
+	else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3528)
+		chipversion = 8;
 
 	printf("tmdsclock = %d; chipversion = %d\n", tmdsclock, chipversion);
 
@@ -444,7 +491,11 @@
 
 static int inno_hdmi_phy_power_off(struct rockchip_phy *phy)
 {
+#ifdef CONFIG_SPL_BUILD
+	struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data;
+#else
 	struct inno_hdmi_phy *inno = dev_get_priv(phy->dev);
+#endif
 
 	if (inno->plat_data->ops->power_off)
 		inno->plat_data->ops->power_off(inno);
@@ -858,6 +909,229 @@
 	return rate;
 }
 
+static int
+inno_hdmi_phy_rk3528_power_on(struct inno_hdmi_phy *inno,
+			      const struct post_pll_config *cfg,
+			      const struct phy_config *phy_cfg)
+{
+	u32 val;
+	u64 temp;
+	u32 tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, inno->pixclock);
+
+	/* Power off post PLL */
+	inno_update_bits(inno, 0xaa, 1, 0);
+
+	val = cfg->prediv;
+	inno_write(inno, 0xab, val);
+
+	if (cfg->postdiv == 1) {
+		inno_write(inno, 0xad, 0x8);
+		inno_write(inno, 0xaa, 2);
+	} else {
+		val = (cfg->postdiv / 2) - 1;
+		inno_write(inno, 0xad, val);
+		inno_write(inno, 0xaa, 0x0e);
+	}
+
+	val = cfg->fbdiv & 0xff;
+	inno_write(inno, 0xac, val);
+	val = (cfg->fbdiv >> 8) & BIT(0);
+	inno_update_bits(inno, 0xad, BIT(4), val);
+
+	/* current bias clk/data 2 */
+	val = phy_cfg->regs[0] << 4 | phy_cfg->regs[1];
+	inno_write(inno, 0xbf, val);
+
+	/* current bias data 1/0 */
+	val = phy_cfg->regs[1] << 4 | phy_cfg->regs[1];
+	inno_write(inno, 0xc0, val);
+
+	/* output voltage */
+	inno_write(inno, 0xb5, phy_cfg->regs[2]);
+	inno_write(inno, 0xb6, phy_cfg->regs[3]);
+	inno_write(inno, 0xb7, phy_cfg->regs[3]);
+	inno_write(inno, 0xb8, phy_cfg->regs[3]);
+
+	/* pre-emphasis */
+	inno_write(inno, 0xbb, phy_cfg->regs[4]);
+	inno_write(inno, 0xbc, phy_cfg->regs[4]);
+	inno_write(inno, 0xbd, phy_cfg->regs[4]);
+
+	/* enable LDO */
+	inno_write(inno, 0xb4, 0x7);
+
+	/* enable serializer */
+	inno_write(inno, 0xbe, 0x70);
+
+	inno_write(inno, 0xb2, 0x0f);
+
+	for (val = 0; val < 5; val++) {
+		if (inno_read(inno, 0xaf) & 1)
+			break;
+		udelay(1000);
+	}
+	if (!(inno_read(inno, 0xaf) & 1)) {
+		dev_err(inno->dev, "HDMI PHY Post PLL unlock\n");
+		return -ETIMEDOUT;
+	}
+
+	/* set termination resistance */
+	if (phy_cfg->tmdsclock > 340000000) {
+		inno_write(inno, 0xc7, 0x76);
+		inno_write(inno, 0xc5, 0x83);
+		inno_write(inno, 0xc8, 0x00);
+		inno_write(inno, 0xc9, 0x2f);
+		inno_write(inno, 0xca, 0x2f);
+		inno_write(inno, 0xcb, 0x2f);
+	} else {
+		inno_write(inno, 0xc7, 0x76);
+		inno_write(inno, 0xc5, 0x83);
+		inno_write(inno, 0xc8, 0x00);
+		inno_write(inno, 0xc9, 0x0f);
+		inno_write(inno, 0xca, 0x0f);
+		inno_write(inno, 0xcb, 0x0f);
+	}
+
+
+	/* set TMDS sync detection counter length */
+	temp = 47520000000UL / tmdsclock;
+	inno_write(inno, 0xd8, (temp >> 8) & 0xff);
+	inno_write(inno, 0xd9, temp & 0xff);
+
+	if (phy_cfg->tmdsclock > 340000000)
+		mdelay(100);
+	/* set pdata_en to 0/1 */
+	inno_update_bits(inno, 0x02, 1, 0);
+	inno_update_bits(inno, 0x02, 1, 1);
+
+	/* Enable PHY IRQ */
+	inno_write(inno, 0x05, 0x22);
+	inno_write(inno, 0x07, 0x22);
+	inno_write(inno, 0xcc, 0x0f);
+
+	return 0;
+}
+
+static void inno_hdmi_phy_rk3528_power_off(struct inno_hdmi_phy *inno)
+{
+	/* Power off driver */
+	inno_write(inno, 0xb2, 0);
+	/* Power off band gap */
+	inno_update_bits(inno, 0xb0, 4, 0);
+	/* Power off post pll */
+	inno_update_bits(inno, 0xaa, 1, 1);
+
+	/* Disable PHY IRQ */
+	inno_write(inno, 0x05, 0);
+	inno_write(inno, 0x07, 0);
+}
+
+static void inno_hdmi_phy_rk3528_init(struct inno_hdmi_phy *inno)
+{
+	/*
+	 * Use phy internal register control
+	 * rxsense/poweron/pllpd/pdataen signal.
+	 */
+	inno_write(inno, 0x02, 0x81);
+}
+
+static int
+inno_hdmi_phy_rk3528_pre_pll_update(struct inno_hdmi_phy *inno,
+				    const struct pre_pll_config *cfg)
+{
+	u32 val;
+
+	inno_update_bits(inno, 0xb0, 4, 4);
+	inno_write(inno, 0xcc, 0x0f);
+
+	/* Power on PLL */
+	inno_update_bits(inno, 0xa0, 1, 0);
+	/* Configure pre-pll */
+	inno_update_bits(inno, 0xa0, 2, (cfg->vco_div_5_en & 1) << 1);
+	inno_write(inno, 0xa1, cfg->prediv);
+	if (cfg->fracdiv)
+		val = ((cfg->fbdiv >> 8) & 0x0f) | 0xc0;
+	else
+		val = ((cfg->fbdiv >> 8) & 0x0f) | 0xf0;
+	inno_write(inno, 0xa2, val);
+	inno_write(inno, 0xa3, cfg->fbdiv & 0xff);
+	val = (cfg->pclk_div_a & 0x1f) |
+	      ((cfg->pclk_div_b & 3) << 5);
+	inno_write(inno, 0xa5, val);
+	val = (cfg->pclk_div_d & 0x1f) |
+	      ((cfg->pclk_div_c & 3) << 5);
+	inno_write(inno, 0xa6, val);
+	val = ((cfg->tmds_div_a & 3) << 4) |
+	      ((cfg->tmds_div_b & 3) << 2) |
+	      (cfg->tmds_div_c & 3);
+	inno_write(inno, 0xa4, val);
+
+	if (cfg->fracdiv) {
+		val = cfg->fracdiv & 0xff;
+		inno_write(inno, 0xd3, val);
+		val = (cfg->fracdiv >> 8) & 0xff;
+		inno_write(inno, 0xd2, val);
+		val = (cfg->fracdiv >> 16) & 0xff;
+		inno_write(inno, 0xd1, val);
+	} else {
+		inno_write(inno, 0xd3, 0);
+		inno_write(inno, 0xd2, 0);
+		inno_write(inno, 0xd1, 0);
+	}
+
+	/* Wait for PLL lock */
+	for (val = 0; val < 5; val++) {
+		if (inno_read(inno, 0xa9) & 1)
+			break;
+		udelay(1000);
+	}
+	if (val == 5) {
+		dev_err(inno->dev, "Pre-PLL unlock\n");
+		return -ETIMEDOUT;
+	}
+
+	return 0;
+}
+
+static unsigned long
+inno_hdmi_rk3528_phy_pll_recalc_rate(struct inno_hdmi_phy *inno,
+				     unsigned long parent_rate)
+{
+	unsigned long frac;
+	u8 nd, no_a, no_b, no_d;
+	u16 nf;
+	u64 vco = parent_rate;
+
+	nd = inno_read(inno, 0xa1) & 0x3f;
+	nf = ((inno_read(inno, 0xa2) & 0x0f) << 8) | inno_read(inno, 0xa3);
+	vco *= nf;
+	if ((inno_read(inno, 0xa2) & 0x30) == 0) {
+		frac = inno_read(inno, 0xd3) |
+		       (inno_read(inno, 0xd2) << 8) |
+		       (inno_read(inno, 0xd1) << 16);
+		vco += DIV_ROUND_CLOSEST(parent_rate * frac, (1 << 24));
+	}
+	if (inno_read(inno, 0xa0) & 2) {
+		do_div(vco, nd * 5);
+	} else {
+		no_a = inno_read(inno, 0xa5) & 0x1f;
+		no_b = ((inno_read(inno, 0xa5) >> 5) & 7) + 2;
+		no_d = inno_read(inno, 0xa6) & 0x1f;
+		if (no_a == 1)
+			do_div(vco, nd * no_b * no_d * 2);
+		else
+			do_div(vco, nd * no_a * no_d * 2);
+	}
+
+	frac = vco;
+	inno->pixclock = DIV_ROUND_CLOSEST(frac, 1000) * 1000;
+
+	dev_dbg(inno->dev, "%s rate %lu\n", __func__, inno->pixclock);
+
+	return frac;
+}
+
+#ifndef CONFIG_SPL_BUILD
 #define PHY_TAB_LEN 60
 
 static
@@ -889,6 +1163,7 @@
 
 	return 0;
 }
+#endif
 
 static const struct inno_hdmi_phy_ops rk3228_hdmi_phy_ops = {
 	.init = inno_hdmi_phy_rk3228_init,
@@ -905,6 +1180,14 @@
 	.recalc_rate = inno_hdmi_3328_phy_pll_recalc_rate,
 };
 
+static const struct inno_hdmi_phy_ops rk3528_hdmi_phy_ops = {
+	.init = inno_hdmi_phy_rk3528_init,
+	.power_on = inno_hdmi_phy_rk3528_power_on,
+	.power_off = inno_hdmi_phy_rk3528_power_off,
+	.pre_pll_update = inno_hdmi_phy_rk3528_pre_pll_update,
+	.recalc_rate = inno_hdmi_rk3528_phy_pll_recalc_rate,
+};
+
 static const struct inno_hdmi_phy_drv_data rk3228_hdmi_phy_drv_data = {
 	.dev_type = INNO_HDMI_PHY_RK3228,
 	.ops = &rk3228_hdmi_phy_ops,
@@ -917,6 +1200,12 @@
 	.phy_cfg_table = rk3328_phy_cfg,
 };
 
+static const struct inno_hdmi_phy_drv_data rk3528_hdmi_phy_drv_data = {
+	.dev_type = INNO_HDMI_PHY_RK3528,
+	.ops = &rk3528_hdmi_phy_ops,
+	.phy_cfg_table = rk3528_phy_cfg,
+};
+
 static const struct rockchip_inno_data inno_hdmi_phy_of_match[] = {
 	{ .compatible = "rockchip,rk3228-hdmi-phy",
 	  .data = &rk3228_hdmi_phy_drv_data
@@ -924,26 +1213,41 @@
 	{ .compatible = "rockchip,rk3328-hdmi-phy",
 	  .data = &rk3328_hdmi_phy_drv_data
 	},
+	{ .compatible = "rockchip,rk3528-hdmi-phy",
+	  .data = &rk3528_hdmi_phy_drv_data
+	},
 	{}
 };
 
 static int inno_hdmi_phy_init(struct rockchip_phy *phy)
 {
+#ifdef CONFIG_SPL_BUILD
+	struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data;
+#else
 	struct udevice *dev = phy->dev;
 	struct inno_hdmi_phy *inno = dev_get_priv(phy->dev);
-	int i, val, phy_table_size, ret;
-	const char *name;
+	int val, phy_table_size, ret;
 	u32 *phy_config;
+#endif
+	int i;
+	const char *name;
 
-	inno->node = dev->node;
-
+#ifdef CONFIG_SPL_BUILD
+	inno->regs = (void *)RK3528_HDMIPHY_BASE;
+#else
 	inno->regs = dev_read_addr_ptr(dev);
+	inno->node = dev->node;
+#endif
 	if (!inno->regs) {
 		printf("%s: failed to get phy address\n", __func__);
 		return -ENOMEM;
 	}
 
+#ifdef CONFIG_SPL_BUILD
+	name = "rockchip,rk3528-hdmi-phy";
+#else
 	name = dev_read_string(dev, "compatible");
+#endif
 	for (i = 0; i < ARRAY_SIZE(inno_hdmi_phy_of_match); i++) {
 		if (!strcmp(name, inno_hdmi_phy_of_match[i].compatible)) {
 			inno->plat_data = inno_hdmi_phy_of_match[i].data;
@@ -951,6 +1255,7 @@
 		}
 	}
 
+#ifndef CONFIG_SPL_BUILD
 	dev_read_prop(dev, "rockchip,phy-table", &val);
 
 	if (val >= 0) {
@@ -986,6 +1291,7 @@
 	} else {
 		printf("use default hdmi phy table\n");
 	}
+#endif
 
 	if (i >= ARRAY_SIZE(inno_hdmi_phy_of_match))
 		return 0;
@@ -1002,8 +1308,16 @@
 static unsigned long inno_hdmi_phy_set_pll(struct rockchip_phy *phy,
 					   unsigned long rate)
 {
+#ifdef CONFIG_SPL_BUILD
+	struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data;
+#else
 	struct inno_hdmi_phy *inno = dev_get_priv(phy->dev);
+#endif
 
+#ifdef CONFIG_SPL_BUILD
+	if (!inno)
+		inno = g_inno;
+#endif
 	inno_hdmi_phy_clk_prepare(inno);
 	inno_hdmi_phy_clk_is_prepared(inno);
 	inno_hdmi_phy_clk_set_rate(inno, rate);
@@ -1013,7 +1327,11 @@
 static int
 inno_hdmi_phy_set_bus_width(struct rockchip_phy *phy, u32 bus_width)
 {
+#ifdef CONFIG_SPL_BUILD
+	struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data;
+#else
 	struct inno_hdmi_phy *inno = dev_get_priv(phy->dev);
+#endif
 
 	inno->bus_width = bus_width;
 
@@ -1023,7 +1341,11 @@
 static long
 inno_hdmi_phy_clk_round_rate(struct rockchip_phy *phy, unsigned long rate)
 {
+#ifdef CONFIG_SPL_BUILD
+	struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data;
+#else
 	struct inno_hdmi_phy *inno = dev_get_priv(phy->dev);
+#endif
 	int i;
 	const struct pre_pll_config *cfg = pre_pll_cfg_table;
 	u32 tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, rate);
@@ -1082,9 +1404,26 @@
 	 .compatible = "rockchip,rk3228-hdmi-phy",
 	 .data = (ulong)&inno_hdmi_phy_driver_data,
 	},
+	{
+	 .compatible = "rockchip,rk3528-hdmi-phy",
+	 .data = (ulong)&inno_hdmi_phy_driver_data,
+	},
 	{}
 };
 
+#ifdef CONFIG_SPL_BUILD
+int inno_spl_hdmi_phy_probe(struct display_state *state)
+{
+	struct inno_hdmi_phy *inno = malloc(sizeof(struct inno_hdmi_phy));
+
+	memset(inno, 0, sizeof(*inno));
+	g_inno = inno;
+
+	state->conn_state.connector->phy = &inno_hdmi_phy_driver_data;
+	state->conn_state.connector->phy->data = (void *)inno;
+	return 0;
+}
+#else
 static int inno_hdmi_phy_probe(struct udevice *dev)
 {
 	struct inno_hdmi_phy *inno = dev_get_priv(dev);
@@ -1094,6 +1433,32 @@
 	inno->dev = dev;
 	phy->dev = dev;
 
+	g_inno = inno;
+	dev->driver_data = (ulong)&inno_hdmi_phy_driver_data;
+	phy = &inno_hdmi_phy_driver_data;
+
+	return 0;
+}
+#endif
+
+static int rockchip_inno_phy_hdmi_bind(struct udevice *parent)
+{
+	struct udevice *child;
+	ofnode subnode;
+	int ret;
+
+	subnode = ofnode_find_subnode(parent->node, "clk-port");
+	if (!ofnode_valid(subnode)) {
+		printf("%s: no subnode for %s\n", __func__, parent->name);
+		return -ENXIO;
+	}
+
+	ret = device_bind_driver_to_node(parent, "clk_inno_hdmi", "inno_hdmi_pll_clk", subnode, &child);
+	if (ret) {
+		printf("%s: clk-port cannot bind its driver\n", __func__);
+		return ret;
+	}
+
 	return 0;
 }
 
@@ -1101,6 +1466,57 @@
 	.name = "inno_hdmi_phy",
 	.id = UCLASS_PHY,
 	.of_match = inno_hdmi_phy_ids,
+#ifndef CONFIG_SPL_BUILD
 	.probe = inno_hdmi_phy_probe,
+#endif
+	.bind = rockchip_inno_phy_hdmi_bind,
 	.priv_auto_alloc_size = sizeof(struct inno_hdmi_phy),
 };
+
+
+static ulong inno_hdmi_clk_get_rate(struct clk *clk)
+{
+	struct clk_inno_hdmi *priv = dev_get_priv(clk->dev);
+
+	return priv->rate;
+}
+
+static ulong inno_hdmi_clk_set_rate(struct clk *clk, ulong rate)
+{
+	struct clk_inno_hdmi *priv = dev_get_priv(clk->dev);
+	int ret;
+
+	inno_hdmi_phy_clk_prepare(g_inno);
+	inno_hdmi_phy_clk_is_prepared(g_inno);
+	ret = inno_hdmi_phy_clk_set_rate(g_inno, rate);
+	if (ret < 0) {
+		printf("inno hdmi set rate failed ret:%d\n", ret);
+		return ret;
+	}
+
+	priv->rate = g_inno->pixclock;
+
+	return priv->rate;
+}
+
+static const struct clk_ops inno_hdmi_clk_ops = {
+	.get_rate	= inno_hdmi_clk_get_rate,
+	.set_rate	= inno_hdmi_clk_set_rate,
+};
+
+static int inno_hdmi_clk_probe(struct udevice *dev)
+{
+	return 0;
+}
+
+/*
+ * In order for other display interfaces to use hdmiphy as source
+ * for dclk, hdmiphy must register a virtual clock driver
+ */
+U_BOOT_DRIVER(clk_inno_hdmi) = {
+	.name		= "clk_inno_hdmi",
+	.id		= UCLASS_CLK,
+	.priv_auto_alloc_size = sizeof(struct clk_inno_hdmi),
+	.ops		= &inno_hdmi_clk_ops,
+	.probe		= inno_hdmi_clk_probe,
+};
diff --git a/u-boot/drivers/video/drm/rockchip_connector.c b/u-boot/drivers/video/drm/rockchip_connector.c
index fb7adfa..2eb8319 100644
--- a/u-boot/drivers/video/drm/rockchip_connector.c
+++ b/u-boot/drivers/video/drm/rockchip_connector.c
@@ -15,6 +15,19 @@
 #include "rockchip_connector.h"
 #include "rockchip_phy.h"
 
+#ifdef CONFIG_SPL_BUILD
+int rockchip_connector_bind(struct rockchip_connector *conn, struct udevice *dev, int id,
+			    const struct rockchip_connector_funcs *funcs, void *data, int type)
+{
+	conn->id = id;
+	conn->funcs = funcs;
+	conn->data = data;
+	conn->type = type;
+
+	return 0;
+}
+
+#else
 static LIST_HEAD(rockchip_connector_list);
 
 int rockchip_connector_bind(struct rockchip_connector *conn, struct udevice *dev, int id,
@@ -105,21 +118,6 @@
 	return ret;
 }
 
-int rockchip_connector_deinit(struct display_state *state)
-{
-	struct rockchip_connector *conn;
-
-	conn = state->conn_state.connector;
-	if (conn->funcs->deinit) {
-		conn->funcs->deinit(conn, state);
-		if (state->conn_state.secondary) {
-			conn = state->conn_state.secondary;
-			conn->funcs->deinit(conn, state);
-		}
-	}
-
-	return 0;
-}
 
 static bool rockchip_connector_path_detect(struct rockchip_connector *conn,
 					   struct display_state *state)
@@ -322,3 +320,20 @@
 
 	return 0;
 }
+#endif
+
+int rockchip_connector_deinit(struct display_state *state)
+{
+	struct rockchip_connector *conn;
+
+	conn = state->conn_state.connector;
+	if (conn->funcs->deinit) {
+		conn->funcs->deinit(conn, state);
+		if (state->conn_state.secondary) {
+			conn = state->conn_state.secondary;
+			conn->funcs->deinit(conn, state);
+		}
+	}
+
+	return 0;
+}
diff --git a/u-boot/drivers/video/drm/rockchip_connector.h b/u-boot/drivers/video/drm/rockchip_connector.h
index 39a81e4..8c2ff75 100644
--- a/u-boot/drivers/video/drm/rockchip_connector.h
+++ b/u-boot/drivers/video/drm/rockchip_connector.h
@@ -7,6 +7,17 @@
 #ifndef _ROCKCHIP_CONNECTOR_H_
 #define _ROCKCHIP_CONNECTOR_H_
 
+#ifdef CONFIG_SPL_BUILD
+struct rockchip_connector {
+	struct rockchip_phy *phy;
+	int id;
+	int type;
+	bool hpd;
+
+	const struct rockchip_connector_funcs *funcs;
+	void *data;
+};
+#else
 #include "rockchip_bridge.h"
 #include "rockchip_panel.h"
 
@@ -18,10 +29,123 @@
 	struct list_head head;
 	int id;
 	int type;
+	bool hpd;
 
 	const struct rockchip_connector_funcs *funcs;
 	void *data;
 };
+#endif
+
+/**
+ * enum drm_bus_flags - bus_flags info for &drm_display_info
+ *
+ * This enum defines signal polarities and clock edge information for signals on
+ * a bus as bitmask flags.
+ *
+ * The clock edge information is conveyed by two sets of symbols,
+ * DRM_BUS_FLAGS_*_DRIVE_\* and DRM_BUS_FLAGS_*_SAMPLE_\*. When this enum is
+ * used to describe a bus from the point of view of the transmitter, the
+ * \*_DRIVE_\* flags should be used. When used from the point of view of the
+ * receiver, the \*_SAMPLE_\* flags should be used. The \*_DRIVE_\* and
+ * \*_SAMPLE_\* flags alias each other, with the \*_SAMPLE_POSEDGE and
+ * \*_SAMPLE_NEGEDGE flags being equal to \*_DRIVE_NEGEDGE and \*_DRIVE_POSEDGE
+ * respectively. This simplifies code as signals are usually sampled on the
+ * opposite edge of the driving edge. Transmitters and receivers may however
+ * need to take other signal timings into account to convert between driving
+ * and sample edges.
+ */
+enum drm_bus_flags {
+	/**
+	 * @DRM_BUS_FLAG_DE_LOW:
+	 *
+	 * The Data Enable signal is active low
+	 */
+	DRM_BUS_FLAG_DE_LOW = BIT(0),
+
+	/**
+	 * @DRM_BUS_FLAG_DE_HIGH:
+	 *
+	 * The Data Enable signal is active high
+	 */
+	DRM_BUS_FLAG_DE_HIGH = BIT(1),
+
+	/**
+	 * @DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE:
+	 *
+	 * Data is driven on the rising edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE = BIT(2),
+
+	/**
+	 * @DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE:
+	 *
+	 * Data is driven on the falling edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE = BIT(3),
+
+	/**
+	 * @DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE:
+	 *
+	 * Data is sampled on the rising edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
+
+	/**
+	 * @DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE:
+	 *
+	 * Data is sampled on the falling edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
+
+	/**
+	 * @DRM_BUS_FLAG_DATA_MSB_TO_LSB:
+	 *
+	 * Data is transmitted MSB to LSB on the bus
+	 */
+	DRM_BUS_FLAG_DATA_MSB_TO_LSB = BIT(4),
+
+	/**
+	 * @DRM_BUS_FLAG_DATA_LSB_TO_MSB:
+	 *
+	 * Data is transmitted LSB to MSB on the bus
+	 */
+	DRM_BUS_FLAG_DATA_LSB_TO_MSB = BIT(5),
+
+	/**
+	 * @DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE:
+	 *
+	 * Sync signals are driven on the rising edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE = BIT(6),
+
+	/**
+	 * @DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE:
+	 *
+	 * Sync signals are driven on the falling edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE = BIT(7),
+
+	/**
+	 * @DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE:
+	 *
+	 * Sync signals are sampled on the rising edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE = DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE,
+
+	/**
+	 * @DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE:
+	 *
+	 * Sync signals are sampled on the falling edge of the pixel clock
+	 */
+	DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE = DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE,
+
+	/**
+	 * @DRM_BUS_FLAG_SHARP_SIGNALS:
+	 *
+	 *  Set if the Sharp-specific signals (SPL, CLS, PS, REV) must be used
+	 */
+	DRM_BUS_FLAG_SHARP_SIGNALS = BIT(8),
+};
 
 struct rockchip_connector_funcs {
 	/*
diff --git a/u-boot/drivers/video/drm/rockchip_crtc.c b/u-boot/drivers/video/drm/rockchip_crtc.c
index 1e7376d..447bbf6 100644
--- a/u-boot/drivers/video/drm/rockchip_crtc.c
+++ b/u-boot/drivers/video/drm/rockchip_crtc.c
@@ -20,6 +20,7 @@
 #include "rockchip_crtc.h"
 #include "rockchip_connector.h"
 
+#ifndef CONFIG_SPL_BUILD
 static const struct udevice_id rockchip_vp_ids[] = {
 	{ .compatible = "rockchip-vp" },
 	{ }
@@ -111,6 +112,16 @@
 	.data = &rk3328_vop,
 };
 
+static const struct rockchip_crtc rk3528_vop_data = {
+	.funcs = &rockchip_vop2_funcs,
+	.data = &rk3528_vop,
+};
+
+static const struct rockchip_crtc rk3562_vop_data = {
+	.funcs = &rockchip_vop2_funcs,
+	.data = &rk3562_vop,
+};
+
 static const struct rockchip_crtc rk3568_vop_data = {
 	.funcs = &rockchip_vop2_funcs,
 	.data = &rk3568_vop,
@@ -174,6 +185,12 @@
 		.compatible = "rockchip,rk3328-vop",
 		.data = (ulong)&rk3328_vop_data,
 	}, {
+		.compatible = "rockchip,rk3528-vop",
+		.data = (ulong)&rk3528_vop_data,
+	}, {
+		.compatible = "rockchip,rk3562-vop",
+		.data = (ulong)&rk3562_vop_data,
+	}, {
 		.compatible = "rockchip,rk3568-vop",
 		.data = (ulong)&rk3568_vop_data,
 	}, {
@@ -186,6 +203,13 @@
 {
 	struct udevice *child;
 	int ret;
+
+	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
+	ret = clk_set_defaults(dev);
+	if (ret) {
+		dev_err(dev, "%s clk_set_defaults failed %d\n", __func__, ret);
+		return ret;
+	}
 
 	for (device_find_first_child(dev, &child);
 	     child;
@@ -237,3 +261,19 @@
 	.id		= UCLASS_VIDEO_CRTC,
 	.name		= "CRTC",
 };
+
+#else
+static struct rockchip_crtc rk3528_vop_data = {
+	.funcs = &rockchip_vop2_funcs,
+	.data = &rk3528_vop,
+};
+
+int rockchip_spl_vop_probe(struct crtc_state *crtc_state)
+{
+
+	crtc_state->crtc = &rk3528_vop_data;
+
+	return 0;
+}
+#endif
+
diff --git a/u-boot/drivers/video/drm/rockchip_crtc.h b/u-boot/drivers/video/drm/rockchip_crtc.h
index b28e8dd..1078f8c 100644
--- a/u-boot/drivers/video/drm/rockchip_crtc.h
+++ b/u-boot/drivers/video/drm/rockchip_crtc.h
@@ -44,7 +44,11 @@
 	int (*send_mcu_cmd)(struct display_state *state, u32 type, u32 value);
 	int (*check)(struct display_state *state);
 	int (*mode_valid)(struct display_state *state);
+	int (*mode_fixup)(struct display_state *state);
 	int (*plane_check)(struct display_state *state);
+	int (*regs_dump)(struct display_state *state);
+	int (*active_regs_dump)(struct display_state *state);
+	int (*apply_soft_te)(struct display_state *state);
 };
 
 struct vop_data;
@@ -67,6 +71,8 @@
 extern const struct vop_data rv1106_vop;
 extern const struct vop_data rv1108_vop;
 extern const struct vop_data rv1126_vop;
+extern const struct vop2_data rk3528_vop;
+extern const struct vop2_data rk3562_vop;
 extern const struct vop2_data rk3568_vop;
 extern const struct vop2_data rk3588_vop;
 #endif
diff --git a/u-boot/drivers/video/drm/rockchip_display.c b/u-boot/drivers/video/drm/rockchip_display.c
index b6e8774..96ef65e 100644
--- a/u-boot/drivers/video/drm/rockchip_display.c
+++ b/u-boot/drivers/video/drm/rockchip_display.c
@@ -57,7 +57,7 @@
 static unsigned long cubic_lut_memory_start;
 static unsigned long memory_end;
 static struct base2_info base_parameter;
-static uint32_t crc32_table[256];
+static u32 align_size = PAGE_SIZE;
 
 /*
  * the phy types are used by different connectors in public.
@@ -75,41 +75,6 @@
 	int public_phy_type;
 	bool phy_init;
 };
-
-void rockchip_display_make_crc32_table(void)
-{
-	uint32_t c;
-	int n, k;
-	unsigned long poly;		/* polynomial exclusive-or pattern */
-	/* terms of polynomial defining this crc (except x^32): */
-	static const char p[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26};
-
-	/* make exclusive-or pattern from polynomial (0xedb88320L) */
-	poly = 0L;
-	for (n = 0; n < sizeof(p) / sizeof(char); n++)
-		poly |= 1L << (31 - p[n]);
-
-	for (n = 0; n < 256; n++) {
-		c = (unsigned long)n;
-		for (k = 0; k < 8; k++)
-		c = c & 1 ? poly ^ (c >> 1) : c >> 1;
-		crc32_table[n] = cpu_to_le32(c);
-	}
-}
-
-uint32_t rockchip_display_crc32c_cal(unsigned char *data, int length)
-{
-	int i;
-	uint32_t crc;
-	crc = 0xFFFFFFFF;
-
-	for (i = 0; i < length; i++) {
-		crc = crc32_table[(crc ^ *data) & 0xff] ^ (crc >> 8);
-		data++;
-	}
-
-	return crc ^ 0xffffffff;
-}
 
 int rockchip_get_baseparameter(void)
 {
@@ -152,6 +117,7 @@
 	struct base2_disp_header *disp_header;
 	int i = 0, offset = -1;
 	u32 crc_val;
+	u32 base2_length;
 	void *base_parameter_addr = (void *)&base_parameter;
 
 	for (i = 0; i < 8; i++) {
@@ -178,11 +144,23 @@
 	if (strncasecmp(disp_info->disp_head_flag, "DISP", 4))
 		return NULL;
 
-	crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, sizeof(struct base2_disp_info) - 4);
-
-	if (crc_val != disp_info->crc) {
-		printf("error: connector type[%d], id[%d] disp info crc check error\n", type, id);
-		return NULL;
+	if (base_parameter.major_version == 3 && base_parameter.minor_version == 0) {
+		crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info,
+						      sizeof(struct base2_disp_info) - 4);
+		if (crc_val != disp_info->crc2) {
+			printf("error: connector type[%d], id[%d] disp info crc2 check error\n",
+			       type, id);
+			return NULL;
+		}
+	} else {
+		base2_length = sizeof(struct base2_disp_info) - sizeof(struct csc_info) -
+			       sizeof(struct acm_data) - 10 * 1024 - 4;
+		crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, base2_length - 4);
+		if (crc_val != disp_info->crc) {
+			printf("error: connector type[%d], id[%d] disp info crc check error\n",
+			       type, id);
+			return NULL;
+		}
 	}
 
 	return disp_info;
@@ -253,9 +231,9 @@
 
 static void init_display_buffer(ulong base)
 {
-	memory_start = base + DRM_ROCKCHIP_FB_SIZE;
+	memory_start = ALIGN(base + DRM_ROCKCHIP_FB_SIZE, align_size);
 	memory_end = memory_start;
-	cubic_lut_memory_start = memory_start + MEMORY_POOL_SIZE;
+	cubic_lut_memory_start = ALIGN(memory_start + MEMORY_POOL_SIZE, align_size);
 }
 
 void *get_display_buffer(int size)
@@ -340,38 +318,15 @@
 	return 0;
 }
 
-int drm_mode_vrefresh(const struct drm_display_mode *mode)
-{
-	int refresh = 0;
-	unsigned int calc_val;
-
-	if (mode->vrefresh > 0) {
-		refresh = mode->vrefresh;
-	} else if (mode->htotal > 0 && mode->vtotal > 0) {
-		int vtotal;
-
-		vtotal = mode->vtotal;
-		/* work out vrefresh the value will be x1000 */
-		calc_val = (mode->clock * 1000);
-		calc_val /= mode->htotal;
-		refresh = (calc_val + vtotal / 2) / vtotal;
-
-		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
-			refresh *= 2;
-		if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
-			refresh /= 2;
-		if (mode->vscan > 1)
-			refresh /= mode->vscan;
-	}
-	return refresh;
-}
-
-int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode)
+int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode, u32 *bus_flags)
 {
 	int hactive, vactive, pixelclock;
 	int hfront_porch, hback_porch, hsync_len;
 	int vfront_porch, vback_porch, vsync_len;
 	int val, flags = 0;
+
+#define FDT_GET_BOOL(val, name) \
+	val = ofnode_read_bool(node, name);
 
 #define FDT_GET_INT(val, name) \
 	val = ofnode_read_s32_default(node, name, -1); \
@@ -396,8 +351,18 @@
 	flags |= val ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
 	FDT_GET_INT(val, "vsync-active");
 	flags |= val ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
+
+	FDT_GET_BOOL(val, "interlaced");
+	flags |= val ? DRM_MODE_FLAG_INTERLACE : 0;
+	FDT_GET_BOOL(val, "doublescan");
+	flags |= val ? DRM_MODE_FLAG_DBLSCAN : 0;
+	FDT_GET_BOOL(val, "doubleclk");
+	flags |= val ? DISPLAY_FLAGS_DOUBLECLK : 0;
+
+	FDT_GET_INT(val, "de-active");
+	*bus_flags |= val ? DRM_BUS_FLAG_DE_HIGH : DRM_BUS_FLAG_DE_LOW;
 	FDT_GET_INT(val, "pixelclk-active");
-	flags |= val ? DRM_MODE_FLAG_PPIXDATA : 0;
+	*bus_flags |= val ? DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE : DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE;
 
 	FDT_GET_INT_DEFAULT(val, "screen-rotate", 0);
 	if (val == DRM_MODE_FLAG_XMIRROR) {
@@ -425,11 +390,13 @@
 	return 0;
 }
 
-static int display_get_force_timing_from_dts(ofnode node, struct drm_display_mode *mode)
+static int display_get_force_timing_from_dts(ofnode node,
+					     struct drm_display_mode *mode,
+					     u32 *bus_flags)
 {
 	int ret = 0;
 
-	ret = rockchip_ofnode_get_display_mode(node, mode);
+	ret = rockchip_ofnode_get_display_mode(node, mode, bus_flags);
 
 	if (ret) {
 		mode->clock = 74250;
@@ -456,14 +423,24 @@
 }
 
 static int display_get_timing_from_dts(struct rockchip_panel *panel,
-				       struct drm_display_mode *mode)
+				       struct drm_display_mode *mode,
+				       u32 *bus_flags)
 {
 	struct ofnode_phandle_args args;
-	ofnode dt, timing;
+	ofnode dt, timing, mcu_panel;
 	int ret;
 
+	mcu_panel = dev_read_subnode(panel->dev, "mcu-panel");
 	dt = dev_read_subnode(panel->dev, "display-timings");
 	if (ofnode_valid(dt)) {
+		ret = ofnode_parse_phandle_with_args(dt, "native-mode", NULL,
+						     0, 0, &args);
+		if (ret)
+			return ret;
+
+		timing = args.node;
+	} else if (ofnode_valid(mcu_panel)) {
+		dt = ofnode_find_subnode(mcu_panel, "display-timings");
 		ret = ofnode_parse_phandle_with_args(dt, "native-mode", NULL,
 						     0, 0, &args);
 		if (ret)
@@ -479,163 +456,26 @@
 		return -ENXIO;
 	}
 
-	rockchip_ofnode_get_display_mode(timing, mode);
+	rockchip_ofnode_get_display_mode(timing, mode, bus_flags);
+
+	if (IS_ENABLED(CONFIG_ROCKCHIP_RK3568) || IS_ENABLED(CONFIG_ROCKCHIP_RK3588)) {
+		if (mode->hdisplay % 4) {
+			int old_hdisplay = mode->hdisplay;
+			int align = 4 - (mode->hdisplay % 4);
+
+			mode->hdisplay += align;
+			mode->hsync_start += align;
+			mode->hsync_end += align;
+			mode->htotal += align;
+
+			ofnode_write_u32_array(timing, "hactive", (u32 *)&mode->hdisplay, 1);
+
+			printf("WARN: hactive need to be aligned with 4-pixel, %d -> %d\n",
+				old_hdisplay, mode->hdisplay);
+		}
+	}
 
 	return 0;
-}
-
-/**
- * drm_mode_max_resolution_filter - mark modes out of vop max resolution
- * @edid_data: structure store mode list
- * @max_output: vop max output resolution
- */
-void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data,
-				    struct vop_rect *max_output)
-{
-	int i;
-
-	for (i = 0; i < edid_data->modes; i++) {
-		if (edid_data->mode_buf[i].hdisplay > max_output->width ||
-		    edid_data->mode_buf[i].vdisplay > max_output->height)
-			edid_data->mode_buf[i].invalid = true;
-	}
-}
-
-/**
- * drm_mode_set_crtcinfo - set CRTC modesetting timing parameters
- * @p: mode
- * @adjust_flags: a combination of adjustment flags
- *
- * Setup the CRTC modesetting timing parameters for @p, adjusting if necessary.
- *
- * - The CRTC_INTERLACE_HALVE_V flag can be used to halve vertical timings of
- *   interlaced modes.
- * - The CRTC_STEREO_DOUBLE flag can be used to compute the timings for
- *   buffers containing two eyes (only adjust the timings when needed, eg. for
- *   "frame packing" or "side by side full").
- * - The CRTC_NO_DBLSCAN and CRTC_NO_VSCAN flags request that adjustment *not*
- *   be performed for doublescan and vscan > 1 modes respectively.
- */
-void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags)
-{
-	if ((p == NULL) || ((p->type & DRM_MODE_TYPE_CRTC_C) == DRM_MODE_TYPE_BUILTIN))
-		return;
-
-	if (p->flags & DRM_MODE_FLAG_DBLCLK)
-		p->crtc_clock = 2 * p->clock;
-	else
-		p->crtc_clock = p->clock;
-	p->crtc_hdisplay = p->hdisplay;
-	p->crtc_hsync_start = p->hsync_start;
-	p->crtc_hsync_end = p->hsync_end;
-	p->crtc_htotal = p->htotal;
-	p->crtc_hskew = p->hskew;
-	p->crtc_vdisplay = p->vdisplay;
-	p->crtc_vsync_start = p->vsync_start;
-	p->crtc_vsync_end = p->vsync_end;
-	p->crtc_vtotal = p->vtotal;
-
-	if (p->flags & DRM_MODE_FLAG_INTERLACE) {
-		if (adjust_flags & CRTC_INTERLACE_HALVE_V) {
-			p->crtc_vdisplay /= 2;
-			p->crtc_vsync_start /= 2;
-			p->crtc_vsync_end /= 2;
-			p->crtc_vtotal /= 2;
-		}
-	}
-
-	if (!(adjust_flags & CRTC_NO_DBLSCAN)) {
-		if (p->flags & DRM_MODE_FLAG_DBLSCAN) {
-			p->crtc_vdisplay *= 2;
-			p->crtc_vsync_start *= 2;
-			p->crtc_vsync_end *= 2;
-			p->crtc_vtotal *= 2;
-		}
-	}
-
-	if (!(adjust_flags & CRTC_NO_VSCAN)) {
-		if (p->vscan > 1) {
-			p->crtc_vdisplay *= p->vscan;
-			p->crtc_vsync_start *= p->vscan;
-			p->crtc_vsync_end *= p->vscan;
-			p->crtc_vtotal *= p->vscan;
-		}
-	}
-
-	if (adjust_flags & CRTC_STEREO_DOUBLE) {
-		unsigned int layout = p->flags & DRM_MODE_FLAG_3D_MASK;
-
-		switch (layout) {
-		case DRM_MODE_FLAG_3D_FRAME_PACKING:
-			p->crtc_clock *= 2;
-			p->crtc_vdisplay += p->crtc_vtotal;
-			p->crtc_vsync_start += p->crtc_vtotal;
-			p->crtc_vsync_end += p->crtc_vtotal;
-			p->crtc_vtotal += p->crtc_vtotal;
-			break;
-		}
-	}
-
-	p->crtc_vblank_start = min(p->crtc_vsync_start, p->crtc_vdisplay);
-	p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal);
-	p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay);
-	p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal);
-}
-
-/**
- * drm_mode_is_420_only - if a given videomode can be only supported in YCBCR420
- * output format
- *
- * @connector: drm connector under action.
- * @mode: video mode to be tested.
- *
- * Returns:
- * true if the mode can be supported in YCBCR420 format
- * false if not.
- */
-bool drm_mode_is_420_only(const struct drm_display_info *display,
-			  struct drm_display_mode *mode)
-{
-	u8 vic = drm_match_cea_mode(mode);
-
-	return test_bit(vic, display->hdmi.y420_vdb_modes);
-}
-
-/**
- * drm_mode_is_420_also - if a given videomode can be supported in YCBCR420
- * output format also (along with RGB/YCBCR444/422)
- *
- * @display: display under action.
- * @mode: video mode to be tested.
- *
- * Returns:
- * true if the mode can be support YCBCR420 format
- * false if not.
- */
-bool drm_mode_is_420_also(const struct drm_display_info *display,
-			  struct drm_display_mode *mode)
-{
-	u8 vic = drm_match_cea_mode(mode);
-
-	return test_bit(vic, display->hdmi.y420_cmdb_modes);
-}
-
-/**
- * drm_mode_is_420 - if a given videomode can be supported in YCBCR420
- * output format
- *
- * @display: display under action.
- * @mode: video mode to be tested.
- *
- * Returns:
- * true if the mode can be supported in YCBCR420 format
- * false if not.
- */
-bool drm_mode_is_420(const struct drm_display_info *display,
-		     struct drm_display_mode *mode)
-{
-	return drm_mode_is_420_only(display, mode) ||
-		drm_mode_is_420_also(display, mode);
 }
 
 static int display_get_timing(struct display_state *state)
@@ -649,7 +489,7 @@
 		return panel->funcs->get_mode(panel, mode);
 
 	if (dev_of_valid(panel->dev) &&
-	    !display_get_timing_from_dts(panel, mode)) {
+	    !display_get_timing_from_dts(panel, mode, &conn_state->bus_flags)) {
 		printf("Using display timing dts\n");
 		return 0;
 	}
@@ -730,6 +570,47 @@
 	return ret;
 }
 
+static int display_mode_valid(struct display_state *state)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct rockchip_connector *conn = conn_state->connector;
+	const struct rockchip_connector_funcs *conn_funcs = conn->funcs;
+	struct crtc_state *crtc_state = &state->crtc_state;
+	const struct rockchip_crtc *crtc = crtc_state->crtc;
+	const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs;
+	int ret;
+
+	if (conn_funcs->mode_valid && state->enabled_at_spl == false) {
+		ret = conn_funcs->mode_valid(conn, state);
+		if (ret)
+			return ret;
+	}
+
+	if (crtc_funcs->mode_valid) {
+		ret = crtc_funcs->mode_valid(state);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int display_mode_fixup(struct display_state *state)
+{
+	struct crtc_state *crtc_state = &state->crtc_state;
+	const struct rockchip_crtc *crtc = crtc_state->crtc;
+	const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs;
+	int ret;
+
+	if (crtc_funcs->mode_fixup) {
+		ret = crtc_funcs->mode_fixup(state);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
 static int display_init(struct display_state *state)
 {
 	struct connector_state *conn_state = &state->conn_state;
@@ -741,7 +622,9 @@
 	const char *compatible;
 	int ret = 0;
 	static bool __print_once = false;
-
+#ifdef CONFIG_SPL_BUILD
+	struct spl_display_info *spl_disp_info = (struct spl_display_info *)CONFIG_SPL_VIDEO_BUF;
+#endif
 	if (!__print_once) {
 		__print_once = true;
 		printf("Rockchip UBOOT DRM driver version: %s\n", DRIVER_VERSION);
@@ -755,6 +638,12 @@
 		return -ENXIO;
 	}
 
+#ifdef CONFIG_SPL_BUILD
+	if (state->conn_state.type == DRM_MODE_CONNECTOR_HDMIA)
+		state->enabled_at_spl = spl_disp_info->enabled == 1 ? true : false;
+	if (state->enabled_at_spl)
+		printf("HDMI enabled at SPL\n");
+#endif
 	if (crtc_state->crtc->active && !crtc_state->ports_node &&
 	    memcmp(&crtc_state->crtc->active_mode, &conn_state->mode,
 		   sizeof(struct drm_display_mode))) {
@@ -773,14 +662,16 @@
 			return ret;
 	}
 
-	ret = rockchip_connector_init(state);
-	if (ret)
-		goto deinit;
+	if (state->enabled_at_spl == false) {
+		ret = rockchip_connector_init(state);
+		if (ret)
+			goto deinit;
+	}
 
 	/*
 	 * support hotplug, but not connect;
 	 */
-#ifdef CONFIG_ROCKCHIP_DRM_TVE
+#ifdef CONFIG_DRM_ROCKCHIP_TVE
 	if (crtc->hdmi_hpd && conn_state->type == DRM_MODE_CONNECTOR_TV) {
 		printf("hdmi plugin ,skip tve\n");
 		goto deinit;
@@ -793,14 +684,27 @@
 #endif
 
 	ret = rockchip_connector_detect(state);
-#if defined(CONFIG_ROCKCHIP_DRM_TVE) || defined(CONFIG_DRM_ROCKCHIP_RK1000)
+#if defined(CONFIG_DRM_ROCKCHIP_TVE) || defined(CONFIG_DRM_ROCKCHIP_RK1000)
 	if (conn_state->type == DRM_MODE_CONNECTOR_HDMIA)
 		crtc->hdmi_hpd = ret;
+	if (state->enabled_at_spl)
+		crtc->hdmi_hpd = true;
 #endif
 	if (!ret && !state->force_output)
 		goto deinit;
 
-	if (conn->panel) {
+	ret = 0;
+	if (state->enabled_at_spl == true) {
+#ifdef CONFIG_SPL_BUILD
+		struct drm_display_mode *mode = &conn_state->mode;
+
+		memcpy(mode, &spl_disp_info->mode,  sizeof(*mode));
+		conn_state->bus_format = spl_disp_info->bus_format;
+
+		printf("%s get display mode from spl:%dx%d, bus format:0x%x\n",
+			conn->dev->name, mode->hdisplay, mode->vdisplay, conn_state->bus_format);
+#endif
+	} else if (conn->panel) {
 		ret = display_get_timing(state);
 		if (!ret)
 			conn_state->bpc = conn->panel->bpc;
@@ -853,10 +757,15 @@
 	if (state->force_output)
 		display_use_force_mode(state);
 
+	if (display_mode_valid(state))
+		goto deinit;
+
 	/* rk356x series drive mipi pixdata on posedge */
 	compatible = dev_read_string(conn->dev, "compatible");
-	if (!strcmp(compatible, "rockchip,rk3568-mipi-dsi"))
-		conn_state->mode.flags |= DRM_MODE_FLAG_PPIXDATA;
+	if (!strcmp(compatible, "rockchip,rk3568-mipi-dsi")) {
+		conn_state->bus_flags &= ~DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE;
+		conn_state->bus_flags |= DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE;
+	}
 
 	printf("%s: %s detailed mode clock %u kHz, flags[%x]\n"
 	       "    H: %04d %04d %04d %04d\n"
@@ -871,20 +780,13 @@
 	       mode->vsync_end, mode->vtotal,
 	       conn_state->bus_format);
 
-	drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
-
-	if (conn_state->secondary) {
-		mode->crtc_clock *= 2;
-		mode->crtc_hdisplay *= 2;
-		mode->crtc_hsync_start *= 2;
-		mode->crtc_hsync_end *= 2;
-		mode->crtc_htotal *= 2;
-	}
+	if (display_mode_fixup(state))
+		goto deinit;
 
 	if (conn->bridge)
 		rockchip_bridge_mode_set(conn->bridge, &conn_state->mode);
 
-	if (crtc_funcs->init) {
+	if (crtc_funcs->init && state->enabled_at_spl == false) {
 		ret = crtc_funcs->init(state);
 		if (ret)
 			goto deinit;
@@ -955,12 +857,17 @@
 	if (crtc_funcs->prepare)
 		crtc_funcs->prepare(state);
 
-	rockchip_connector_pre_enable(state);
+	if (state->enabled_at_spl == false)
+		rockchip_connector_pre_enable(state);
 
 	if (crtc_funcs->enable)
 		crtc_funcs->enable(state);
 
-	rockchip_connector_enable(state);
+	if (state->enabled_at_spl == false)
+		rockchip_connector_enable(state);
+
+	if (crtc_state->soft_te)
+		crtc_funcs->apply_soft_te(state);
 
 	state->is_enable = true;
 
@@ -990,54 +897,6 @@
 	state->is_init = 0;
 
 	return 0;
-}
-
-static int display_rect_calc_scale(int src, int dst)
-{
-	int scale = 0;
-
-	if (WARN_ON(src < 0 || dst < 0))
-		return -EINVAL;
-
-	if (dst == 0)
-		return 0;
-
-	src <<= 16;
-
-	if (src > (dst << 16))
-		return DIV_ROUND_UP(src, dst);
-	else
-		scale = src / dst;
-
-	return scale;
-}
-
-int display_rect_calc_hscale(struct display_rect *src, struct display_rect *dst,
-			     int min_hscale, int max_hscale)
-{
-	int hscale = display_rect_calc_scale(src->w, dst->w);
-
-	if (hscale < 0 || dst->w == 0)
-		return hscale;
-
-	if (hscale < min_hscale || hscale > max_hscale)
-		return -ERANGE;
-
-	return hscale;
-}
-
-int display_rect_calc_vscale(struct display_rect *src, struct display_rect *dst,
-			     int min_vscale, int max_vscale)
-{
-	int vscale = display_rect_calc_scale(src->h, dst->h);
-
-	if (vscale < 0 || dst->h == 0)
-		return vscale;
-
-	if (vscale < min_vscale || vscale > max_vscale)
-		return -ERANGE;
-
-	return vscale;
 }
 
 static int display_check(struct display_state *state)
@@ -1074,38 +933,6 @@
 	return 0;
 
 check_fail:
-	state->is_init = false;
-	return ret;
-}
-
-static int display_mode_valid(struct display_state *state)
-{
-	struct connector_state *conn_state = &state->conn_state;
-	struct rockchip_connector *conn = conn_state->connector;
-	const struct rockchip_connector_funcs *conn_funcs = conn->funcs;
-	struct crtc_state *crtc_state = &state->crtc_state;
-	const struct rockchip_crtc *crtc = crtc_state->crtc;
-	const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs;
-	int ret;
-
-	if (!state->is_init)
-		return 0;
-
-	if (conn_funcs->mode_valid) {
-		ret = conn_funcs->mode_valid(conn, state);
-		if (ret)
-			goto invalid_mode;
-	}
-
-	if (crtc_funcs->mode_valid) {
-		ret = crtc_funcs->mode_valid(state);
-		if (ret)
-			goto invalid_mode;
-	}
-
-	return 0;
-
-invalid_mode:
 	state->is_init = false;
 	return ret;
 }
@@ -1170,7 +997,6 @@
 		}
 	}
 
-	display_mode_valid(state);
 	display_check(state);
 	display_set_plane(state);
 	display_enable(state);
@@ -1213,14 +1039,22 @@
 	return 0;
 }
 
-static int get_crtc_mcu_mode(struct crtc_state *crtc_state)
+static int get_crtc_mcu_mode(struct crtc_state *crtc_state, struct device_node *port_node,
+			     bool is_ports_node)
 {
-	ofnode mcu_node;
+	ofnode mcu_node, vp_node;
 	int total_pixel, cs_pst, cs_pend, rw_pst, rw_pend;
 
-	mcu_node = dev_read_subnode(crtc_state->dev, "mcu-timing");
-	if (!ofnode_valid(mcu_node))
-		return -ENODEV;
+	if (is_ports_node) {
+		vp_node = np_to_ofnode(port_node);
+		mcu_node = ofnode_find_subnode(vp_node, "mcu-timing");
+		if (!ofnode_valid(mcu_node))
+			return -ENODEV;
+	} else {
+		mcu_node = dev_read_subnode(crtc_state->dev, "mcu-timing");
+		if (!ofnode_valid(mcu_node))
+			return -ENODEV;
+	}
 
 #define FDT_GET_MCU_INT(val, name) \
 	do { \
@@ -1464,6 +1298,35 @@
 	return ret;
 }
 
+int rockchip_vop_dump(const char *cmd)
+{
+	struct display_state *state;
+	struct crtc_state *crtc_state;
+	struct rockchip_crtc *crtc;
+	const struct rockchip_crtc_funcs *crtc_funcs;
+	int ret = -EINVAL;
+
+	list_for_each_entry(state, &rockchip_display_list, head) {
+		if (!state->is_init)
+			continue;
+		crtc_state = &state->crtc_state;
+		crtc = crtc_state->crtc;
+		crtc_funcs = crtc->funcs;
+
+		if (!cmd)
+			ret = crtc_funcs->active_regs_dump(state);
+		else if (!strcmp(cmd, "a") || !strcmp(cmd, "all"))
+			ret = crtc_funcs->regs_dump(state);
+		if (!ret)
+			break;
+	}
+
+	if (ret)
+		ret = CMD_RET_USAGE;
+
+	return ret;
+}
+
 enum {
 	PORT_DIR_IN,
 	PORT_DIR_OUT,
@@ -1505,13 +1368,12 @@
 	return ofnode_to_np(parent);
 }
 
-static const struct device_node *rockchip_of_graph_get_remote_node(ofnode node, int port,
-								   int endpoint)
+const struct device_node *
+rockchip_of_graph_get_endpoint_by_regs(ofnode node, int port, int endpoint)
 {
 	const struct device_node *port_node;
 	ofnode ep;
 	u32 reg;
-	uint phandle;
 
 	port_node = rockchip_of_graph_get_port_by_id(node, port);
 	if (!port_node)
@@ -1527,7 +1389,21 @@
 	if (!ofnode_valid(ep))
 		return NULL;
 
-	if (ofnode_read_u32(ep, "remote-endpoint", &phandle))
+	return ofnode_to_np(ep);
+}
+
+static const struct device_node *
+rockchip_of_graph_get_remote_node(ofnode node, int port, int endpoint)
+{
+	const struct device_node *ep_node;
+	ofnode ep;
+	uint phandle;
+
+	ep_node = rockchip_of_graph_get_endpoint_by_regs(node, port, endpoint);
+	if (!ep_node)
+		return NULL;
+
+	if (ofnode_read_u32(np_to_ofnode(ep_node), "remote-endpoint", &phandle))
 		return NULL;
 
 	ep = ofnode_get_by_phandle(phandle);
@@ -1611,6 +1487,10 @@
 					    struct rockchip_bridge **bridge)
 {
 	int ret = 0;
+
+	if (*panel)
+		return 0;
+
 	*panel = NULL;
 	*bridge = NULL;
 
@@ -1952,7 +1832,9 @@
 
 		if (s->force_output) {
 			timing_node = ofnode_find_subnode(node, "force_timing");
-			ret = display_get_force_timing_from_dts(timing_node, &s->force_mode);
+			ret = display_get_force_timing_from_dts(timing_node,
+								&s->force_mode,
+								&s->conn_state.bus_flags);
 			if (ofnode_read_u32(node, "force-bus-format", &s->force_bus_format))
 				s->force_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
 		}
@@ -2002,10 +1884,11 @@
 						s->crtc_state.crtc->vps[vp_id].plane_mask = ret;
 						s->crtc_state.crtc->assign_plane |= true;
 						s->crtc_state.crtc->vps[vp_id].primary_plane_id =
-							ofnode_read_u32_default(vp_node, "rockchip,primary-plane", -1);
+							ofnode_read_u32_default(vp_node, "rockchip,primary-plane", U8_MAX);
 						printf("get vp%d plane mask:0x%x, primary id:%d, cursor_plane:%d, from dts\n",
 						       vp_id,
 						       s->crtc_state.crtc->vps[vp_id].plane_mask,
+						       s->crtc_state.crtc->vps[vp_id].primary_plane_id == U8_MAX ? -1 :
 						       s->crtc_state.crtc->vps[vp_id].primary_plane_id,
 						       cursor_plane);
 					}
@@ -2020,7 +1903,7 @@
 			}
 		}
 
-		get_crtc_mcu_mode(&s->crtc_state);
+		get_crtc_mcu_mode(&s->crtc_state, port_node, is_ports_node);
 
 		ret = ofnode_read_u32_default(s->crtc_state.node,
 					      "rockchip,dual-channel-swap", 0);
@@ -2061,27 +1944,41 @@
 	const struct rockchip_crtc *crtc;
 	struct display_state *s;
 	int offset;
+	int ret;
 	const struct device_node *np;
 	const char *path;
+	const char *cacm_header;
+	u64 aligned_memory_size;
 
 	if (fdt_node_offset_by_compatible(blob, 0, "rockchip,drm-logo") >= 0) {
-		list_for_each_entry(s, &rockchip_display_list, head)
-			load_bmp_logo(&s->logo, s->klogo_name);
+		list_for_each_entry(s, &rockchip_display_list, head) {
+			ret = load_bmp_logo(&s->logo, s->klogo_name);
+			if (ret < 0) {
+				s->is_klogo_valid = false;
+				printf("VP%d fail to load kernel logo\n", s->crtc_state.crtc_id);
+			} else {
+				s->is_klogo_valid = true;
+			}
+		}
 
 		if (!get_display_size())
 			return;
 
+		aligned_memory_size = (u64)ALIGN(get_display_size(), align_size);
 		offset = fdt_update_reserved_memory(blob, "rockchip,drm-logo",
 						    (u64)memory_start,
-						    (u64)get_display_size());
+						    aligned_memory_size);
 		if (offset < 0)
 			printf("failed to reserve drm-loader-logo memory\n");
 
-		offset = fdt_update_reserved_memory(blob, "rockchip,drm-cubic-lut",
-						    (u64)cubic_lut_memory_start,
-						    (u64)get_cubic_memory_size());
-		if (offset < 0)
-			printf("failed to reserve drm-cubic-lut memory\n");
+		if (get_cubic_memory_size()) {
+			aligned_memory_size = (u64)ALIGN(get_cubic_memory_size(), align_size);
+			offset = fdt_update_reserved_memory(blob, "rockchip,drm-cubic-lut",
+							    (u64)cubic_lut_memory_start,
+							    aligned_memory_size);
+			if (offset < 0)
+				printf("failed to reserve drm-cubic-lut memory\n");
+		}
 	} else {
 		printf("can't found rockchip,drm-logo, use rockchip,fb-logo\n");
 		/* Compatible with rkfb display, only need reserve memory */
@@ -2097,7 +1994,14 @@
 	}
 
 	list_for_each_entry(s, &rockchip_display_list, head) {
-		if (!s->is_init)
+		/*
+		 * If plane mask is not set in dts, fixup dts to assign it
+		 * whether crtc is initialized or not.
+		 */
+		if (s->crtc_state.crtc->funcs->fixup_dts && !s->crtc_state.crtc->assign_plane)
+			s->crtc_state.crtc->funcs->fixup_dts(s, blob);
+
+		if (!s->is_init || !s->is_klogo_valid)
 			continue;
 
 		conn = s->conn_state.connector;
@@ -2123,9 +2027,6 @@
 			printf("failed to get exist crtc\n");
 			continue;
 		}
-
-		if (crtc_funcs->fixup_dts)
-			crtc_funcs->fixup_dts(s, blob);
 
 		np = ofnode_to_np(s->node);
 		path = np->full_name;
@@ -2155,10 +2056,37 @@
 		FDT_SET_U32("overscan,bottom_margin", s->conn_state.overscan.bottom_margin);
 
 		if (s->conn_state.disp_info) {
+			cacm_header = (const char*)&s->conn_state.disp_info->cacm_header;
+
 			FDT_SET_U32("bcsh,brightness", s->conn_state.disp_info->bcsh_info.brightness);
 			FDT_SET_U32("bcsh,contrast", s->conn_state.disp_info->bcsh_info.contrast);
 			FDT_SET_U32("bcsh,saturation", s->conn_state.disp_info->bcsh_info.saturation);
 			FDT_SET_U32("bcsh,hue", s->conn_state.disp_info->bcsh_info.hue);
+
+			if (!strncasecmp(cacm_header, "CACM", 4)) {
+				FDT_SET_U32("post_csc,hue",
+					    s->conn_state.disp_info->csc_info.hue);
+				FDT_SET_U32("post_csc,saturation",
+					    s->conn_state.disp_info->csc_info.saturation);
+				FDT_SET_U32("post_csc,contrast",
+					    s->conn_state.disp_info->csc_info.contrast);
+				FDT_SET_U32("post_csc,brightness",
+					    s->conn_state.disp_info->csc_info.brightness);
+				FDT_SET_U32("post_csc,r_gain",
+					    s->conn_state.disp_info->csc_info.r_gain);
+				FDT_SET_U32("post_csc,g_gain",
+					    s->conn_state.disp_info->csc_info.g_gain);
+				FDT_SET_U32("post_csc,b_gain",
+					    s->conn_state.disp_info->csc_info.b_gain);
+				FDT_SET_U32("post_csc,r_offset",
+					    s->conn_state.disp_info->csc_info.r_offset);
+				FDT_SET_U32("post_csc,g_offset",
+					    s->conn_state.disp_info->csc_info.g_offset);
+				FDT_SET_U32("post_csc,b_offset",
+					    s->conn_state.disp_info->csc_info.b_offset);
+				FDT_SET_U32("post_csc,csc_enable",
+					    s->conn_state.disp_info->csc_info.csc_enable);
+			}
 		}
 
 		if (s->conn_state.disp_info->cubic_lut_data.size &&
@@ -2213,6 +2141,19 @@
 	return 0;
 }
 
+static int do_rockchip_vop_dump(cmd_tbl_t *cmdtp, int flag, int argc,
+				char *const argv[])
+{
+	int ret;
+
+	if (argc < 1 || argc > 2)
+		return CMD_RET_USAGE;
+
+	ret = rockchip_vop_dump(argv[1]);
+
+	return ret;
+}
+
 U_BOOT_CMD(
 	rockchip_show_logo, 1, 1, do_rockchip_logo_show,
 	"load and display log from resource partition",
@@ -2224,3 +2165,9 @@
 	"load and display bmp from resource partition",
 	"    <bmp_name>"
 );
+
+U_BOOT_CMD(
+	vop_dump, 2, 1, do_rockchip_vop_dump,
+	"dump vop regs",
+	" [a/all]"
+);
diff --git a/u-boot/drivers/video/drm/rockchip_display.h b/u-boot/drivers/video/drm/rockchip_display.h
index 4d45e9d..8447871 100644
--- a/u-boot/drivers/video/drm/rockchip_display.h
+++ b/u-boot/drivers/video/drm/rockchip_display.h
@@ -7,22 +7,37 @@
 #ifndef _ROCKCHIP_DISPLAY_H
 #define _ROCKCHIP_DISPLAY_H
 
+#ifdef CONFIG_SPL_BUILD
+#include <linux/hdmi.h>
+#include <linux/media-bus-format.h>
+#else
 #include <bmp_layout.h>
-#include <drm_modes.h>
 #include <edid.h>
+#endif
+#include <drm_modes.h>
 #include <dm/ofnode.h>
 #include <drm/drm_dsc.h>
+#include <spl_display.h>
+#include <clk.h>
 
 /*
- * major: IP major vertion, used for IP structure
+ * major: IP major version, used for IP structure
  * minor: big feature change under same structure
+ * build: RTL current SVN number
  */
-#define VOP_VERSION(major, minor)	((major) << 8 | (minor))
-#define VOP_MAJOR(version)		((version) >> 8)
-#define VOP_MINOR(version)		((version) & 0xff)
+#define VOP_VERSION(major, minor)		((major) << 8 | (minor))
+#define VOP_MAJOR(version)			((version) >> 8)
+#define VOP_MINOR(version)			((version) & 0xff)
 
-#define VOP_VERSION_RK3568		VOP_VERSION(0x40, 0x15)
-#define VOP_VERSION_RK3588		VOP_VERSION(0x40, 0x17)
+#define VOP2_VERSION(major, minor, build)	((major) << 24 | (minor) << 16 | (build))
+#define VOP2_MAJOR(version)			(((version) >> 24) & 0xff)
+#define VOP2_MINOR(version)			(((version) >> 16) & 0xff)
+#define VOP2_BUILD(version)			((version) & 0xffff)
+
+#define VOP_VERSION_RK3528			VOP2_VERSION(0x50, 0x17, 0x1263)
+#define VOP_VERSION_RK3562			VOP2_VERSION(0x50, 0x17, 0x4350)
+#define VOP_VERSION_RK3568			VOP2_VERSION(0x40, 0x15, 0x8023)
+#define VOP_VERSION_RK3588			VOP2_VERSION(0x40, 0x17, 0x6786)
 
 #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE	BIT(0)
 #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_ODD_EVEN_MODE	BIT(1)
@@ -66,6 +81,7 @@
 #define ROCKCHIP_OUT_MODE_P565		2
 #define ROCKCHIP_OUT_MODE_BT656		5
 #define ROCKCHIP_OUT_MODE_S888		8
+#define ROCKCHIP_OUT_MODE_YUV422	9
 #define ROCKCHIP_OUT_MODE_S888_DUMMY	12
 #define ROCKCHIP_OUT_MODE_YUV420	14
 /* for use special outface */
@@ -141,6 +157,7 @@
 	void *private;
 	ofnode node;
 	struct device_node *ports_node; /* if (ports_node) it's vop2; */
+	struct clk dclk;
 	int crtc_id;
 
 	int format;
@@ -160,6 +177,7 @@
 	bool post_y2r_en;
 	bool bcsh_en;
 	bool splice_mode;
+	bool soft_te;
 	u8 splice_crtc_id;
 	u8 dsc_id;
 	u8 dsc_enable;
@@ -198,6 +216,7 @@
 	struct overscan overscan;
 	u8 edid[EDID_SIZE * 4];
 	int bus_format;
+	u32 bus_flags;
 	int output_mode;
 	int type;
 	int output_if;
@@ -223,6 +242,8 @@
 	u64 dsc_cds_clk;
 	struct rockchip_dsc_sink_cap dsc_sink_cap;
 	struct drm_dsc_picture_parameter_set pps;
+
+	struct gpio_desc *te_gpio;
 
 	struct {
 		u32 *lut;
@@ -268,7 +289,9 @@
 	int enable;
 	int is_init;
 	int is_enable;
+	bool is_klogo_valid;
 	bool force_output;
+	bool enabled_at_spl;
 	struct drm_display_mode force_mode;
 	u32 force_bus_format;
 };
@@ -282,11 +305,22 @@
 void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data,
 				    struct vop_rect *max_output);
 unsigned long get_cubic_lut_buffer(int crtc_id);
-int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode);
+int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode,
+				     u32 *bus_flags);
+void rockchip_display_make_crc32_table(void);
+uint32_t rockchip_display_crc32c_cal(unsigned char *data, int length);
+void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags);
 
 int display_rect_calc_hscale(struct display_rect *src, struct display_rect *dst,
 			     int min_hscale, int max_hscale);
 int display_rect_calc_vscale(struct display_rect *src, struct display_rect *dst,
 			     int min_vscale, int max_vscale);
+const struct device_node *
+rockchip_of_graph_get_endpoint_by_regs(ofnode node, int port, int endpoint);
 
+#ifdef CONFIG_SPL_BUILD
+int rockchip_spl_vop_probe(struct crtc_state *crtc_state);
+int rockchip_spl_dw_hdmi_probe(struct connector_state *conn_state);
+int inno_spl_hdmi_phy_probe(struct display_state *state);
+#endif
 #endif
diff --git a/u-boot/drivers/video/drm/rockchip_display_helper.c b/u-boot/drivers/video/drm/rockchip_display_helper.c
new file mode 100644
index 0000000..da34f4d
--- /dev/null
+++ b/u-boot/drivers/video/drm/rockchip_display_helper.c
@@ -0,0 +1,279 @@
+/*
+ * (C) Copyright 2023 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <linux/hdmi.h>
+#include <linux/compat.h>
+#include "rockchip_display.h"
+#include <spl_display.h>
+
+#define RK_BLK_SIZE 512
+#define BMP_PROCESSED_FLAG 8399
+
+static uint32_t crc32_table[256];
+
+void rockchip_display_make_crc32_table(void)
+{
+	uint32_t c;
+	int n, k;
+	unsigned long poly;		/* polynomial exclusive-or pattern */
+	/* terms of polynomial defining this crc (except x^32): */
+	static const char p[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26};
+
+	/* make exclusive-or pattern from polynomial (0xedb88320L) */
+	poly = 0L;
+	for (n = 0; n < sizeof(p) / sizeof(char); n++)
+		poly |= 1L << (31 - p[n]);
+
+	for (n = 0; n < 256; n++) {
+		c = (unsigned long)n;
+		for (k = 0; k < 8; k++)
+		c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+		crc32_table[n] = cpu_to_le32(c);
+	}
+}
+
+uint32_t rockchip_display_crc32c_cal(unsigned char *data, int length)
+{
+	int i;
+	uint32_t crc;
+	crc = 0xFFFFFFFF;
+
+	for (i = 0; i < length; i++) {
+		crc = crc32_table[(crc ^ *data) & 0xff] ^ (crc >> 8);
+		data++;
+	}
+
+	return crc ^ 0xffffffff;
+}
+
+/**
+ * drm_mode_max_resolution_filter - mark modes out of vop max resolution
+ * @edid_data: structure store mode list
+ * @max_output: vop max output resolution
+ */
+void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data,
+				    struct vop_rect *max_output)
+{
+	int i;
+
+	for (i = 0; i < edid_data->modes; i++) {
+		if (edid_data->mode_buf[i].hdisplay > max_output->width ||
+		    edid_data->mode_buf[i].vdisplay > max_output->height)
+			edid_data->mode_buf[i].invalid = true;
+	}
+}
+
+int drm_mode_vrefresh(const struct drm_display_mode *mode)
+{
+	int refresh = 0;
+	unsigned int calc_val;
+
+	if (mode->vrefresh > 0) {
+		refresh = mode->vrefresh;
+	} else if (mode->htotal > 0 && mode->vtotal > 0) {
+		int vtotal;
+
+		vtotal = mode->vtotal;
+		/* work out vrefresh the value will be x1000 */
+		calc_val = (mode->clock * 1000);
+		calc_val /= mode->htotal;
+		refresh = (calc_val + vtotal / 2) / vtotal;
+
+		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+		refresh *= 2;
+		if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
+		refresh /= 2;
+		if (mode->vscan > 1)
+		refresh /= mode->vscan;
+	}
+	return refresh;
+}
+
+/**
+ * drm_mode_set_crtcinfo - set CRTC modesetting timing parameters
+ * @p: mode
+ * @adjust_flags: a combination of adjustment flags
+ *
+ * Setup the CRTC modesetting timing parameters for @p, adjusting if necessary.
+ *
+ * - The CRTC_INTERLACE_HALVE_V flag can be used to halve vertical timings of
+ *   interlaced modes.
+ * - The CRTC_STEREO_DOUBLE flag can be used to compute the timings for
+ *   buffers containing two eyes (only adjust the timings when needed, eg. for
+ *   "frame packing" or "side by side full").
+ * - The CRTC_NO_DBLSCAN and CRTC_NO_VSCAN flags request that adjustment *not*
+ *   be performed for doublescan and vscan > 1 modes respectively.
+ */
+void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags)
+{
+	if ((p == NULL) || ((p->type & DRM_MODE_TYPE_CRTC_C) == DRM_MODE_TYPE_BUILTIN))
+		return;
+
+	if (p->flags & DRM_MODE_FLAG_DBLCLK)
+		p->crtc_clock = 2 * p->clock;
+	else
+		p->crtc_clock = p->clock;
+	p->crtc_hdisplay = p->hdisplay;
+	p->crtc_hsync_start = p->hsync_start;
+	p->crtc_hsync_end = p->hsync_end;
+	p->crtc_htotal = p->htotal;
+	p->crtc_hskew = p->hskew;
+	p->crtc_vdisplay = p->vdisplay;
+	p->crtc_vsync_start = p->vsync_start;
+	p->crtc_vsync_end = p->vsync_end;
+	p->crtc_vtotal = p->vtotal;
+
+	if (p->flags & DRM_MODE_FLAG_INTERLACE) {
+		if (adjust_flags & CRTC_INTERLACE_HALVE_V) {
+			p->crtc_vdisplay /= 2;
+			p->crtc_vsync_start /= 2;
+			p->crtc_vsync_end /= 2;
+			p->crtc_vtotal /= 2;
+		}
+	}
+
+	if (!(adjust_flags & CRTC_NO_DBLSCAN)) {
+		if (p->flags & DRM_MODE_FLAG_DBLSCAN) {
+			p->crtc_vdisplay *= 2;
+			p->crtc_vsync_start *= 2;
+			p->crtc_vsync_end *= 2;
+			p->crtc_vtotal *= 2;
+		}
+	}
+
+	if (!(adjust_flags & CRTC_NO_VSCAN)) {
+		if (p->vscan > 1) {
+			p->crtc_vdisplay *= p->vscan;
+			p->crtc_vsync_start *= p->vscan;
+			p->crtc_vsync_end *= p->vscan;
+			p->crtc_vtotal *= p->vscan;
+		}
+	}
+
+	if (adjust_flags & CRTC_STEREO_DOUBLE) {
+		unsigned int layout = p->flags & DRM_MODE_FLAG_3D_MASK;
+
+		switch (layout) {
+		case DRM_MODE_FLAG_3D_FRAME_PACKING:
+			p->crtc_clock *= 2;
+			p->crtc_vdisplay += p->crtc_vtotal;
+			p->crtc_vsync_start += p->crtc_vtotal;
+			p->crtc_vsync_end += p->crtc_vtotal;
+			p->crtc_vtotal += p->crtc_vtotal;
+			break;
+		}
+	}
+
+	p->crtc_vblank_start = min(p->crtc_vsync_start, p->crtc_vdisplay);
+	p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal);
+	p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay);
+	p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal);
+}
+
+/**
+ * drm_mode_is_420_only - if a given videomode can be only supported in YCBCR420
+ * output format
+ *
+ * @connector: drm connector under action.
+ * @mode: video mode to be tested.
+ *
+ * Returns:
+ * true if the mode can be supported in YCBCR420 format
+ * false if not.
+ */
+static bool drm_mode_is_420_only(const struct drm_display_info *display,
+			  struct drm_display_mode *mode)
+{
+	u8 vic = drm_match_cea_mode(mode);
+
+	return test_bit(vic, display->hdmi.y420_vdb_modes);
+}
+
+/**
+ * drm_mode_is_420_also - if a given videomode can be supported in YCBCR420
+ * output format also (along with RGB/YCBCR444/422)
+ *
+ * @display: display under action.
+ * @mode: video mode to be tested.
+ *
+ * Returns:
+ * true if the mode can be support YCBCR420 format
+ * false if not.
+ */
+static bool drm_mode_is_420_also(const struct drm_display_info *display,
+			  struct drm_display_mode *mode)
+{
+	u8 vic = drm_match_cea_mode(mode);
+
+	return test_bit(vic, display->hdmi.y420_cmdb_modes);
+}
+
+/**
+ * drm_mode_is_420 - if a given videomode can be supported in YCBCR420
+ * output format
+ *
+ * @display: display under action.
+ * @mode: video mode to be tested.
+ *
+ * Returns:
+ * true if the mode can be supported in YCBCR420 format
+ * false if not.
+ */
+bool drm_mode_is_420(const struct drm_display_info *display,
+		     struct drm_display_mode *mode)
+{
+	return drm_mode_is_420_only(display, mode) ||
+		drm_mode_is_420_also(display, mode);
+}
+
+static int display_rect_calc_scale(int src, int dst)
+{
+	int scale = 0;
+
+	if (WARN_ON(src < 0 || dst < 0))
+		return -EINVAL;
+
+	if (dst == 0)
+		return 0;
+
+	src <<= 16;
+
+	if (src > (dst << 16))
+		return DIV_ROUND_UP(src, dst);
+	else
+		scale = src / dst;
+
+	return scale;
+}
+
+int display_rect_calc_hscale(struct display_rect *src, struct display_rect *dst,
+			     int min_hscale, int max_hscale)
+{
+	int hscale = display_rect_calc_scale(src->w, dst->w);
+
+	if (hscale < 0 || dst->w == 0)
+		return hscale;
+
+	if (hscale < min_hscale || hscale > max_hscale)
+		return -ERANGE;
+
+	return hscale;
+}
+
+int display_rect_calc_vscale(struct display_rect *src, struct display_rect *dst,
+			     int min_vscale, int max_vscale)
+{
+	int vscale = display_rect_calc_scale(src->h, dst->h);
+
+	if (vscale < 0 || dst->h == 0)
+		return vscale;
+
+	if (vscale < min_vscale || vscale > max_vscale)
+		return -ERANGE;
+
+	return vscale;
+}
+
diff --git a/u-boot/drivers/video/drm/rockchip_drm_tve.c b/u-boot/drivers/video/drm/rockchip_drm_tve.c
deleted file mode 100644
index a159bfe..0000000
--- a/u-boot/drivers/video/drm/rockchip_drm_tve.c
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * SPDX-License-Identifier:	GPL-2.0+
- * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd
- */
-#include <common.h>
-#include <malloc.h>
-#include <fdtdec.h>
-#include <fdt_support.h>
-#include <asm/io.h>
-#include <linux/media-bus-format.h>
-#include <asm/arch-rockchip/clock.h>
-#include <dm/device.h>
-#include <dm/read.h>
-#include <dm/uclass-internal.h>
-#include <linux/fb.h>
-#include <edid.h>
-#include <syscon.h>
-#include <boot_rkimg.h>
-#include <mapmem.h>
-#include <misc.h>
-#include "rockchip_drm_tve.h"
-#include "rockchip_display.h"
-#include "rockchip_crtc.h"
-#include "rockchip_connector.h"
-#include "rockchip_phy.h"
-
-DECLARE_GLOBAL_DATA_PTR;
-
-static struct drm_tve tve_s;
-
-#define tve_writel(offset, v)	writel(v, tve_s.reg_phy_base  + offset)
-#define tve_readl(offset)	readl(tve_s.reg_phy_base + offset)
-
-#define tve_dac_writel(offset, v)   writel(v, tve_s.vdacbase + offset)
-#define tve_dac_readl(offset)	readl(tve_s.vdacbase + offset)
-
-#define RK322X_VDAC_STANDARD 0x15
-
-#define TVE_REG_NUM 0x28
-
-static const struct drm_display_mode tve_modes[] = {
-	/* 0 - 720x576i@50Hz */
-	{ DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753,
-		   816, 864, 576, 580, 586, 625, 0,
-		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-	  .vrefresh = 50, },
-	/* 1 - 720x480i@60Hz */
-	{ DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753,
-		   815, 858, 480, 480, 486, 525, 0,
-		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
-		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
-	  .vrefresh = 60, },
-};
-
-static void dac_enable(int enable)
-{
-	u32 mask, val = 0;
-	u32 grfreg = 0;
-
-#if defined(CONFIG_ROCKCHIP_RK322X) || defined(CONFIG_ROCKCHIP_RK3328)
-	tve_dac_writel(VDAC_VDAC2, v_CUR_CTR(tve_s.daclevel));
-	tve_dac_writel(VDAC_VDAC3, v_CAB_EN(0));
-#endif
-	if (enable) {
-		mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN;
-#if defined(CONFIG_ROCKCHIP_RK3128)
-			val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve_s.daclevel);
-			grfreg = GRF_TVE_CON0;
-#elif defined(CONFIG_ROCKCHIP_RK3036)
-			val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve_s.daclevel);
-			grfreg = GRF_SOC_CON3;
-#endif
-		val |= mask << 16;
-
-#if defined(CONFIG_ROCKCHIP_RK322X) || defined(CONFIG_ROCKCHIP_RK3328)
-			val = v_CUR_REG(tve_s.dac1level) |
-				v_DR_PWR_DOWN(0) | v_BG_PWR_DOWN(0);
-#endif
-	} else {
-		mask = m_VBG_EN | m_DAC_EN;
-		val = 0;
-#if defined(CONFIG_ROCKCHIP_RK3128)
-			grfreg = GRF_TVE_CON0;
-#elif defined(CONFIG_ROCKCHIP_RK3036)
-			grfreg = GRF_SOC_CON3;
-#endif
-		val |= mask << 16;
-
-#if defined(CONFIG_ROCKCHIP_RK322X) || defined(CONFIG_ROCKCHIP_RK3328)
-			val = v_CUR_REG(tve_s.dac1level) |
-				m_DR_PWR_DOWN | m_BG_PWR_DOWN;
-		#endif
-	}
-
-	if (grfreg)
-		writel(val, tve_s.grf + grfreg);
-	else if (tve_s.vdacbase)
-		tve_dac_writel(VDAC_VDAC1, val);
-}
-
-static void tve_set_mode(int mode)
-{
-	if (tve_s.soctype != SOC_RK322X &&
-	    tve_s.soctype != SOC_RK322XH) {
-		tve_writel(TV_RESET, v_RESET(1));
-		udelay(100);
-		tve_writel(TV_RESET, v_RESET(0));
-	}
-
-	if (tve_s.soctype == SOC_RK3036)
-		tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) |
-			   v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) |
-			   v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(0));
-	else
-		tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) |
-			   v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) |
-			   v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(3));
-
-	tve_writel(TV_LUMA_FILTER0, tve_s.lumafilter0);
-	tve_writel(TV_LUMA_FILTER1, tve_s.lumafilter1);
-	tve_writel(TV_LUMA_FILTER2, tve_s.lumafilter2);
-
-	if (mode == TVOUT_CVBS_NTSC) {
-		tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(1) |
-			v_Y_AGC_PULSE_ON(1) | v_Y_VIDEO_ON(1) |
-			v_Y_SYNC_ON(1) | v_PIC_MODE(mode));
-		tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_NTSC) |
-			   v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3));
-		tve_writel(TV_SATURATION, 0x0052543C);
-		if (tve_s.test_mode)
-			tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00008300);
-		else
-			tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00007900);
-
-		tve_writel(TV_FREQ_SC,	0x21F07BD7);
-		tve_writel(TV_SYNC_TIMING, 0x00C07a81);
-		tve_writel(TV_ADJ_TIMING, 0x96B40000);
-		tve_writel(TV_ACT_ST,	0x001500D6);
-		tve_writel(TV_ACT_TIMING, 0x169800FC | (1 << 12) | (1 << 28));
-
-	} else if (mode == TVOUT_CVBS_PAL) {
-		tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(0) |
-			v_Y_AGC_PULSE_ON(0) | v_Y_VIDEO_ON(1) |
-			v_YPP_MODE(1) | v_Y_SYNC_ON(1) | v_PIC_MODE(mode));
-		tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_PAL) |
-			v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3));
-
-		tve_writel(TV_SATURATION, tve_s.saturation);
-		tve_writel(TV_BRIGHTNESS_CONTRAST, tve_s.brightcontrast);
-
-		tve_writel(TV_FREQ_SC,	0x2A098ACB);
-		tve_writel(TV_SYNC_TIMING, 0x00C28381);
-		tve_writel(TV_ADJ_TIMING, (0xc << 28) | 0x06c00800 | 0x80);
-		tve_writel(TV_ACT_ST,	0x001500F6);
-		tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28));
-
-		tve_writel(TV_ADJ_TIMING, tve_s.adjtiming);
-		tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28));
-	}
-}
-
-static u8 rk_get_vdac_value(void)
-{
-	u8 value = 0;
-#ifdef CONFIG_ROCKCHIP_EFUSE
-#if defined(CONFIG_ROCKCHIP_RK322X)
-	struct udevice *dev;
-	u32 regs[2] = {0};
-	u8 fuses[1];
-	ofnode node;
-	int ret;
-
-	ret = uclass_get_device_by_driver(UCLASS_MISC,
-					  DM_GET_DRIVER(rockchip_efuse), &dev);
-	if (ret) {
-		printf("%s: no misc-device found\n", __func__);
-		return -EINVAL;
-	}
-
-	node = dev_read_subnode(dev, "tve_dac");
-	if (!ofnode_valid(node))
-		return -EINVAL;
-
-	ret = ofnode_read_u32_array(node, "reg", regs, 2);
-	if (ret) {
-		printf("Cannot get efuse reg\n");
-		return -EINVAL;
-	}
-
-	ret = misc_read(dev, regs[0], &fuses, regs[1]);
-	if (ret) {
-		printf("%s: misc_read failed\n", __func__);
-		return 0;
-	}
-
-	value = fuses[0];
-	value = (value >> 3) & 0x1f;
-#endif
-#endif /* CONFIG_RK_EFUSE */
-	if (value > 0)
-		value += 5;
-	TVEDBG("%s value = 0x%x\n", __func__, value);
-
-	return value;
-}
-
-static int rockchip_drm_tve_init(struct rockchip_connector *conn, struct display_state *state)
-{
-	int node = 0;
-	int dac_value, getvdac;
-	fdt_addr_t addr;
-
-	tve_s.grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
-	if (tve_s.grf <= 0) {
-		printf("%s:Get syscon grf failed (ret=%p)\n",
-		       __func__, tve_s.grf);
-		return -ENXIO;
-	}
-
-#if defined(CONFIG_ROCKCHIP_RK3036)
-	addr = dev_read_addr_index(conn->dev, 0);
-	if (addr == FDT_ADDR_T_NONE)
-		return -EINVAL;
-
-	tve_s.reg_phy_base = (void *)addr;
-	tve_s.soctype = SOC_RK3036;
-	node = fdt_node_offset_by_compatible(gd->fdt_blob, 0,
-					     "rockchip,rk3036-tve");
-	if (node < 0) {
-		printf("can't find dts node for rk3036-tve\n");
-		goto err;
-	}
-#elif defined(CONFIG_ROCKCHIP_RK3128)
-	addr = dev_read_addr_index(conn->dev, 0);
-	if (addr == FDT_ADDR_T_NONE)
-		return -EINVAL;
-
-	tve_s.reg_phy_base = (void *)addr;
-	tve_s.soctype = SOC_RK312X;
-	tve_s.saturation = 0;
-	node = fdt_node_offset_by_compatible(gd->fdt_blob, 0,
-					     "rockchip,rk312x-tve");
-	if (node < 0) {
-		printf("can't find dts node for rk312x-tve\n");
-		goto err;
-	}
-#elif defined(CONFIG_ROCKCHIP_RK322X)
-	addr = dev_read_addr_index(conn->dev, 0);
-	if (addr == FDT_ADDR_T_NONE)
-		return -EINVAL;
-
-	tve_s.reg_phy_base = (void *)addr;
-	tve_s.soctype = SOC_RK322X;
-	tve_s.saturation = 0;
-
-	addr = dev_read_addr_index(conn->dev, 1);
-	if (addr == FDT_ADDR_T_NONE)
-		return -EINVAL;
-	tve_s.vdacbase = (void *)addr;
-	node = fdt_node_offset_by_compatible(gd->fdt_blob, 0,
-					     "rockchip,rk3328-tve");
-	if (node < 0) {
-		printf("can't find dts node for rk322x-tve\n");
-		goto err;
-	}
-#elif defined(CONFIG_ROCKCHIP_RK3328)
-	addr = dev_read_addr_index(conn->dev, 0);
-	if (addr == FDT_ADDR_T_NONE)
-		return -EINVAL;
-
-	tve_s.reg_phy_base = (void *)addr;
-	tve_s.soctype = SOC_RK322XH;
-
-	addr = dev_read_addr_index(conn->dev, 1);
-	if (addr == FDT_ADDR_T_NONE)
-		return -EINVAL;
-	tve_s.vdacbase = (void *)addr;
-
-	node = fdt_node_offset_by_compatible(gd->fdt_blob, 0,
-					     "rockchip,rk3328-tve");
-	if (node < 0) {
-		printf("can't find dts node for rk322xh-tve\n");
-		goto err;
-	}
-#endif
-
-	if (!fdtdec_get_is_enabled(gd->fdt_blob, node)) {
-		printf("tve is disabled\n");
-		goto err;
-	}
-
-	if (tve_s.soctype == SOC_RK312X)
-		tve_s.test_mode = fdtdec_get_int(gd->fdt_blob, node,
-						 "test_mode", 0);
-
-	tve_s.preferred_mode = fdtdec_get_int(gd->fdt_blob, node,
-					      "rockchip,tvemode", -1);
-	if (tve_s.preferred_mode < 0) {
-		tve_s.preferred_mode = 0;
-	} else if (tve_s.preferred_mode > 1) {
-		printf("tve mode value invalid\n");
-		goto err;
-	}
-
-	tve_s.saturation = fdtdec_get_int(gd->fdt_blob, node,
-					  "rockchip,saturation", 0);
-	if (tve_s.saturation == 0) {
-		printf("tve saturation err\n");
-		goto err;
-	}
-
-	tve_s.brightcontrast = fdtdec_get_int(gd->fdt_blob, node,
-					      "rockchip,brightcontrast", 0);
-	if (tve_s.brightcontrast == 0) {
-		printf("tve brightcontrast err\n");
-		goto err;
-	}
-
-	tve_s.adjtiming = fdtdec_get_int(gd->fdt_blob, node,
-					 "rockchip,adjtiming", 0);
-	if (tve_s.adjtiming == 0) {
-		printf("tve adjtiming err\n");
-		goto err;
-	}
-
-	tve_s.lumafilter0 = fdtdec_get_int(gd->fdt_blob, node,
-					   "rockchip,lumafilter0", 0);
-	if (tve_s.lumafilter0 == 0) {
-		printf("tve lumafilter0 err\n");
-		goto err;
-	}
-
-	tve_s.lumafilter1 = fdtdec_get_int(gd->fdt_blob, node,
-					   "rockchip,lumafilter1", 0);
-	if (tve_s.lumafilter1 == 0) {
-		printf("tve lumafilter1 err\n");
-		goto err;
-	}
-
-	tve_s.lumafilter2 = fdtdec_get_int(gd->fdt_blob, node,
-					   "rockchip,lumafilter2", 0);
-	if (tve_s.lumafilter2 == 0) {
-		printf("tve lumafilter2 err\n");
-		goto err;
-	}
-
-	dac_value = fdtdec_get_int(gd->fdt_blob, node, "rockchip,daclevel", 0);
-	if (dac_value == 0) {
-		printf("tve dac_value err\n");
-		goto err;
-	}
-
-	tve_s.daclevel = dac_value;
-	if (tve_s.soctype == SOC_RK322X) {
-		getvdac = rk_get_vdac_value();
-		if (getvdac > 0) {
-			tve_s.daclevel =
-				dac_value + getvdac - RK322X_VDAC_STANDARD;
-			if (tve_s.daclevel > 0x3f ||
-			    tve_s.daclevel < 0) {
-				printf("rk322x daclevel error!\n");
-				tve_s.daclevel = dac_value;
-			}
-		} else if (getvdac < 0) {
-			printf("get rk322x daclevel error\n");
-			goto err;
-		}
-	}
-
-	if (tve_s.soctype == SOC_RK322X ||
-	    tve_s.soctype == SOC_RK322XH) {
-		tve_s.dac1level = fdtdec_get_int(gd->fdt_blob, node,
-						 "rockchip,dac1level", 0);
-		if (tve_s.dac1level == 0) {
-			printf("rk322x dac1level error!\n");
-			goto err;
-		}
-	}
-	TVEDBG("tve_s.test_mode = 0x%x\n", tve_s.test_mode);
-	TVEDBG("tve_s.saturation = 0x%x\n", tve_s.saturation);
-	TVEDBG("tve_s.brightcontrast = 0x%x\n", tve_s.brightcontrast);
-	TVEDBG("tve_s.adjtiming = 0x%x\n", tve_s.adjtiming);
-	TVEDBG("tve_s.lumafilter0 = 0x%x\n", tve_s.lumafilter0);
-	TVEDBG("tve_s.lumafilter1 = 0x%x\n", tve_s.lumafilter1);
-	TVEDBG("tve_s.lumafilter2 = 0x%x\n", tve_s.lumafilter2);
-	TVEDBG("tve_s.daclevel = 0x%x\n", tve_s.daclevel);
-
-	return 0;
-
-err:
-	dac_enable(0);
-	return -ENODEV;
-}
-
-static int rockchip_drm_tve_enable(struct rockchip_connector *conn, struct display_state *state)
-{
-	struct connector_state *conn_state = &state->conn_state;
-	struct drm_display_mode *mode = &conn_state->mode;
-	int tve_type;
-
-#ifdef CONFIG_ROCKCHIP_INNO_HDMI_PHY
-	/* set inno hdmi phy clk. */
-	rockchip_phy_set_pll(conn->phy, 27000000);
-#endif
-	if (mode->vdisplay == 576)
-		tve_type = TVOUT_CVBS_PAL;
-	else
-		tve_type = TVOUT_CVBS_NTSC;
-	dac_enable(0);
-	tve_set_mode(tve_type);
-	dac_enable(1);
-
-	return 0;
-}
-
-static void rockchip_drm_tve_deinit(struct rockchip_connector *conn, struct display_state *state)
-{
-	dac_enable(0);
-}
-
-static int rockchip_drm_tve_prepare(struct rockchip_connector *conn, struct display_state *state)
-{
-	return 0;
-}
-
-static int rockchip_drm_tve_disable(struct rockchip_connector *conn, struct display_state *state)
-{
-	dac_enable(0);
-	return 0;
-}
-
-static int rockchip_drm_tve_detect(struct rockchip_connector *conn, struct display_state *state)
-{
-	return 1;
-}
-
-static void drm_tve_selete_output(struct overscan *overscan,
-				  struct drm_display_mode *mode)
-{
-	int ret, i, screen_size;
-	struct base_screen_info *screen_info = NULL;
-	struct base_disp_info base_parameter;
-	struct drm_display_mode modes[2];
-	const struct base_overscan *scan;
-	char baseparameter_buf[8 * RK_BLK_SIZE] __aligned(ARCH_DMA_MINALIGN);
-	struct blk_desc *dev_desc;
-	disk_partition_t part_info;
-	int max_scan = 100;
-	int min_scan = 50;
-
-	overscan->left_margin = max_scan;
-	overscan->right_margin = max_scan;
-	overscan->top_margin = max_scan;
-	overscan->bottom_margin = max_scan;
-
-	for (i = 0; i < 2; i++) {
-		modes[i] = tve_modes[i];
-		if (i == tve_s.preferred_mode)
-			modes[i].type |= DRM_MODE_TYPE_PREFERRED;
-	}
-	*mode = modes[tve_s.preferred_mode];
-
-	dev_desc = rockchip_get_bootdev();
-	if (!dev_desc) {
-		printf("%s: Could not find device\n", __func__);
-		return;
-	}
-
-	if (part_get_info_by_name(dev_desc, "baseparameter", &part_info) < 0) {
-		printf("Could not find baseparameter partition\n");
-		return;
-	}
-
-	ret = blk_dread(dev_desc, part_info.start, 1,
-			(void *)baseparameter_buf);
-	if (ret < 0) {
-		printf("read baseparameter failed\n");
-		return;
-	}
-
-	memcpy(&base_parameter, baseparameter_buf, sizeof(base_parameter));
-	scan = &base_parameter.scan;
-
-	screen_size = sizeof(base_parameter.screen_list) /
-		sizeof(base_parameter.screen_list[0]);
-
-	for (i = 0; i < screen_size; i++) {
-		if (base_parameter.screen_list[i].type ==
-		    DRM_MODE_CONNECTOR_TV) {
-			screen_info = &base_parameter.screen_list[i];
-			break;
-		}
-	}
-
-	if (scan->leftscale < min_scan && scan->leftscale > 0)
-		overscan->left_margin = min_scan;
-	else if (scan->leftscale < max_scan)
-		overscan->left_margin = scan->leftscale;
-
-	if (scan->rightscale < min_scan && scan->rightscale > 0)
-		overscan->right_margin = min_scan;
-	else if (scan->rightscale < max_scan)
-		overscan->right_margin = scan->rightscale;
-
-	if (scan->topscale < min_scan && scan->topscale > 0)
-		overscan->top_margin = min_scan;
-	else if (scan->topscale < max_scan)
-		overscan->top_margin = scan->topscale;
-
-	if (scan->bottomscale < min_scan && scan->bottomscale > 0)
-		overscan->bottom_margin = min_scan;
-	else if (scan->bottomscale < max_scan)
-		overscan->bottom_margin = scan->bottomscale;
-
-	if (screen_info &&
-	    (screen_info->mode.hdisplay == 720 &&
-	    screen_info->mode.vdisplay == 576 &&
-	    screen_info->mode.hsync_start == 753 &&
-	    screen_info->mode.hsync_end == 816))
-		*mode = modes[0];
-	else if (screen_info &&
-		 screen_info->mode.vdisplay == 480 &&
-		 screen_info->mode.vsync_start == 480 &&
-		 screen_info->mode.vsync_end == 486)
-		*mode = modes[1];
-
-	if (screen_info)
-		printf("base_parameter.mode:%dx%d\n",
-		       screen_info->mode.hdisplay,
-		       screen_info->mode.vdisplay);
-}
-
-static int rockchip_drm_tve_get_timing(struct rockchip_connector *conn, struct display_state *state)
-{
-	struct connector_state *conn_state = &state->conn_state;
-	struct drm_display_mode *mode = &conn_state->mode;
-
-	conn_state->output_mode = ROCKCHIP_OUT_MODE_P888;
-	conn_state->bus_format = MEDIA_BUS_FMT_YUV8_1X24;
-	drm_tve_selete_output(&conn_state->overscan, mode);
-
-	return 0;
-}
-
-const struct rockchip_connector_funcs rockchip_drm_tve_funcs = {
-	.init = rockchip_drm_tve_init,
-	.deinit = rockchip_drm_tve_deinit,
-	.prepare = rockchip_drm_tve_prepare,
-	.enable = rockchip_drm_tve_enable,
-	.disable = rockchip_drm_tve_disable,
-	.get_timing = rockchip_drm_tve_get_timing,
-	.detect = rockchip_drm_tve_detect,
-};
-
-static int rockchip_drm_tve_probe(struct udevice *dev)
-{
-	struct rockchip_connector *conn = dev_get_priv(dev);
-
-	rockchip_connector_bind(conn, dev, 0, &rockchip_drm_tve_funcs, NULL,
-				DRM_MODE_CONNECTOR_TV);
-
-	return 0;
-}
-
-static const struct udevice_id rockchip_drm_tve_ids[] = {
-	{
-	 .compatible = "rockchip,rk3328-tve",
-	}, {}
-};
-
-U_BOOT_DRIVER(rockchip_drm_tve) = {
-	.name = "rockchip_drm_tve",
-	.id = UCLASS_DISPLAY,
-	.of_match = rockchip_drm_tve_ids,
-	.probe	= rockchip_drm_tve_probe,
-	.priv_auto_alloc_size = sizeof(struct rockchip_connector),
-};
diff --git a/u-boot/drivers/video/drm/rockchip_drm_tve.h b/u-boot/drivers/video/drm/rockchip_drm_tve.h
deleted file mode 100644
index 2d504a6..0000000
--- a/u-boot/drivers/video/drm/rockchip_drm_tve.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * SPDX-License-Identifier:	GPL-2.0+
- * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd
- */
-#ifndef __ROCKCHIP_DRM_TVE_H__
-#define __ROCKCHIP_DRM_TVE_H__
-
-#include <lcd.h>
-
-#define TV_CTRL			(0x00)
-	#define m_CVBS_MODE			BIT(24)
-	#define m_CLK_UPSTREAM_EN		(3 << 18)
-	#define m_TIMING_EN			(3 << 16)
-	#define m_LUMA_FILTER_GAIN		(3 << 9)
-	#define m_LUMA_FILTER_BW		BIT(8)
-	#define m_CSC_PATH			(3 << 1)
-
-	#define v_CVBS_MODE(x)			((x & 1) << 24)
-	#define v_CLK_UPSTREAM_EN(x)		((x & 3) << 18)
-	#define v_TIMING_EN(x)			((x & 3) << 16)
-	#define v_LUMA_FILTER_GAIN(x)		((x & 3) << 9)
-	#define v_LUMA_FILTER_UPSAMPLE(x)	((x & 1) << 8)
-	#define v_CSC_PATH(x)			((x & 3) << 1)
-
-#define TV_SYNC_TIMING		(0x04)
-#define TV_ACT_TIMING		(0x08)
-#define TV_ADJ_TIMING		(0x0c)
-#define TV_FREQ_SC		(0x10)
-#define TV_LUMA_FILTER0		(0x14)
-#define TV_LUMA_FILTER1		(0x18)
-#define TV_LUMA_FILTER2		(0x1C)
-#define TV_ACT_ST		(0x34)
-#define TV_ROUTING		(0x38)
-	#define m_DAC_SENSE_EN		BIT(27)
-	#define m_Y_IRE_7_5		BIT(19)
-	#define m_Y_AGC_PULSE_ON	BIT(15)
-	#define m_Y_VIDEO_ON		BIT(11)
-	#define m_Y_SYNC_ON		BIT(7)
-	#define m_YPP_MODE		BIT(3)
-	#define m_MONO_EN		BIT(2)
-	#define m_PIC_MODE		BIT(1)
-
-	#define v_DAC_SENSE_EN(x)	((x & 1) << 27)
-	#define v_Y_IRE_7_5(x)		((x & 1) << 19)
-	#define v_Y_AGC_PULSE_ON(x)	((x & 1) << 15)
-	#define v_Y_VIDEO_ON(x)		((x & 1) << 11)
-	#define v_Y_SYNC_ON(x)		((x & 1) << 7)
-	#define v_YPP_MODE(x)		((x & 1) << 3)
-	#define v_MONO_EN(x)		((x & 1) << 2)
-	#define v_PIC_MODE(x)		((x & 1) << 1)
-
-#define TV_SYNC_ADJUST		(0x50)
-#define TV_STATUS		(0x54)
-#define TV_RESET		(0x68)
-	#define m_RESET			BIT(1)
-	#define v_RESET(x)		((x & 1) << 1)
-#define TV_SATURATION		(0x78)
-#define TV_BW_CTRL		(0x8C)
-	#define m_CHROMA_BW	(3 << 4)
-	#define m_COLOR_DIFF_BW	(0xf)
-
-	enum {
-		BP_FILTER_PASS = 0,
-		BP_FILTER_NTSC,
-		BP_FILTER_PAL,
-	};
-	enum {
-		COLOR_DIFF_FILTER_OFF = 0,
-		COLOR_DIFF_FILTER_BW_0_6,
-		COLOR_DIFF_FILTER_BW_1_3,
-		COLOR_DIFF_FILTER_BW_2_0
-	};
-
-	#define v_CHROMA_BW(x)		((3 & x) << 4)
-	#define v_COLOR_DIFF_BW(x)	(0xF & x)
-
-#define TV_BRIGHTNESS_CONTRAST	(0x90)
-
-#define m_EXTREF_EN		BIT(0)
-#define m_VBG_EN		BIT(1)
-#define m_DAC_EN		BIT(2)
-#define m_SENSE_EN		BIT(3)
-#define m_BIAS_EN		(7 << 4)
-#define m_DAC_GAIN		(0x3f << 7)
-#define v_DAC_GAIN(x)		((x & 0x3f) << 7)
-
-#define VDAC_VDAC0             (0x00)
-       #define m_RST_ANA               BIT(7)
-       #define m_RST_DIG               BIT(6)
-
-       #define v_RST_ANA(x)            ((x & 1) << 7)
-       #define v_RST_DIG(x)            ((x & 1) << 6)
-#define VDAC_VDAC1             (0x280)
-       #define m_CUR_REG               (0xf << 4)
-       #define m_DR_PWR_DOWN           BIT(1)
-       #define m_BG_PWR_DOWN           BIT(0)
-
-       #define v_CUR_REG(x)            ((x & 0xf) << 4)
-       #define v_DR_PWR_DOWN(x)        ((x & 1) << 1)
-       #define v_BG_PWR_DOWN(x)        ((x & 1) << 0)
-#define VDAC_VDAC2             (0x284)
-       #define m_CUR_CTR               (0X3f)
-
-       #define v_CUR_CTR(x)            ((x & 0X3f))
-#define VDAC_VDAC3             (0x288)
-       #define m_CAB_EN                BIT(5)
-       #define m_CAB_REF               BIT(4)
-       #define m_CAB_FLAG              BIT(0)
-
-       #define v_CAB_EN(x)             ((x & 1) << 5)
-       #define v_CAB_REF(x)            ((x & 1) << 4)
-       #define v_CAB_FLAG(x)           ((x & 1) << 0)
-
-enum {
-	TVOUT_CVBS_NTSC = 0,
-	TVOUT_CVBS_PAL,
-};
-
-enum {
-	SOC_RK3036 = 0,
-	SOC_RK312X,
-	SOC_RK322X,
-	SOC_RK322XH
-};
-
-struct drm_tve {
-	void    *reg_phy_base;
-	int	soctype;
-	int	test_mode;
-	int	saturation;
-	void    *vdacbase;
-	int	brightcontrast;
-	int	adjtiming;
-	int	lumafilter0;
-	int	lumafilter1;
-	int	lumafilter2;
-	int	daclevel;
-	int	dac1level;
-	int	preferred_mode;
-	void    *grf;
-};
-
-#define RK30_TVE_REGBASE 0x10118000 + 0x200
-#define MAX_TVE_COUNT  2
-
-#ifdef TVEDEBUG
-#define TVEDBG(format, ...) \
-		printf("TVE: " format, ## __VA_ARGS__)
-#else
-#define TVEDBG(format, ...)
-#endif
-
-#endif /* __ROCKCHIP_DRM_TVE_H__*/
diff --git a/u-boot/drivers/video/drm/rockchip_dw_hdmi.c b/u-boot/drivers/video/drm/rockchip_dw_hdmi.c
index 3a3169c..6e6139f 100644
--- a/u-boot/drivers/video/drm/rockchip_dw_hdmi.c
+++ b/u-boot/drivers/video/drm/rockchip_dw_hdmi.c
@@ -7,6 +7,7 @@
 #include <common.h>
 #include <boot_rkimg.h>
 #include <asm/io.h>
+#include <asm/gpio.h>
 #include <dm/of_access.h>
 #include <dm/device.h>
 #include <linux/dw_hdmi.h>
@@ -35,6 +36,19 @@
 #define RK3328_GRF_SOC_CON2              0x0408
 #define RK3328_GRF_SOC_CON3              0x040c
 #define RK3328_GRF_SOC_CON4              0x0410
+
+#define RK3528_GPIO0A_IOMUX_SEL_H	0x4
+#define RK3528_GPIO0A_PULL 		0x200
+#define RK3528_DDC_PULL			(0xf00 << 16)
+#define RK3528_VO_GRF_HDMI_MASK		0x60014
+#define RK3528_HDMI_SNKDET_SEL		((BIT(6) << 16) | BIT(6))
+#define RK3528_HDMI_SNKDET		BIT(21)
+#define RK3528_HDMI_CECIN_MSK		((BIT(2) << 16) | BIT(2))
+#define RK3528_HDMI_SDAIN_MSK		((BIT(1) << 16) | BIT(1))
+#define RK3528_HDMI_SCLIN_MSK		((BIT(0) << 16) | BIT(0))
+
+#define RK3528_GPIO_SWPORT_DR_L		0x0000
+#define RK3528_GPIO0_A2_DR		((BIT(2) << 16) | BIT(2))
 
 #define RK3568_GRF_VO_CON1               0x0364
 #define RK3568_HDMI_SDAIN_MSK            ((1 << 15) | (1 << (15 + 16)))
@@ -177,7 +191,7 @@
 	}
 };
 
-static const struct dw_hdmi_phy_config rockchip_phy_config[] = {
+static struct dw_hdmi_phy_config rockchip_phy_config[] = {
 	/*pixelclk   symbol   term   vlev*/
 	{ 74250000,  0x8009, 0x0004, 0x0272},
 	{ 165000000, 0x802b, 0x0004, 0x0209},
@@ -334,19 +348,23 @@
 			  enum dw_hdmi_devtype dev_type,
 			  bool output_bus_format_rgb)
 {
-	int ret, i, screen_size;
-	struct base_disp_info base_parameter;
 	struct base2_disp_info *base2_parameter = conn_state->disp_info;
 	const struct base_overscan *scan;
 	struct base_screen_info *screen_info = NULL;
 	struct base2_screen_info *screen_info2 = NULL;
 	int max_scan = 100;
 	int min_scan = 51;
+#ifdef CONFIG_SPL_BUILD
+	int i, screen_size;
+#else
+	int ret, i, screen_size;
 	int offset = 0;
 	bool found = false;
 	struct blk_desc *dev_desc;
 	disk_partition_t part_info;
 	char baseparameter_buf[8 * RK_BLK_SIZE] __aligned(ARCH_DMA_MINALIGN);
+	struct base_disp_info base_parameter;
+#endif
 
 	overscan->left_margin = max_scan;
 	overscan->right_margin = max_scan;
@@ -358,6 +376,27 @@
 	else
 		*bus_format = MEDIA_BUS_FMT_YUV8_1X24;
 
+#ifdef CONFIG_SPL_BUILD
+	scan = &base2_parameter->overscan_info;
+	screen_size = sizeof(base2_parameter->screen_info) /
+		sizeof(base2_parameter->screen_info[0]);
+
+	for (i = 0; i < screen_size; i++) {
+		if (base2_parameter->screen_info[i].type ==
+		    DRM_MODE_CONNECTOR_HDMIA) {
+			screen_info2 =
+				&base2_parameter->screen_info[i];
+			break;
+		}
+	}
+	screen_info = malloc(sizeof(*screen_info));
+
+	screen_info->type = screen_info2->type;
+	screen_info->mode = screen_info2->resolution;
+	screen_info->format = screen_info2->format;
+	screen_info->depth = screen_info2->depthc;
+	screen_info->feature = screen_info2->feature;
+#else
 	if (!base2_parameter) {
 		dev_desc = rockchip_get_bootdev();
 		if (!dev_desc) {
@@ -422,6 +461,7 @@
 		screen_info->depth = screen_info2->depthc;
 		screen_info->feature = screen_info2->feature;
 	}
+#endif
 
 	if (scan->leftscale < min_scan && scan->leftscale > 0)
 		overscan->left_margin = min_scan;
@@ -443,7 +483,9 @@
 	else if (scan->bottomscale < max_scan && scan->bottomscale > 0)
 		overscan->bottom_margin = scan->bottomscale;
 
+#ifndef CONFIG_SPL_BUILD
 null_basep:
+#endif
 
 	if (screen_info)
 		printf("base_parameter.mode:%dx%d\n",
@@ -463,8 +505,15 @@
 		writel(RK3328_IO_3V_DOMAIN, grf + RK3328_GRF_SOC_CON4);
 }
 
-void dw_hdmi_set_iomux(void *grf, int dev_type)
+void dw_hdmi_set_iomux(void *grf, void *gpio_base, struct gpio_desc *hpd_gpiod,
+		       int dev_type)
 {
+	u32 val = 0;
+	int i = 400;
+#ifdef CONFIG_SPL_BUILD
+	void *gpio0_ioc = (void *)RK3528_GPIO0_IOC_BASE;
+#endif
+
 	switch (dev_type) {
 	case RK3328_HDMI:
 		writel(RK3328_IO_DDC_IN_MSK, grf + RK3328_GRF_SOC_CON2);
@@ -473,6 +522,49 @@
 	case RK3228_HDMI:
 		writel(RK3228_IO_3V_DOMAIN, grf + RK3228_GRF_SOC_CON6);
 		writel(RK3228_IO_DDC_IN_MSK, grf + RK3228_GRF_SOC_CON2);
+		break;
+	case RK3528_HDMI:
+		writel(RK3528_HDMI_SDAIN_MSK | RK3528_HDMI_SCLIN_MSK |
+		       RK3528_HDMI_SNKDET_SEL,
+		       grf + RK3528_VO_GRF_HDMI_MASK);
+
+#ifdef CONFIG_SPL_BUILD
+		val = (0x11 << 16) | 0x11;
+		writel(val, gpio0_ioc + RK3528_GPIO0A_IOMUX_SEL_H);
+
+		writel(RK3528_DDC_PULL, gpio0_ioc + RK3528_GPIO0A_PULL);
+
+		/* gpio0_a2's input enable is controlled by gpio output data bit */
+		writel(RK3528_GPIO0_A2_DR, gpio_base + RK3528_GPIO_SWPORT_DR_L);
+
+		while (i--) {
+			val = readl(gpio_base + 0x70) & BIT(2);
+			if (val)
+				break;
+			mdelay(5);
+		}
+#else
+		writel(val, grf + RK3528_VO_GRF_HDMI_MASK);
+
+		/* gpio0_a2's input enable is controlled by gpio output data bit */
+		writel(RK3528_GPIO0_A2_DR, gpio_base + RK3528_GPIO_SWPORT_DR_L);
+
+		if (dm_gpio_is_valid(hpd_gpiod)) {
+			while (i--) {
+				val = dm_gpio_get_value(hpd_gpiod);
+				if (val)
+					break;
+				mdelay(5);
+			}
+		}
+#endif
+
+		if (val)
+			val = RK3528_HDMI_SNKDET | BIT(5);
+		else
+			val = RK3528_HDMI_SNKDET;
+		writel(val, grf + RK3528_VO_GRF_HDMI_MASK);
+
 		break;
 	case RK3568_HDMI:
 		writel(RK3568_HDMI_SDAIN_MSK | RK3568_HDMI_SCLIN_MSK,
@@ -544,6 +636,14 @@
 	.dev_type   = RK3399_HDMI,
 };
 
+const struct dw_hdmi_plat_data rk3528_hdmi_drv_data = {
+	.vop_sel_bit = 0,
+	.grf_vop_sel_reg = 0,
+	.phy_ops    = &inno_dw_hdmi_phy_ops,
+	.phy_name   = "inno_dw_hdmi_phy2",
+	.dev_type   = RK3528_HDMI,
+};
+
 const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = {
 	.vop_sel_bit = 0,
 	.grf_vop_sel_reg = 0,
@@ -554,6 +654,19 @@
 	.dev_type   = RK3568_HDMI,
 };
 
+#ifdef CONFIG_SPL_BUILD
+int rockchip_spl_dw_hdmi_probe(struct connector_state *conn_state)
+{
+	conn_state->connector = malloc(sizeof(struct rockchip_connector));
+
+	memset(conn_state->connector, 0, sizeof(*conn_state->connector));
+	rockchip_connector_bind(conn_state->connector, NULL, 0, &rockchip_dw_hdmi_funcs,
+				(void *)&rk3528_hdmi_drv_data,
+				DRM_MODE_CONNECTOR_HDMIA);
+
+	return 0;
+}
+#else
 static int rockchip_dw_hdmi_probe(struct udevice *dev)
 {
 	int id;
@@ -568,9 +681,13 @@
 
 	return 0;
 }
+#endif
 
 static const struct udevice_id rockchip_dw_hdmi_ids[] = {
 	{
+	 .compatible = "rockchip,rk3528-dw-hdmi",
+	 .data = (ulong)&rk3528_hdmi_drv_data,
+	}, {
 	 .compatible = "rockchip,rk3568-dw-hdmi",
 	 .data = (ulong)&rk3568_hdmi_drv_data,
 	}, {
@@ -598,6 +715,8 @@
 	.name = "rockchip_dw_hdmi",
 	.id = UCLASS_DISPLAY,
 	.of_match = rockchip_dw_hdmi_ids,
+#ifndef CONFIG_SPL_BUILD
 	.probe	= rockchip_dw_hdmi_probe,
+#endif
 	.priv_auto_alloc_size = sizeof(struct rockchip_connector),
 };
diff --git a/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c b/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c
index 13c8f47..32dc484 100644
--- a/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c
+++ b/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c
@@ -50,6 +50,7 @@
 
 #define RK3588_GRF_VO1_CON3		0x000c
 #define RK3588_COLOR_FORMAT_MASK	0xf
+#define RK3588_YUV422			0x1
 #define RK3588_YUV444			0x2
 #define RK3588_YUV420			0x3
 #define RK3588_COMPRESSED_DATA		0xb
@@ -348,6 +349,9 @@
 	case MEDIA_BUS_FMT_UYVY8_1X16:
 	case MEDIA_BUS_FMT_UYVY10_1X20:
 	case MEDIA_BUS_FMT_UYVY12_1X24:
+	case MEDIA_BUS_FMT_YUYV8_1X16:
+	case MEDIA_BUS_FMT_YUYV10_1X20:
+	case MEDIA_BUS_FMT_YUYV12_1X24:
 		return true;
 
 	default:
@@ -375,18 +379,21 @@
 	case MEDIA_BUS_FMT_RGB888_1X24:
 	case MEDIA_BUS_FMT_YUV8_1X24:
 	case MEDIA_BUS_FMT_UYVY8_1X16:
+	case MEDIA_BUS_FMT_YUYV8_1X16:
 	case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
 		return 8;
 
 	case MEDIA_BUS_FMT_RGB101010_1X30:
 	case MEDIA_BUS_FMT_YUV10_1X30:
 	case MEDIA_BUS_FMT_UYVY10_1X20:
+	case MEDIA_BUS_FMT_YUYV10_1X20:
 	case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
 		return 10;
 
 	case MEDIA_BUS_FMT_RGB121212_1X36:
 	case MEDIA_BUS_FMT_YUV12_1X36:
 	case MEDIA_BUS_FMT_UYVY12_1X24:
+	case MEDIA_BUS_FMT_YUYV12_1X24:
 	case MEDIA_BUS_FMT_UYYVYY12_0_5X36:
 		return 12;
 
@@ -834,12 +841,8 @@
 	if (screen_info && screen_info->depth == 10)
 		color_depth = screen_info->depth;
 
-	if (mode->clock >= 600000) {
+	if (mode->clock >= 600000)
 		color_format = DRM_HDMI_OUTPUT_YCBCR420;
-	} else if (mode->clock >= 340000) {
-		if (drm_mode_is_420(info, mode))
-			color_format = DRM_HDMI_OUTPUT_YCBCR420;
-	}
 
 	if (color_format == DRM_HDMI_OUTPUT_YCBCR422 || color_depth == 8)
 		tmdsclock = pixclock;
@@ -876,7 +879,7 @@
 		case DRM_HDMI_OUTPUT_YCBCR444:
 			return MEDIA_BUS_FMT_YUV10_1X30;
 		case DRM_HDMI_OUTPUT_YCBCR422:
-			return MEDIA_BUS_FMT_UYVY10_1X20;
+			return MEDIA_BUS_FMT_YUYV10_1X20;
 		case DRM_HDMI_OUTPUT_YCBCR420:
 			return MEDIA_BUS_FMT_UYYVYY10_0_5X30;
 		default:
@@ -887,7 +890,7 @@
 		case DRM_HDMI_OUTPUT_YCBCR444:
 			return MEDIA_BUS_FMT_YUV8_1X24;
 		case DRM_HDMI_OUTPUT_YCBCR422:
-			return MEDIA_BUS_FMT_UYVY8_1X16;
+			return MEDIA_BUS_FMT_YUYV8_1X16;
 		case DRM_HDMI_OUTPUT_YCBCR420:
 			return MEDIA_BUS_FMT_UYYVYY8_0_5X24;
 		default:
@@ -1081,7 +1084,7 @@
 		if (hdmi_bus_fmt_is_yuv420(*bus_format))
 			hdmi->bus_width /= 2;
 
-		if (color_depth == 10)
+		if (color_depth == 10 && !hdmi_bus_fmt_is_yuv422(*bus_format))
 			hdmi->bus_width |= COLOR_DEPTH_10BIT;
 	}
 
@@ -1154,6 +1157,10 @@
 	case MEDIA_BUS_FMT_YUV10_1X30:
 		val = HIWORD_UPDATE(RK3588_YUV444, RK3588_COLOR_FORMAT_MASK);
 		break;
+	case MEDIA_BUS_FMT_YUYV10_1X20:
+	case MEDIA_BUS_FMT_YUYV8_1X16:
+		val = HIWORD_UPDATE(RK3588_YUV422, RK3588_COLOR_FORMAT_MASK);
+		break;
 	default:
 		dev_err(hdmi->dev, "can't set correct color format\n");
 		return;
@@ -1162,7 +1169,7 @@
 	if (hdmi->link_cfg.dsc_mode)
 		val = HIWORD_UPDATE(RK3588_COMPRESSED_DATA, RK3588_COLOR_FORMAT_MASK);
 
-	if (depth == 8)
+	if (depth == 8 || bus_format == MEDIA_BUS_FMT_YUYV10_1X20)
 		val |= HIWORD_UPDATE(RK3588_8BPC, RK3588_COLOR_DEPTH_MASK);
 	else
 		val |= HIWORD_UPDATE(RK3588_10BPC, RK3588_COLOR_DEPTH_MASK);
diff --git a/u-boot/drivers/video/drm/rockchip_lvds.c b/u-boot/drivers/video/drm/rockchip_lvds.c
index ffacd49..d7acbe4 100644
--- a/u-boot/drivers/video/drm/rockchip_lvds.c
+++ b/u-boot/drivers/video/drm/rockchip_lvds.c
@@ -59,6 +59,9 @@
 #define RK3368_LVDS_MSBSEL(x)		HIWORD_UPDATE(x, 11, 11)
 #define RK3368_LVDS_P2S_EN(x)		HIWORD_UPDATE(x,  6,  6)
 
+#define RK3562_GRF_VO_CON0		0x05d0
+#define RK3562_GRF_VO_CON1		0x05d4
+
 #define RK3568_GRF_VO_CON0		0x0360
 #define RK3568_LVDS1_SELECT(x)		HIWORD_UPDATE(x, 13, 12)
 #define RK3568_LVDS1_MSBSEL(x)		HIWORD_UPDATE(x, 11, 11)
@@ -307,6 +310,25 @@
 	.disable = rk3368_lvds_disable,
 };
 
+static void rk3562_lvds_enable(struct rockchip_lvds *lvds, int pipe)
+{
+	regmap_write(lvds->grf, RK3562_GRF_VO_CON1,
+		     RK3568_LVDS0_MODE_EN(1) | RK3568_LVDS0_P2S_EN(1) |
+		     RK3568_LVDS0_DCLK_INV_SEL(1));
+	regmap_write(lvds->grf, RK3562_GRF_VO_CON0,
+		     RK3568_LVDS0_SELECT(lvds->format) | RK3568_LVDS0_MSBSEL(1));
+}
+
+static void rk3562_lvds_disable(struct rockchip_lvds *lvds)
+{
+	regmap_write(lvds->grf, RK3562_GRF_VO_CON1, RK3568_LVDS0_MODE_EN(0));
+}
+
+static const struct rockchip_lvds_funcs rk3562_lvds_funcs = {
+	.enable = rk3562_lvds_enable,
+	.disable = rk3562_lvds_disable,
+};
+
 static void rk3568_lvds_enable(struct rockchip_lvds *lvds, int pipe)
 {
 	regmap_write(lvds->grf, RK3568_GRF_VO_CON2,
@@ -344,6 +366,10 @@
 		.data = (ulong)&rk3368_lvds_funcs,
 	},
 	{
+		.compatible = "rockchip,rk3562-lvds",
+		.data = (ulong)&rk3562_lvds_funcs,
+	},
+	{
 		.compatible = "rockchip,rk3568-lvds",
 		.data = (ulong)&rk3568_lvds_funcs,
 	},
diff --git a/u-boot/drivers/video/drm/rockchip_panel.c b/u-boot/drivers/video/drm/rockchip_panel.c
index 570bc99..5203371 100755
--- a/u-boot/drivers/video/drm/rockchip_panel.c
+++ b/u-boot/drivers/video/drm/rockchip_panel.c
@@ -12,6 +12,7 @@
 #include <malloc.h>
 #include <video.h>
 #include <backlight.h>
+#include <spi.h>
 #include <asm/gpio.h>
 #include <dm/device.h>
 #include <dm/read.h>
@@ -65,6 +66,7 @@
 	bool enabled;
 	struct udevice *power_supply;
 	struct udevice *backlight;
+	struct spi_slave *spi_slave;
 	struct gpio_desc enable_gpio;
 	struct gpio_desc reset_gpio;
 	struct gpio_desc edp_bl_on;
@@ -197,24 +199,48 @@
 {
 	struct rockchip_panel_priv *priv = dev_get_priv(panel->dev);
 	int i;
+	int ret;
 
 	if (!cmds)
 		return -EINVAL;
 
+	if (priv->spi_slave) {
+		ret = spi_claim_bus(priv->spi_slave);
+		if (ret) {
+			printf("%s: Failed to claim spi bus: %d\n", __func__, ret);
+			return -EINVAL;
+		}
+	}
+
 	for (i = 0; i < cmds->cmd_cnt; i++) {
 		struct rockchip_cmd_desc *desc = &cmds->cmds[i];
 		int value = 0;
+		u16 mask = 0;
+		u16 data = 0;
 
-		if (desc->header.payload_length == 2)
-			value = (desc->payload[0] << 8) | desc->payload[1];
-		else
-			value = desc->payload[0];
-		rockchip_panel_write_spi_cmds(priv,
-					      desc->header.data_type, value);
+		if (priv->spi_slave) {
+			mask = desc->header.data_type ? 0x100 : 0;
+			data = (mask | desc->payload[0]) << 7;;
+			data = ((data & 0xff) << 8) | (data >> 8);
+			value = mask | desc->payload[0];
+			ret = spi_xfer(priv->spi_slave, 9, &data, NULL, SPI_XFER_ONCE);
+			if (ret)
+				printf("%s: Failed to xfer spi cmd 0x%x: %d\n",
+				       __func__, desc->payload[0], ret);
+		} else {
+			if (desc->header.payload_length == 2)
+				value = (desc->payload[0] << 8) | desc->payload[1];
+			else
+				value = desc->payload[0];
+			rockchip_panel_write_spi_cmds(priv, desc->header.data_type, value);
+		}
 
 		if (desc->header.delay_ms)
 			mdelay(desc->header.delay_ms);
 	}
+
+	if (priv->spi_slave)
+		spi_release_bus(priv->spi_slave);
 
 	return 0;
 }
@@ -336,21 +362,24 @@
 		
 	if (dm_gpio_is_valid(&priv->edp_bl_en))
 		dm_gpio_set_value(&priv->edp_bl_en, 1);
-	
+
 	if (dm_gpio_is_valid(&priv->enable_gpio))
 		dm_gpio_set_value(&priv->enable_gpio, 1);
-	
+
 	if (plat->delay.prepare)
 		mdelay(plat->delay.prepare);
-	
+
 	if (dm_gpio_is_valid(&priv->reset_gpio))
 		dm_gpio_set_value(&priv->reset_gpio, 1);
+
+	if (plat->delay.reset)
+		mdelay(plat->delay.reset);
 	mdelay(50);
 	if (dm_gpio_is_valid(&priv->reset_gpio))
 		dm_gpio_set_value(&priv->reset_gpio, 0);
-			
-	mdelay(200);
 
+	mdelay(200);
+	
 	if (plat->delay.init)
 		mdelay(plat->delay.init);
 
@@ -556,7 +585,7 @@
 		printf("%s: Cannot get reset GPIO: %d\n", __func__, ret);
 		return ret;
 	}
-
+	
 	ret = gpio_request_by_name(dev, "lvds-gpio0", 0,
 				   &priv->lvds_gpio0, GPIOD_IS_OUT);
 	if (ret && ret != -ENOENT) {
@@ -584,7 +613,7 @@
 		printf("%s: Cannot get lvds-gpio3: %d\n", __func__, ret);
 		return ret;
 	}
-	
+
 	ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
 					   "backlight", &priv->backlight);
 	if (ret && ret != -ENOENT) {
@@ -606,31 +635,47 @@
 		priv->cmd_type = get_panel_cmd_type(cmd_type);
 
 	if (priv->cmd_type == CMD_TYPE_SPI) {
-		ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0,
-					   &priv->spi_sdi_gpio, GPIOD_IS_OUT);
-		if (ret && ret != -ENOENT) {
-			printf("%s: Cannot get spi sdi GPIO: %d\n",
-			       __func__, ret);
-			return ret;
+		ofnode parent = ofnode_get_parent(dev->node);
+
+		if (ofnode_valid(parent)) {
+			struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
+			struct udevice *spi = dev_get_parent(dev);
+
+			if (spi->seq < 0) {
+				printf("%s: Failed to get spi bus num\n", __func__);
+				return -EINVAL;
+			}
+
+			priv->spi_slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz,
+							  plat->mode);
+			if (!priv->spi_slave) {
+				printf("%s: Failed to setup spi slave: %d\n", __func__, ret);
+				return -EINVAL;
+			}
+		} else {
+			ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0,
+						   &priv->spi_sdi_gpio, GPIOD_IS_OUT);
+			if (ret && ret != -ENOENT) {
+				printf("%s: Cannot get spi sdi GPIO: %d\n", __func__, ret);
+				return ret;
+			}
+			ret = gpio_request_by_name(dev, "spi-scl-gpios", 0,
+						   &priv->spi_scl_gpio, GPIOD_IS_OUT);
+			if (ret && ret != -ENOENT) {
+				printf("%s: Cannot get spi scl GPIO: %d\n", __func__, ret);
+				return ret;
+			}
+			ret = gpio_request_by_name(dev, "spi-cs-gpios", 0,
+						   &priv->spi_cs_gpio, GPIOD_IS_OUT);
+			if (ret && ret != -ENOENT) {
+				printf("%s: Cannot get spi cs GPIO: %d\n", __func__, ret);
+				return ret;
+			}
+			dm_gpio_set_value(&priv->spi_sdi_gpio, 1);
+			dm_gpio_set_value(&priv->spi_scl_gpio, 1);
+			dm_gpio_set_value(&priv->spi_cs_gpio, 1);
+			dm_gpio_set_value(&priv->reset_gpio, 0);
 		}
-		ret = gpio_request_by_name(dev, "spi-scl-gpios", 0,
-					   &priv->spi_scl_gpio, GPIOD_IS_OUT);
-		if (ret && ret != -ENOENT) {
-			printf("%s: Cannot get spi scl GPIO: %d\n",
-			       __func__, ret);
-			return ret;
-		}
-		ret = gpio_request_by_name(dev, "spi-cs-gpios", 0,
-					   &priv->spi_cs_gpio, GPIOD_IS_OUT);
-		if (ret && ret != -ENOENT) {
-			printf("%s: Cannot get spi cs GPIO: %d\n",
-			       __func__, ret);
-			return ret;
-		}
-		dm_gpio_set_value(&priv->spi_sdi_gpio, 1);
-		dm_gpio_set_value(&priv->spi_scl_gpio, 1);
-		dm_gpio_set_value(&priv->spi_cs_gpio, 1);
-		dm_gpio_set_value(&priv->reset_gpio, 0);
 	}
 
 	panel = calloc(1, sizeof(*panel));
@@ -649,6 +694,7 @@
 static const struct udevice_id rockchip_panel_ids[] = {
 	{ .compatible = "simple-panel", },
 	{ .compatible = "simple-panel-dsi", },
+	{ .compatible = "simple-panel-spi", },
 	{}
 };
 
diff --git a/u-boot/drivers/video/drm/rockchip_post_csc.c b/u-boot/drivers/video/drm/rockchip_post_csc.c
new file mode 100755
index 0000000..2409103
--- /dev/null
+++ b/u-boot/drivers/video/drm/rockchip_post_csc.c
@@ -0,0 +1,1587 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ * Author: Zhang yubing <yubing.zhang@rock-chips.com>
+ */
+
+#include <stdio.h>
+#include <linux/errno.h>
+
+#include "rockchip_post_csc.h"
+
+#define PQ_CSC_HUE_TABLE_NUM			256
+#define PQ_CSC_MODE_COEF_COMMENT_LEN		32
+#define PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH	10
+#define PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM		(1 << PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH)
+
+#define PQ_CALC_ENHANCE_BIT			6
+/* csc convert coef fixed-point num bit width */
+#define PQ_CSC_PARAM_FIX_BIT_WIDTH		10
+/* csc convert coef half fixed-point num bit width */
+#define PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH		(PQ_CSC_PARAM_FIX_BIT_WIDTH - 1)
+/* csc convert coef fixed-point num */
+#define PQ_CSC_PARAM_FIX_NUM			(1 << PQ_CSC_PARAM_FIX_BIT_WIDTH)
+#define PQ_CSC_PARAM_HALF_FIX_NUM		(1 << PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH)
+/* csc input param bit width */
+#define PQ_CSC_IN_PARAM_NORM_BIT_WIDTH		9
+/* csc input param normalization coef */
+#define PQ_CSC_IN_PARAM_NORM_COEF		(1 << PQ_CSC_IN_PARAM_NORM_BIT_WIDTH)
+
+/* csc hue table range [0,255] */
+#define PQ_CSC_HUE_TABLE_DIV_COEF		2
+/* csc brightness offset */
+#define PQ_CSC_BRIGHTNESS_OFFSET		256
+
+/* dc coef base bit width */
+#define PQ_CSC_DC_COEF_BASE_BIT_WIDTH		10
+/* input dc coef offset for 10bit data */
+#define PQ_CSC_DC_IN_OFFSET			64
+/* input and output dc coef offset for 10bit data u,v */
+#define PQ_CSC_DC_IN_OUT_DEFAULT		512
+/* r,g,b color temp div coef, range [-128,128] for 10bit data */
+#define PQ_CSC_TEMP_OFFSET_DIV_COEF		2
+
+#define	MAX(a, b)				((a) > (b) ? (a) : (b))
+#define	MIN(a, b)				((a) < (b) ? (a) : (b))
+#define	CLIP(x, min_v, max_v)			MIN(MAX(x, min_v), max_v)
+
+enum rk_pq_csc_mode {
+	RK_PQ_CSC_YUV2RGB_601 = 0,             /* YCbCr_601 LIMIT-> RGB FULL */
+	RK_PQ_CSC_YUV2RGB_709,                 /* YCbCr_709 LIMIT-> RGB FULL */
+	RK_PQ_CSC_RGB2YUV_601,                 /* RGB FULL->YCbCr_601 LIMIT */
+	RK_PQ_CSC_RGB2YUV_709,                 /* RGB FULL->YCbCr_709 LIMIT */
+	RK_PQ_CSC_YUV2YUV_709_601,             /* YCbCr_709 LIMIT->YCbCr_601 LIMIT */
+	RK_PQ_CSC_YUV2YUV_601_709,             /* YCbCr_601 LIMIT->YCbCr_709 LIMIT */
+	RK_PQ_CSC_YUV2YUV,                     /* YCbCr LIMIT->YCbCr LIMIT */
+	RK_PQ_CSC_YUV2RGB_601_FULL,            /* YCbCr_601 FULL-> RGB FULL */
+	RK_PQ_CSC_YUV2RGB_709_FULL,            /* YCbCr_709 FULL-> RGB FULL */
+	RK_PQ_CSC_RGB2YUV_601_FULL,            /* RGB FULL->YCbCr_601 FULL */
+	RK_PQ_CSC_RGB2YUV_709_FULL,            /* RGB FULL->YCbCr_709 FULL */
+	RK_PQ_CSC_YUV2YUV_709_601_FULL,        /* YCbCr_709 FULL->YCbCr_601 FULL */
+	RK_PQ_CSC_YUV2YUV_601_709_FULL,        /* YCbCr_601 FULL->YCbCr_709 FULL */
+	RK_PQ_CSC_YUV2YUV_FULL,                /* YCbCr FULL->YCbCr FULL */
+	RK_PQ_CSC_YUV2YUV_LIMIT2FULL,          /* YCbCr  LIMIT->YCbCr  FULL */
+	RK_PQ_CSC_YUV2YUV_601_709_LIMIT2FULL,  /* YCbCr 601 LIMIT->YCbCr 709 FULL */
+	RK_PQ_CSC_YUV2YUV_709_601_LIMIT2FULL,  /* YCbCr 709 LIMIT->YCbCr 601 FULL */
+	RK_PQ_CSC_YUV2YUV_FULL2LIMIT,          /* YCbCr  FULL->YCbCr  LIMIT */
+	RK_PQ_CSC_YUV2YUV_601_709_FULL2LIMIT,  /* YCbCr 601 FULL->YCbCr 709 LIMIT */
+	RK_PQ_CSC_YUV2YUV_709_601_FULL2LIMIT,  /* YCbCr 709 FULL->YCbCr 601 LIMIT */
+	RK_PQ_CSC_YUV2RGBL_601,                /* YCbCr_601 LIMIT-> RGB LIMIT */
+	RK_PQ_CSC_YUV2RGBL_709,                /* YCbCr_709 LIMIT-> RGB LIMIT */
+	RK_PQ_CSC_RGBL2YUV_601,                /* RGB LIMIT->YCbCr_601 LIMIT */
+	RK_PQ_CSC_RGBL2YUV_709,                /* RGB LIMIT->YCbCr_709 LIMIT */
+	RK_PQ_CSC_YUV2RGBL_601_FULL,           /* YCbCr_601 FULL-> RGB LIMIT */
+	RK_PQ_CSC_YUV2RGBL_709_FULL,           /* YCbCr_709 FULL-> RGB LIMIT */
+	RK_PQ_CSC_RGBL2YUV_601_FULL,           /* RGB LIMIT->YCbCr_601 FULL */
+	RK_PQ_CSC_RGBL2YUV_709_FULL,           /* RGB LIMIT->YCbCr_709 FULL */
+	RK_PQ_CSC_RGB2RGBL,                    /* RGB FULL->RGB LIMIT */
+	RK_PQ_CSC_RGBL2RGB,                    /* RGB LIMIT->RGB FULL */
+	RK_PQ_CSC_RGBL2RGBL,                   /* RGB LIMIT->RGB LIMIT */
+	RK_PQ_CSC_RGB2RGB,                     /* RGB FULL->RGB FULL */
+	RK_PQ_CSC_YUV2RGB_2020,                /* YUV 2020 FULL->RGB  2020 FULL */
+	RK_PQ_CSC_RGB2YUV2020_LIMIT2FULL,      /* BT2020RGBLIMIT -> BT2020YUVFULL */
+	RK_PQ_CSC_RGB2YUV2020_LIMIT,           /* BT2020RGBLIMIT -> BT2020YUVLIMIT */
+	RK_PQ_CSC_RGB2YUV2020_FULL2LIMIT,      /* BT2020RGBFULL -> BT2020YUVLIMIT */
+	RK_PQ_CSC_RGB2YUV2020_FULL,            /* BT2020RGBFULL -> BT2020YUVFULL */
+};
+
+enum color_space_type {
+	OPTM_CS_E_UNKNOWN = 0,
+	OPTM_CS_E_ITU_R_BT_709 = 1,
+	OPTM_CS_E_FCC = 4,
+	OPTM_CS_E_ITU_R_BT_470_2_BG = 5,
+	OPTM_CS_E_SMPTE_170_M = 6,
+	OPTM_CS_E_SMPTE_240_M = 7,
+	OPTM_CS_E_XV_YCC_709 = OPTM_CS_E_ITU_R_BT_709,
+	OPTM_CS_E_XV_YCC_601 = 8,
+	OPTM_CS_E_RGB = 9,
+	OPTM_CS_E_XV_YCC_2020 = 10,
+	OPTM_CS_E_RGB_2020 = 11,
+};
+
+enum vop_csc_format {
+	CSC_BT601L,
+	CSC_BT709L,
+	CSC_BT601F,
+	CSC_BT2020,
+	CSC_BT709L_13BIT,
+	CSC_BT709F_13BIT,
+	CSC_BT2020L_13BIT,
+	CSC_BT2020F_13BIT,
+};
+
+struct rk_pq_csc_coef {
+	s32 csc_coef00;
+	s32 csc_coef01;
+	s32 csc_coef02;
+	s32 csc_coef10;
+	s32 csc_coef11;
+	s32 csc_coef12;
+	s32 csc_coef20;
+	s32 csc_coef21;
+	s32 csc_coef22;
+};
+
+struct rk_pq_csc_ventor {
+	s32 csc_offset0;
+	s32 csc_offset1;
+	s32 csc_offset2;
+};
+
+struct rk_pq_csc_dc_coef {
+	s32 csc_in_dc0;
+	s32 csc_in_dc1;
+	s32 csc_in_dc2;
+	s32 csc_out_dc0;
+	s32 csc_out_dc1;
+	s32 csc_out_dc2;
+};
+
+/* color space param */
+struct rk_csc_colorspace_info {
+	enum color_space_type input_color_space;
+	enum color_space_type output_color_space;
+	bool in_full_range;
+	bool out_full_range;
+};
+
+struct rk_csc_mode_coef {
+	enum rk_pq_csc_mode csc_mode;
+	char c_csc_comment[PQ_CSC_MODE_COEF_COMMENT_LEN];
+	const struct rk_pq_csc_coef *pst_csc_coef;
+	const struct rk_pq_csc_dc_coef *pst_csc_dc_coef;
+	struct rk_csc_colorspace_info st_csc_color_info;
+};
+
+/*
+ *CSC matrix
+ */
+/* xv_ycc BT.601 limit(i.e. SD) -> RGB full */
+static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full = {
+	1196, 0, 1639,
+	1196, -402, -835,
+	1196, 2072, 0
+};
+
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full = {
+	-64, -512, -512,
+	0, 0, 0
+};
+
+/* BT.709 limit(i.e. HD) -> RGB full */
+static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_limit_to_rgb_full = {
+	1196, 0, 1841,
+	1196, -219, -547,
+	1196, 2169, 0
+};
+
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_full = {
+	-64, -512, -512,
+	0, 0, 0
+};
+
+/* RGB full-> YUV601 (i.e. SD) limit */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_to_xv_yccsdy_cb_cr = {
+	262, 515, 100,
+	-151, -297, 448,
+	448, -376, -73
+};
+
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr = {
+	0, 0, 0,
+	64, 512, 512
+};
+
+/* RGB full-> YUV709 (i.e. SD) limit */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_to_hdy_cb_cr = {
+	186, 627, 63,
+	-103, -346, 448,
+	448, -407, -41
+};
+
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_hdy_cb_cr = {
+	0, 0, 0,
+	64, 512, 512
+};
+
+/* BT.709 (i.e. HD) -> to xv_ycc BT.601 (i.e. SD) */
+static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr = {
+	1024, 104, 201,
+	0, 1014, -113,
+	0, -74, 1007
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr = {
+	-64, -512, -512,
+	64, 512, 512
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full = {
+	0, -512, -512,
+	0, 512, 512
+};
+
+/* xv_ycc BT.601 (i.e. SD) -> to BT.709 (i.e. HD) */
+static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr = {
+	1024, -121, -218,
+	0, 1043, 117,
+	0, 77, 1050
+};
+
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr = {
+	-64, -512, -512,
+	64, 512, 512
+};
+
+/* xv_ycc BT.601 full(i.e. SD) -> RGB full */
+static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_rgb_full = {
+	1024, 0, 1436,
+	1024, -352, -731,
+	1024, 1815, 0
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_full = {
+	0, -512, -512,
+	0, 0, 0
+};
+
+/* BT.709 full(i.e. HD) -> RGB full */
+static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_rgb_full = {
+	1024, 0, 1613,
+	1024, -192, -479,
+	1024, 1900, 0
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_rgb_full = {
+	0, -512, -512,
+	0, 0, 0
+};
+
+/* RGB full-> YUV601 full(i.e. SD) */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_to_xv_yccsdy_cb_cr_full = {
+	306, 601, 117,
+	-173, -339, 512,
+	512, -429, -83
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr_full = {
+	0, 0, 0,
+	0, 512, 512
+};
+
+/* RGB full-> YUV709 full (i.e. SD) */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_to_hdy_cb_cr_full = {
+	218, 732, 74,
+	-117, -395, 512,
+	512, -465, -47
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_hdy_cb_cr_full = {
+	0, 0, 0,
+	0, 512, 512
+};
+
+/* limit -> full */
+static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full = {
+	1196, 0, 0,
+	0, 1169, 0,
+	0, 0, 1169
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full = {
+	-64, -512, -512,
+	0, 512, 512
+};
+
+/* 601 limit -> 709 full */
+static const struct rk_pq_csc_coef rk_csc_table_identity_601_limit_to_709_full = {
+	1196, -138, -249,
+	0, 1191, 134,
+	0, 88, 1199
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_601_limit_to_709_full = {
+	-64, -512, -512,
+	0, 512, 512
+};
+
+/* 709 limit -> 601 full */
+static const struct rk_pq_csc_coef rk_csc_table_identity_709_limit_to_601_full = {
+	1196, 119, 229,
+	0, 1157, -129,
+	0, -85, 1150
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_709_limit_to_601_full = {
+	-64, -512, -512,
+	0, 512, 512
+};
+
+/* full ->   limit */
+static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit = {
+	877, 0, 0,
+	0, 897, 0,
+	0, 0, 897
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit = {
+	0, -512, -512,
+	64, 512, 512
+};
+
+/* 601 full ->  709 limit */
+static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit = {
+	877, -106, -191,
+	0, 914, 103,
+	0, 67, 920
+};
+static const struct rk_pq_csc_dc_coef
+rk_dc_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit = {
+	0, -512, -512,
+	64, 512, 512
+};
+
+/* 709 full ->  601 limit */
+static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit = {
+	877, 91, 176,
+	0, 888, -99,
+	0, -65, 882
+};
+static const struct rk_pq_csc_dc_coef
+rk_dc_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit = {
+	0, -512, -512,
+	64, 512, 512
+};
+
+/* xv_ycc BT.601 limit(i.e. SD) -> RGB limit */
+static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit = {
+	1024, 0, 1404,
+	1024, -344, -715,
+	1024, 1774, 0
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit = {
+	-64, -512, -512,
+	64, 64, 64
+};
+
+/* BT.709 limit(i.e. HD) -> RGB limit */
+static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_limit_to_rgb_limit = {
+	1024, 0, 1577,
+	1024, -188, -469,
+	1024, 1858, 0
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_limit = {
+	-64, -512, -512,
+	64, 64, 64
+};
+
+/* RGB limit-> YUV601 (i.e. SD) limit */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr = {
+	306, 601, 117,
+	-177, -347, 524,
+	524, -439, -85
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr = {
+	-64, -64, -64,
+	64, 512, 512
+};
+
+/* RGB limit -> YUV709 (i.e. SD) limit */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_hdy_cb_cr = {
+	218, 732, 74,
+	-120, -404, 524,
+	524, -476, -48
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_hdy_cb_cr = {
+	-64, -64, -64,
+	64, 512, 512
+};
+
+/* xv_ycc BT.601 full(i.e. SD) -> RGB limit */
+static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_rgb_limit = {
+	877, 0, 1229,
+	877, -302, -626,
+	877, 1554, 0
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_limit = {
+	0, -512, -512,
+	64, 64, 64
+};
+
+/* BT.709 full(i.e. HD) -> RGB limit */
+static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_rgb_limit = {
+	877, 0, 1381,
+	877, -164, -410,
+	877, 1627, 0
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_rgb_limit = {
+	0, -512, -512,
+	64, 64, 64
+};
+
+/* RGB limit-> YUV601 full(i.e. SD) */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full = {
+	358, 702, 136,
+	-202, -396, 598,
+	598, -501, -97
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full = {
+	-64, -64, -64,
+	0, 512, 512
+};
+
+/* RGB limit-> YUV709 full (i.e. SD) */
+static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_hdy_cb_cr_full = {
+	254, 855, 86,
+	-137, -461, 598,
+	598, -543, -55
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_hdy_cb_cr_full = {
+	-64, -64, -64,
+	0, 512, 512
+};
+
+/* RGB full -> RGB limit */
+static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_to_rgb_limit = {
+	877, 0, 0,
+	0, 877, 0,
+	0, 0, 877
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb_limit = {
+	0, 0, 0,
+	64, 64, 64
+};
+
+/* RGB limit -> RGB full */
+static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_rgb = {
+	1196, 0, 0,
+	0, 1196, 0,
+	0, 0, 1196
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_rgb = {
+	-64, -64, -64,
+	0, 0, 0
+};
+
+/* RGB limit/full -> RGB limit/full */
+static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_to_rgb = {
+	1024, 0, 0,
+	0, 1024, 0,
+	0, 0, 1024
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb1 = {
+	-64, -64, -64,
+	64, 64, 64
+};
+
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb2 = {
+	0, 0, 0,
+	0, 0, 0
+};
+
+static const struct rk_pq_csc_coef rk_csc_table_identity_yuv_to_rgb_2020 = {
+	1024, 0, 1510,
+	1024, -169, -585,
+	1024, 1927, 0
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_yuv_to_rgb_2020 = {
+	0, -512, -512,
+	0, 0, 0
+};
+
+/* 2020 RGB LIMIT ->YUV LIMIT */
+static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_yuv_limit_2020 = {
+	269, 694, 61,
+	-146, -377, 524,
+	524, -482, -42
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_yuv_limit_2020 = {
+	-64, -64, -64,
+	64, 512, 512
+};
+
+/* 2020 RGB LIMIT ->YUV FULL */
+static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_yuv_full_2020 = {
+	314, 811, 71,
+	-167, -431, 598,
+	598, -550, -48
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_yuv_full_2020 = {
+	-64, -64, -64,
+	0, 512, 512
+};
+
+/* 2020 RGB FULL ->YUV LIMIT */
+static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_full_to_yuv_limit_2020 = {
+	230, 595, 52,
+	-125, -323, 448,
+	448, -412, -36
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_full_to_yuv_limit_2020 = {
+	0, 0, 0,
+	64, 512, 512
+};
+
+/* 2020 RGB FULL ->YUV FULL */
+static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_full_to_yuv_full_2020 = {
+	269, 694, 61,
+	-143, -369, 512,
+	512, -471, -41
+};
+static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_full_to_yuv_full_2020 = {
+	0, 0, 0,
+	0, 512, 512
+};
+
+/* identity matrix */
+static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_to_y_cb_cr = {
+	1024, 0, 0,
+	0, 1024, 0,
+	0, 0, 1024
+};
+
+/* 10bit Hue Sin Look Up Table -> range[-30, 30] */
+static const s32 g_hue_sin_table[PQ_CSC_HUE_TABLE_NUM] = {
+	512, 508, 505, 501, 497, 494, 490, 486,
+	483, 479, 475, 472, 468, 464, 460, 457,
+	453, 449, 445, 442, 438, 434, 430, 426,
+	423, 419, 415, 411, 407, 403, 400, 396,
+	392, 388, 384, 380, 376, 372, 369, 365,
+	361, 357, 353, 349, 345, 341, 337, 333,
+	329, 325, 321, 317, 313, 309, 305, 301,
+	297, 293, 289, 285, 281, 277, 273, 269,
+	265, 261, 257, 253, 249, 245, 241, 237,
+	233, 228, 224, 220, 216, 212, 208, 204,
+	200, 196, 192, 187, 183, 179, 175, 171,
+	167, 163, 159, 154, 150, 146, 142, 138,
+	134, 130, 125, 121, 117, 113, 109, 105,
+	100, 96, 92, 88, 84, 80, 75, 71,
+	67, 63, 59, 54, 50, 46, 42, 38,
+	34, 29, 25, 21, 17, 13, 8, 4,
+	0, -4, -8, -13, -17, -21, -25, -29,
+	-34, -38, -42, -46, -50, -54, -59, -63,
+	-67, -71, -75, -80, -84, -88, -92, -96,
+	-100, -105, -109, -113, -117, -121, -125, -130,
+	-134, -138, -142, -146, -150, -154, -159, -163,
+	-167, -171, -175, -179, -183, -187, -192, -196,
+	-200, -204, -208, -212, -216, -220, -224, -228,
+	-233, -237, -241, -245, -249, -253, -257, -261,
+	-265, -269, -273, -277, -281, -285, -289, -293,
+	-297, -301, -305, -309, -313, -317, -321, -325,
+	-329, -333, -337, -341, -345, -349, -353, -357,
+	-361, -365, -369, -372, -376, -380, -384, -388,
+	-392, -396, -400, -403, -407, -411, -415, -419,
+	-423, -426, -430, -434, -438, -442, -445, -449,
+	-453, -457, -460, -464, -468, -472, -475, -479,
+	-483, -486, -490, -494, -497, -501, -505, -508,
+};
+
+/* 10bit Hue Cos Look Up Table  -> range[-30, 30] */
+static const s32 g_hue_cos_table[PQ_CSC_HUE_TABLE_NUM] = {
+	887, 889, 891, 893, 895, 897, 899, 901,
+	903, 905, 907, 909, 911, 913, 915, 917,
+	919, 920, 922, 924, 926, 928, 929, 931,
+	933, 935, 936, 938, 940, 941, 943, 945,
+	946, 948, 949, 951, 953, 954, 956, 957,
+	959, 960, 962, 963, 964, 966, 967, 969,
+	970, 971, 973, 974, 975, 976, 978, 979,
+	980, 981, 983, 984, 985, 986, 987, 988,
+	989, 990, 992, 993, 994, 995, 996, 997,
+	998, 998, 999, 1000, 1001, 1002, 1003, 1004,
+	1005, 1005, 1006, 1007, 1008, 1008, 1009, 1010,
+	1011, 1011, 1012, 1013, 1013, 1014, 1014, 1015,
+	1015, 1016, 1016, 1017, 1017, 1018, 1018, 1019,
+	1019, 1020, 1020, 1020, 1021, 1021, 1021, 1022,
+	1022, 1022, 1022, 1023, 1023, 1023, 1023, 1023,
+	1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
+	1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
+	1023, 1023, 1023, 1023, 1023, 1022, 1022, 1022,
+	1022, 1021, 1021, 1021, 1020, 1020, 1020, 1019,
+	1019, 1018, 1018, 1017, 1017, 1016, 1016, 1015,
+	1015, 1014, 1014, 1013, 1013, 1012, 1011, 1011,
+	1010, 1009, 1008, 1008, 1007, 1006, 1005, 1005,
+	1004, 1003, 1002, 1001, 1000, 999, 998, 998,
+	997, 996, 995, 994, 993, 992, 990, 989,
+	988, 987, 986, 985, 984, 983, 981, 980,
+	979, 978, 976, 975, 974, 973, 971, 970,
+	969, 967, 966, 964, 963, 962, 960, 959,
+	957, 956, 954, 953, 951, 949, 948, 946,
+	945, 943, 941, 940, 938, 936, 935, 933,
+	931, 929, 928, 926, 924, 922, 920, 919,
+	917, 915, 913, 911, 909, 907, 905, 903,
+	901, 899, 897, 895, 893, 891, 889, 887
+};
+
+/*
+ *CSC Param Struct
+ */
+static const struct rk_csc_mode_coef g_mode_csc_coef[] = {
+	{
+		RK_PQ_CSC_YUV2RGB_601, "YUV601 L->RGB F",
+		&rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2RGB_709, "YUV709 L->RGB F",
+		&rk_csc_table_hdy_cb_cr_limit_to_rgb_full,
+		&rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_full,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV_601, "RGB F->YUV601 L",
+		&rk_csc_table_rgb_to_xv_yccsdy_cb_cr,
+		&rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV_709, "RGB F->YUV709 L",
+		&rk_csc_table_rgb_to_hdy_cb_cr,
+		&rk_dc_csc_table_rgb_to_hdy_cb_cr,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_709_601, "YUV709 L->YUV601 L",
+		&rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr,
+		&rk_dc_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_601_709, "YUV601 L->YUV709 L",
+		&rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV, "YUV L->YUV L",
+		&rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2RGB_601_FULL, "YUV601 F->RGB F",
+		&rk_csc_table_xv_yccsdy_cb_cr_to_rgb_full,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_full,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, true, true
+		}
+	},
+		{
+		RK_PQ_CSC_YUV2RGB_709_FULL, "YUV709 F->RGB F",
+		&rk_csc_table_hdy_cb_cr_to_rgb_full,
+		&rk_dc_csc_table_hdy_cb_cr_to_rgb_full,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV_601_FULL, "RGB F->YUV601 F",
+		&rk_csc_table_rgb_to_xv_yccsdy_cb_cr_full,
+		&rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr_full,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV_709_FULL, "RGB F->YUV709 F",
+		&rk_csc_table_rgb_to_hdy_cb_cr_full,
+		&rk_dc_csc_table_rgb_to_hdy_cb_cr_full,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_709_601_FULL, "YUV709 F->YUV601 F",
+		&rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr,
+		&rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_601_709_FULL, "YUV601 F->YUV709 F",
+		&rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		&rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_FULL, "YUV F->YUV F",
+		&rk_csc_table_identity_y_cb_cr_to_y_cb_cr,
+		&rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV L->YUV F",
+		&rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
+		&rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_601_709_LIMIT2FULL, "YUV601 L->YUV709 F",
+		&rk_csc_table_identity_601_limit_to_709_full,
+		&rk_dc_csc_table_identity_601_limit_to_709_full,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_709_601_LIMIT2FULL, "YUV709 L->YUV601 F",
+		&rk_csc_table_identity_709_limit_to_601_full,
+		&rk_dc_csc_table_identity_709_limit_to_601_full,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV F->YUV L",
+		&rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
+		&rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_601_709_FULL2LIMIT, "YUV601 F->YUV709 L",
+		&rk_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit,
+		&rk_dc_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_709_601_FULL2LIMIT, "YUV709 F->YUV601 L",
+		&rk_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit,
+		&rk_dc_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2RGBL_601, "YUV601 L->RGB L",
+		&rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2RGBL_709, "YUV709 L->RGB L",
+		&rk_csc_table_hdy_cb_cr_limit_to_rgb_limit,
+		&rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_limit,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2YUV_601, "RGB L->YUV601 L",
+		&rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr,
+		&rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2YUV_709, "RGB L->YUV709 L",
+		&rk_csc_table_rgb_limit_to_hdy_cb_cr,
+		&rk_dc_csc_table_rgb_limit_to_hdy_cb_cr,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2RGBL_601_FULL, "YUV601 F->RGB L",
+		&rk_csc_table_xv_yccsdy_cb_cr_to_rgb_limit,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_limit,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2RGBL_709_FULL, "YUV709 F->RGB L",
+		&rk_csc_table_hdy_cb_cr_to_rgb_limit,
+		&rk_dc_csc_table_hdy_cb_cr_to_rgb_limit,
+		{
+			OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2YUV_601_FULL, "RGB L->YUV601 F",
+		&rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full,
+		&rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2YUV_709_FULL, "RGB L->YUV709 F",
+		&rk_csc_table_rgb_limit_to_hdy_cb_cr_full,
+		&rk_dc_csc_table_rgb_limit_to_hdy_cb_cr_full,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2RGBL, "RGB F->RGB L",
+		&rk_csc_table_identity_rgb_to_rgb_limit,
+		&rk_dc_csc_table_identity_rgb_to_rgb_limit,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_RGB, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2RGB, "RGB L->RGB F",
+		&rk_csc_table_identity_rgb_limit_to_rgb,
+		&rk_dc_csc_table_identity_rgb_limit_to_rgb,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_RGB, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2RGBL, "RGB L->RGB L",
+		&rk_csc_table_identity_rgb_to_rgb,
+		&rk_dc_csc_table_identity_rgb_to_rgb1,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_RGB, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2RGB, "RGB F->RGB F",
+		&rk_csc_table_identity_rgb_to_rgb,
+		&rk_dc_csc_table_identity_rgb_to_rgb2,
+		{
+			OPTM_CS_E_RGB, OPTM_CS_E_RGB, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2RGB_2020, "YUV2020 F->RGB2020 F",
+		&rk_csc_table_identity_yuv_to_rgb_2020,
+		&rk_dc_csc_table_identity_yuv_to_rgb_2020,
+		{
+			OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_RGB_2020, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV2020_LIMIT2FULL, "RGB2020 L->YUV2020 F",
+		&rk_csc_table_identity_rgb_limit_to_yuv_full_2020,
+		&rk_dc_csc_table_identity_rgb_limit_to_yuv_full_2020,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV2020_LIMIT, "RGB2020 L->YUV2020 L",
+		&rk_csc_table_identity_rgb_limit_to_yuv_limit_2020,
+		&rk_dc_csc_table_identity_rgb_limit_to_yuv_limit_2020,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV2020_FULL2LIMIT, "RGB2020 F->YUV2020 L",
+		&rk_csc_table_identity_rgb_full_to_yuv_limit_2020,
+		&rk_dc_csc_table_identity_rgb_full_to_yuv_limit_2020,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2YUV2020_FULL, "RGB2020 F->YUV2020 F",
+		&rk_csc_table_identity_rgb_full_to_yuv_full_2020,
+		&rk_dc_csc_table_identity_rgb_full_to_yuv_full_2020,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV, "YUV 601 L->YUV 601 L",
+		&rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_FULL, "YUV 601 F->YUV 601 F",
+		&rk_csc_table_identity_y_cb_cr_to_y_cb_cr,
+		&rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV 601 L->YUV 601 F",
+		&rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
+		&rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601,  false, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV 601 F->YUV 601 L",
+		&rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
+		&rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
+		{
+			OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV, "YUV 2020 L->YUV 2020 L",
+		&rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		&rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr,
+		{
+			OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_FULL, "YUV 2020 F->YUV 2020 F",
+		&rk_csc_table_identity_y_cb_cr_to_y_cb_cr,
+		&rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full,
+		{
+			OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, true, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV 2020 L->YUV 2020 F",
+		&rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
+		&rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full,
+		{
+			OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV 2020 F->YUV 2020 L",
+		&rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
+		&rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit,
+		{
+			OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2RGBL, "RGB 2020 F->RGB 2020 L",
+		&rk_csc_table_identity_rgb_to_rgb_limit,
+		&rk_dc_csc_table_identity_rgb_to_rgb_limit,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, true, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2RGB, "RGB 2020 L->RGB 2020 F",
+		&rk_csc_table_identity_rgb_limit_to_rgb,
+		&rk_dc_csc_table_identity_rgb_limit_to_rgb,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, false, true
+		}
+	},
+	{
+		RK_PQ_CSC_RGBL2RGBL, "RGB 2020 L->RGB 2020 L",
+		&rk_csc_table_identity_rgb_to_rgb,
+		&rk_dc_csc_table_identity_rgb_to_rgb1,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, false, false
+		}
+	},
+	{
+		RK_PQ_CSC_RGB2RGB, "RGB 2020 F->RGB 2020 F",
+		&rk_csc_table_identity_rgb_to_rgb,
+		&rk_dc_csc_table_identity_rgb_to_rgb2,
+		{
+			OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, true, true
+		}
+	},
+};
+
+struct csc_mapping {
+	enum vop_csc_format csc_format;
+	enum color_space_type rgb_color_space;
+	enum color_space_type yuv_color_space;
+	bool rgb_full_range;
+	bool yuv_full_range;
+};
+
+static const struct csc_mapping csc_mapping_table[] = {
+	{
+		CSC_BT601L,
+		OPTM_CS_E_RGB,
+		OPTM_CS_E_XV_YCC_601,
+		true,
+		false,
+	},
+	{
+		CSC_BT709L,
+		OPTM_CS_E_RGB,
+		OPTM_CS_E_XV_YCC_709,
+		true,
+		false,
+	},
+	{
+		CSC_BT601F,
+		OPTM_CS_E_RGB,
+		OPTM_CS_E_XV_YCC_601,
+		true,
+		true,
+	},
+	{
+		CSC_BT2020,
+		OPTM_CS_E_RGB_2020,
+		OPTM_CS_E_XV_YCC_2020,
+		true,
+		true,
+	},
+	{
+		CSC_BT709L_13BIT,
+		OPTM_CS_E_RGB,
+		OPTM_CS_E_XV_YCC_709,
+		true,
+		false,
+	},
+	{
+		CSC_BT709F_13BIT,
+		OPTM_CS_E_RGB,
+		OPTM_CS_E_XV_YCC_709,
+		true,
+		true,
+	},
+	{
+		CSC_BT2020L_13BIT,
+		OPTM_CS_E_RGB_2020,
+		OPTM_CS_E_XV_YCC_2020,
+		true,
+		false,
+	},
+	{
+		CSC_BT2020F_13BIT,
+		OPTM_CS_E_RGB_2020,
+		OPTM_CS_E_XV_YCC_2020,
+		true,
+		true,
+	},
+};
+
+static const struct rk_pq_csc_coef r2y_for_y2y = {
+	306, 601, 117,
+	-151, -296, 446,
+	630, -527, -102,
+};
+
+static const struct rk_pq_csc_coef y2r_for_y2y = {
+	1024, -0, 1167,
+	1024, -404, -594,
+	1024, 2081, -1,
+};
+
+static const struct rk_pq_csc_coef rgb_input_swap_matrix = {
+	0, 0, 1,
+	1, 0, 0,
+	0, 1, 0,
+};
+
+static const struct rk_pq_csc_coef yuv_output_swap_matrix = {
+	0, 0, 1,
+	1, 0, 0,
+	0, 1, 0,
+};
+
+static int csc_get_mode_index(int post_csc_mode, bool is_input_yuv, bool is_output_yuv)
+{
+	const struct rk_csc_colorspace_info *colorspace_info;
+	enum color_space_type input_color_space;
+	enum color_space_type output_color_space;
+	bool is_input_full_range;
+	bool is_output_full_range;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(csc_mapping_table); i++) {
+		if (post_csc_mode == csc_mapping_table[i].csc_format) {
+			input_color_space = is_input_yuv ? csc_mapping_table[i].yuv_color_space :
+					    csc_mapping_table[i].rgb_color_space;
+			is_input_full_range = is_input_yuv ? csc_mapping_table[i].yuv_full_range :
+					      csc_mapping_table[i].rgb_full_range;
+			output_color_space = is_output_yuv ? csc_mapping_table[i].yuv_color_space :
+					     csc_mapping_table[i].rgb_color_space;
+			is_output_full_range = is_output_yuv ? csc_mapping_table[i].yuv_full_range :
+					       csc_mapping_table[i].rgb_full_range;
+			break;
+		}
+	}
+	if (i >= ARRAY_SIZE(csc_mapping_table))
+		return -EINVAL;
+
+	for (i = 0; i < ARRAY_SIZE(g_mode_csc_coef); i++) {
+		colorspace_info = &g_mode_csc_coef[i].st_csc_color_info;
+		if (colorspace_info->input_color_space == input_color_space &&
+		    colorspace_info->output_color_space == output_color_space &&
+		    colorspace_info->in_full_range == is_input_full_range &&
+		    colorspace_info->out_full_range == is_output_full_range)
+			return i;
+	}
+
+	return -EINVAL;
+}
+
+static void csc_matrix_multiply(struct rk_pq_csc_coef *dst, const struct rk_pq_csc_coef *m0,
+				const struct rk_pq_csc_coef *m1)
+{
+	dst->csc_coef00 = m0->csc_coef00 * m1->csc_coef00 +
+			  m0->csc_coef01 * m1->csc_coef10 +
+			  m0->csc_coef02 * m1->csc_coef20;
+
+	dst->csc_coef01 = m0->csc_coef00 * m1->csc_coef01 +
+			  m0->csc_coef01 * m1->csc_coef11 +
+			  m0->csc_coef02 * m1->csc_coef21;
+
+	dst->csc_coef02 = m0->csc_coef00 * m1->csc_coef02 +
+			  m0->csc_coef01 * m1->csc_coef12 +
+			  m0->csc_coef02 * m1->csc_coef22;
+
+	dst->csc_coef10 = m0->csc_coef10 * m1->csc_coef00 +
+			  m0->csc_coef11 * m1->csc_coef10 +
+			  m0->csc_coef12 * m1->csc_coef20;
+
+	dst->csc_coef11 = m0->csc_coef10 * m1->csc_coef01 +
+			  m0->csc_coef11 * m1->csc_coef11 +
+			  m0->csc_coef12 * m1->csc_coef21;
+
+	dst->csc_coef12 = m0->csc_coef10 * m1->csc_coef02 +
+			  m0->csc_coef11 * m1->csc_coef12 +
+			  m0->csc_coef12 * m1->csc_coef22;
+
+	dst->csc_coef20 = m0->csc_coef20 * m1->csc_coef00 +
+			  m0->csc_coef21 * m1->csc_coef10 +
+			  m0->csc_coef22 * m1->csc_coef20;
+
+	dst->csc_coef21 = m0->csc_coef20 * m1->csc_coef01 +
+			  m0->csc_coef21 * m1->csc_coef11 +
+			  m0->csc_coef22 * m1->csc_coef21;
+
+	dst->csc_coef22 = m0->csc_coef20 * m1->csc_coef02 +
+			  m0->csc_coef21 * m1->csc_coef12 +
+			  m0->csc_coef22 * m1->csc_coef22;
+}
+
+static void csc_matrix_ventor_multiply(struct rk_pq_csc_ventor *dst,
+				       const struct rk_pq_csc_coef *m0,
+				       const struct rk_pq_csc_ventor *v0)
+{
+	dst->csc_offset0 = m0->csc_coef00 * v0->csc_offset0 +
+			   m0->csc_coef01 * v0->csc_offset1 +
+			   m0->csc_coef02 * v0->csc_offset2;
+
+	dst->csc_offset1 = m0->csc_coef10 * v0->csc_offset0 +
+			   m0->csc_coef11 * v0->csc_offset1 +
+			   m0->csc_coef12 * v0->csc_offset2;
+
+	dst->csc_offset2 = m0->csc_coef20 * v0->csc_offset0 +
+			   m0->csc_coef21 * v0->csc_offset1 +
+			   m0->csc_coef22 * v0->csc_offset2;
+}
+
+static void csc_matrix_element_left_shift(struct rk_pq_csc_coef *m, int n)
+{
+	m->csc_coef00 = m->csc_coef00 >> n;
+	m->csc_coef01 = m->csc_coef01 >> n;
+	m->csc_coef02 = m->csc_coef02 >> n;
+	m->csc_coef10 = m->csc_coef10 >> n;
+	m->csc_coef11 = m->csc_coef11 >> n;
+	m->csc_coef12 = m->csc_coef12 >> n;
+	m->csc_coef20 = m->csc_coef20 >> n;
+	m->csc_coef21 = m->csc_coef21 >> n;
+	m->csc_coef22 = m->csc_coef22 >> n;
+}
+
+static struct rk_pq_csc_coef create_rgb_gain_matrix(s32 r_gain, s32 g_gain, s32 b_gain)
+{
+	struct rk_pq_csc_coef m;
+
+	m.csc_coef00 = r_gain;
+	m.csc_coef01 = 0;
+	m.csc_coef02 = 0;
+
+	m.csc_coef10 = 0;
+	m.csc_coef11 = g_gain;
+	m.csc_coef12 = 0;
+
+	m.csc_coef20 = 0;
+	m.csc_coef21 = 0;
+	m.csc_coef22 = b_gain;
+
+	return m;
+}
+
+static struct rk_pq_csc_coef create_contrast_matrix(s32 contrast)
+{
+	struct rk_pq_csc_coef m;
+
+	m.csc_coef00 = contrast;
+	m.csc_coef01 = 0;
+	m.csc_coef02 = 0;
+
+	m.csc_coef10 = 0;
+	m.csc_coef11 = contrast;
+	m.csc_coef12 = 0;
+
+	m.csc_coef20 = 0;
+	m.csc_coef21 = 0;
+	m.csc_coef22 = contrast;
+
+	return m;
+}
+
+static struct rk_pq_csc_coef create_hue_matrix(s32 hue)
+{
+	struct rk_pq_csc_coef m;
+	s32 hue_idx;
+	s32 sin_hue;
+	s32 cos_hue;
+
+	hue_idx = CLIP(hue / PQ_CSC_HUE_TABLE_DIV_COEF, 0, PQ_CSC_HUE_TABLE_NUM - 1);
+	sin_hue = g_hue_sin_table[hue_idx];
+	cos_hue = g_hue_cos_table[hue_idx];
+
+	m.csc_coef00 = 1024;
+	m.csc_coef01 = 0;
+	m.csc_coef02 = 0;
+
+	m.csc_coef10 = 0;
+	m.csc_coef11 = cos_hue;
+	m.csc_coef12 = sin_hue;
+
+	m.csc_coef20 = 0;
+	m.csc_coef21 = -sin_hue;
+	m.csc_coef22 = cos_hue;
+
+	return m;
+}
+
+static struct rk_pq_csc_coef create_saturation_matrix(s32 saturation)
+{
+	struct rk_pq_csc_coef m;
+
+	m.csc_coef00 = 512;
+	m.csc_coef01 = 0;
+	m.csc_coef02 = 0;
+
+	m.csc_coef10 = 0;
+	m.csc_coef11 = saturation;
+	m.csc_coef12 = 0;
+
+	m.csc_coef20 = 0;
+	m.csc_coef21 = 0;
+	m.csc_coef22 = saturation;
+
+	return m;
+}
+
+static int csc_calc_adjust_output_coef(bool is_input_yuv, bool is_output_yuv,
+				       struct csc_info *csc_input_cfg,
+				       const struct rk_csc_mode_coef *csc_mode_cfg,
+				       struct rk_pq_csc_coef *out_matrix,
+				       struct rk_pq_csc_ventor *out_dc)
+{
+	struct rk_pq_csc_coef gain_matrix;
+	struct rk_pq_csc_coef contrast_matrix;
+	struct rk_pq_csc_coef hue_matrix;
+	struct rk_pq_csc_coef saturation_matrix;
+	struct rk_pq_csc_coef temp0, temp1;
+	const struct rk_pq_csc_coef *r2y_matrix;
+	const struct rk_pq_csc_coef *y2r_matrix;
+	struct rk_pq_csc_ventor dc_in_ventor;
+	struct rk_pq_csc_ventor dc_out_ventor;
+	struct rk_pq_csc_ventor v;
+	const struct rk_csc_colorspace_info *color_info;
+	s32 contrast, saturation, brightness;
+	s32 r_gain, g_gain, b_gain;
+	s32 r_offset, g_offset, b_offset;
+	s32 dc_in_offset, dc_out_offset;
+
+	contrast = csc_input_cfg->contrast * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF;
+	saturation = csc_input_cfg->saturation  * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF;
+	r_gain = csc_input_cfg->r_gain * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF;
+	g_gain = csc_input_cfg->g_gain * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF;
+	b_gain = csc_input_cfg->b_gain * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF;
+	r_offset = ((s32)csc_input_cfg->r_offset - PQ_CSC_BRIGHTNESS_OFFSET) /
+		   PQ_CSC_TEMP_OFFSET_DIV_COEF;
+	g_offset = ((s32)csc_input_cfg->g_offset - PQ_CSC_BRIGHTNESS_OFFSET) /
+		   PQ_CSC_TEMP_OFFSET_DIV_COEF;
+	b_offset = ((s32)csc_input_cfg->b_offset - PQ_CSC_BRIGHTNESS_OFFSET) /
+		   PQ_CSC_TEMP_OFFSET_DIV_COEF;
+
+	gain_matrix = create_rgb_gain_matrix(r_gain, g_gain, b_gain);
+	contrast_matrix = create_contrast_matrix(contrast);
+	hue_matrix = create_hue_matrix(csc_input_cfg->hue);
+	saturation_matrix = create_saturation_matrix(saturation);
+
+	color_info = &csc_mode_cfg->st_csc_color_info;
+	brightness = (s32)csc_input_cfg->brightness - PQ_CSC_BRIGHTNESS_OFFSET;
+	dc_in_offset = color_info->in_full_range ? 0 : -PQ_CSC_DC_IN_OFFSET;
+	dc_out_offset = color_info->out_full_range ? 0 : PQ_CSC_DC_IN_OFFSET;
+
+	/*
+	 * M0 = hue_matrix * saturation_matrix,
+	 * M1 = gain_matrix * constrast_matrix,
+	 */
+
+	if (is_input_yuv && is_output_yuv) {
+		/*
+		 * yuv2yuv: output = T * M0 * N_r2y * M1 * N_y2r,
+		 * so output = T * hue_matrix * saturation_matrix *
+		 * N_r2y * gain_matrix * contrast_matrix * N_y2r
+		 */
+		r2y_matrix = &r2y_for_y2y;
+		y2r_matrix = &y2r_for_y2y;
+		csc_matrix_multiply(&temp0, csc_mode_cfg->pst_csc_coef, &hue_matrix);
+		/*
+		 * The value bits width is 32 bit, so every time 2 matirx multifly,
+		 * left shift is necessary to avoid overflow. For enhancing the
+		 * calculator precision, PQ_CALC_ENHANCE_BIT bits is reserved and
+		 * left shift before get the final result.
+		 */
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH -
+					      PQ_CALC_ENHANCE_BIT);
+		csc_matrix_multiply(&temp1, &temp0, &saturation_matrix);
+		csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(&temp0, &temp1, r2y_matrix);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH);
+		csc_matrix_multiply(&temp1, &temp0, &gain_matrix);
+		csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(&temp0, &temp1, &contrast_matrix);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(out_matrix, &temp0, y2r_matrix);
+		csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_FIX_BIT_WIDTH +
+					      PQ_CALC_ENHANCE_BIT);
+
+		dc_in_ventor.csc_offset0 = dc_in_offset;
+		dc_in_ventor.csc_offset1 = -PQ_CSC_DC_IN_OUT_DEFAULT;
+		dc_in_ventor.csc_offset2 = -PQ_CSC_DC_IN_OUT_DEFAULT;
+		dc_out_ventor.csc_offset0 = brightness + dc_out_offset;
+		dc_out_ventor.csc_offset1 = PQ_CSC_DC_IN_OUT_DEFAULT;
+		dc_out_ventor.csc_offset2 = PQ_CSC_DC_IN_OUT_DEFAULT;
+	} else if (is_input_yuv && !is_output_yuv) {
+		/*
+		 * yuv2rgb: output = M1 * T * M0,
+		 * so output = gain_matrix * contrast_matrix * T *
+		 * hue_matrix * saturation_matrix
+		 */
+		csc_matrix_multiply(&temp0, csc_mode_cfg->pst_csc_coef, &hue_matrix);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH -
+					      PQ_CALC_ENHANCE_BIT);
+		csc_matrix_multiply(&temp1, &temp0, &saturation_matrix);
+		csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(&temp0, &contrast_matrix, &temp1);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(out_matrix, &gain_matrix, &temp0);
+		csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH +
+					      PQ_CALC_ENHANCE_BIT);
+
+		dc_in_ventor.csc_offset0 = dc_in_offset;
+		dc_in_ventor.csc_offset1 = -PQ_CSC_DC_IN_OUT_DEFAULT;
+		dc_in_ventor.csc_offset2 = -PQ_CSC_DC_IN_OUT_DEFAULT;
+		dc_out_ventor.csc_offset0 = brightness + dc_out_offset + r_offset;
+		dc_out_ventor.csc_offset1 = brightness + dc_out_offset + g_offset;
+		dc_out_ventor.csc_offset2 = brightness + dc_out_offset + b_offset;
+	} else if (!is_input_yuv && is_output_yuv) {
+		/*
+		 * rgb2yuv: output = M0 * T * M1,
+		 * so output = hue_matrix * saturation_matrix * T *
+		 * gain_matrix * contrast_matrix
+		 */
+		csc_matrix_multiply(&temp0, csc_mode_cfg->pst_csc_coef, &gain_matrix);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH -
+					      PQ_CALC_ENHANCE_BIT);
+		csc_matrix_multiply(&temp1, &temp0, &contrast_matrix);
+		csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(&temp0, &saturation_matrix, &temp1);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(out_matrix, &hue_matrix, &temp0);
+		csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_FIX_BIT_WIDTH +
+					      PQ_CALC_ENHANCE_BIT);
+
+		dc_in_ventor.csc_offset0 = dc_in_offset;
+		dc_in_ventor.csc_offset1 = dc_in_offset;
+		dc_in_ventor.csc_offset2 = dc_in_offset;
+		dc_out_ventor.csc_offset0 = brightness + dc_out_offset;
+		dc_out_ventor.csc_offset1 = PQ_CSC_DC_IN_OUT_DEFAULT;
+		dc_out_ventor.csc_offset2 = PQ_CSC_DC_IN_OUT_DEFAULT;
+	} else {
+		/*
+		 * rgb2rgb: output = T * M1 * N_y2r * M0 * N_r2y,
+		 * so output = T * gain_matrix * contrast_matrix *
+		 * N_y2r * hue_matrix * saturation_matrix * N_r2y
+		 */
+		if (!color_info->in_full_range && color_info->out_full_range) {
+			r2y_matrix = &rk_csc_table_rgb_limit_to_hdy_cb_cr;
+			y2r_matrix = &rk_csc_table_hdy_cb_cr_limit_to_rgb_full;
+		} else if (color_info->in_full_range && !color_info->out_full_range) {
+			r2y_matrix = &rk_csc_table_rgb_to_hdy_cb_cr;
+			y2r_matrix = &rk_csc_table_hdy_cb_cr_limit_to_rgb_limit;
+		} else if (color_info->in_full_range && color_info->out_full_range) {
+			r2y_matrix = &rk_csc_table_rgb_to_hdy_cb_cr_full;
+			y2r_matrix = &rk_csc_table_hdy_cb_cr_to_rgb_full;
+		} else {
+			r2y_matrix = &rk_csc_table_rgb_limit_to_hdy_cb_cr;
+			y2r_matrix = &rk_csc_table_hdy_cb_cr_limit_to_rgb_limit;
+		}
+
+		csc_matrix_multiply(&temp0, &contrast_matrix, y2r_matrix);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH -
+					      PQ_CALC_ENHANCE_BIT);
+		csc_matrix_multiply(&temp1, &gain_matrix, &temp0);
+		csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(&temp0, &temp1, &hue_matrix);
+		csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH);
+		csc_matrix_multiply(&temp1, &temp0, &saturation_matrix);
+		csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH);
+		csc_matrix_multiply(out_matrix, &temp1, r2y_matrix);
+		csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_FIX_BIT_WIDTH +
+					      PQ_CALC_ENHANCE_BIT);
+
+		if (color_info->in_full_range && color_info->out_full_range)
+			out_matrix->csc_coef00 += 1;
+
+		dc_in_ventor.csc_offset0 = dc_in_offset;
+		dc_in_ventor.csc_offset1 = dc_in_offset;
+		dc_in_ventor.csc_offset2 = dc_in_offset;
+		dc_out_ventor.csc_offset0 = brightness + dc_out_offset + r_offset;
+		dc_out_ventor.csc_offset1 = brightness + dc_out_offset + g_offset;
+		dc_out_ventor.csc_offset2 = brightness + dc_out_offset + b_offset;
+	}
+
+	csc_matrix_ventor_multiply(&v, out_matrix, &dc_in_ventor);
+	out_dc->csc_offset0 = v.csc_offset0 + dc_out_ventor.csc_offset0 *
+			  PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
+	out_dc->csc_offset1 = v.csc_offset1 + dc_out_ventor.csc_offset1 *
+			  PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
+	out_dc->csc_offset2 = v.csc_offset2 + dc_out_ventor.csc_offset2 *
+			  PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
+
+	return 0;
+}
+
+static int csc_calc_default_output_coef(const struct rk_csc_mode_coef *csc_mode_cfg,
+					struct rk_pq_csc_coef *out_matrix,
+					struct rk_pq_csc_ventor *out_dc)
+{
+	const struct rk_pq_csc_coef *csc_coef;
+	const struct rk_pq_csc_dc_coef *csc_dc_coef;
+	struct rk_pq_csc_ventor dc_in_ventor;
+	struct rk_pq_csc_ventor dc_out_ventor;
+	struct rk_pq_csc_ventor v;
+
+	csc_coef = csc_mode_cfg->pst_csc_coef;
+	csc_dc_coef = csc_mode_cfg->pst_csc_dc_coef;
+
+	out_matrix->csc_coef00 = csc_coef->csc_coef00;
+	out_matrix->csc_coef01 = csc_coef->csc_coef01;
+	out_matrix->csc_coef02 = csc_coef->csc_coef02;
+	out_matrix->csc_coef10 = csc_coef->csc_coef10;
+	out_matrix->csc_coef11 = csc_coef->csc_coef11;
+	out_matrix->csc_coef12 = csc_coef->csc_coef12;
+	out_matrix->csc_coef20 = csc_coef->csc_coef20;
+	out_matrix->csc_coef21 = csc_coef->csc_coef21;
+	out_matrix->csc_coef22 = csc_coef->csc_coef22;
+
+	dc_in_ventor.csc_offset0 = csc_dc_coef->csc_in_dc0;
+	dc_in_ventor.csc_offset1 = csc_dc_coef->csc_in_dc1;
+	dc_in_ventor.csc_offset2 = csc_dc_coef->csc_in_dc2;
+	dc_out_ventor.csc_offset0 = csc_dc_coef->csc_out_dc0;
+	dc_out_ventor.csc_offset1 = csc_dc_coef->csc_out_dc1;
+	dc_out_ventor.csc_offset2 = csc_dc_coef->csc_out_dc2;
+
+	csc_matrix_ventor_multiply(&v, csc_coef, &dc_in_ventor);
+	out_dc->csc_offset0 = v.csc_offset0 + dc_out_ventor.csc_offset0 *
+			      PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
+	out_dc->csc_offset1 = v.csc_offset1 + dc_out_ventor.csc_offset1 *
+			      PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
+	out_dc->csc_offset2 = v.csc_offset2 + dc_out_ventor.csc_offset2 *
+			      PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM;
+
+	return 0;
+}
+
+static inline s32 pq_csc_simple_round(s32 x, s32 n)
+{
+	s32 value = 0;
+
+	if (n == 0)
+		return x;
+
+	value = (abs(x) + (1 << (n - 1))) >> (n);
+	return (((x) >= 0) ? value : -value);
+}
+
+static void rockchip_swap_color_channel(bool is_input_yuv, bool is_output_yuv,
+					struct post_csc_coef *csc_simple_coef,
+					struct rk_pq_csc_coef *out_matrix,
+					struct rk_pq_csc_ventor *out_dc)
+{
+	struct rk_pq_csc_coef tmp_matrix;
+	struct rk_pq_csc_ventor tmp_v;
+
+	if (!is_input_yuv) {
+		memcpy(&tmp_matrix, out_matrix, sizeof(struct rk_pq_csc_coef));
+		csc_matrix_multiply(out_matrix, &tmp_matrix, &rgb_input_swap_matrix);
+	}
+
+	if (is_output_yuv) {
+		memcpy(&tmp_matrix, out_matrix, sizeof(struct rk_pq_csc_coef));
+		memcpy(&tmp_v, out_dc, sizeof(struct rk_pq_csc_ventor));
+		csc_matrix_multiply(out_matrix, &yuv_output_swap_matrix, &tmp_matrix);
+		csc_matrix_ventor_multiply(out_dc, &yuv_output_swap_matrix, &tmp_v);
+	}
+
+	csc_simple_coef->csc_coef00 = out_matrix->csc_coef00;
+	csc_simple_coef->csc_coef01 = out_matrix->csc_coef01;
+	csc_simple_coef->csc_coef02 = out_matrix->csc_coef02;
+	csc_simple_coef->csc_coef10 = out_matrix->csc_coef10;
+	csc_simple_coef->csc_coef11 = out_matrix->csc_coef11;
+	csc_simple_coef->csc_coef12 = out_matrix->csc_coef12;
+	csc_simple_coef->csc_coef20 = out_matrix->csc_coef20;
+	csc_simple_coef->csc_coef21 = out_matrix->csc_coef21;
+	csc_simple_coef->csc_coef22 = out_matrix->csc_coef22;
+	csc_simple_coef->csc_dc0 = out_dc->csc_offset0;
+	csc_simple_coef->csc_dc1 = out_dc->csc_offset1;
+	csc_simple_coef->csc_dc2 = out_dc->csc_offset2;
+}
+
+int rockchip_calc_post_csc(struct csc_info *csc_cfg, struct post_csc_coef *csc_simple_coef,
+			   int csc_mode, bool is_input_yuv, bool is_output_yuv)
+{
+	int ret = 0;
+	struct rk_pq_csc_coef out_matrix;
+	struct rk_pq_csc_ventor out_dc;
+	const struct rk_csc_mode_coef *csc_mode_cfg;
+	int bit_num = PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH;
+
+	ret = csc_get_mode_index(csc_mode, is_input_yuv, is_output_yuv);
+	if (ret < 0) {
+		printf("invalid csc_mode:%d\n", csc_mode);
+		return ret;
+	}
+
+	csc_mode_cfg = &g_mode_csc_coef[ret];
+
+	if (csc_cfg)
+		ret = csc_calc_adjust_output_coef(is_input_yuv, is_output_yuv, csc_cfg,
+						  csc_mode_cfg, &out_matrix, &out_dc);
+	else
+		ret = csc_calc_default_output_coef(csc_mode_cfg, &out_matrix, &out_dc);
+
+	rockchip_swap_color_channel(is_input_yuv, is_output_yuv, csc_simple_coef, &out_matrix,
+				    &out_dc);
+
+	csc_simple_coef->csc_dc0 = pq_csc_simple_round(csc_simple_coef->csc_dc0, bit_num);
+	csc_simple_coef->csc_dc1 = pq_csc_simple_round(csc_simple_coef->csc_dc1, bit_num);
+	csc_simple_coef->csc_dc2 = pq_csc_simple_round(csc_simple_coef->csc_dc2, bit_num);
+	csc_simple_coef->range_type = csc_mode_cfg->st_csc_color_info.out_full_range;
+
+	return ret;
+}
diff --git a/u-boot/drivers/video/drm/rockchip_post_csc.h b/u-boot/drivers/video/drm/rockchip_post_csc.h
new file mode 100755
index 0000000..f11e808
--- /dev/null
+++ b/u-boot/drivers/video/drm/rockchip_post_csc.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (C) Rockchip Electronics Co.Ltd
+ * Author:
+ *      Zhang Yubing <yubing.zhang@rock-chips.com>
+ */
+
+#ifndef _ROCKCHIP_POST_CSC_H
+#define _ROCKCHIP_POST_CSC_H
+
+#include <linux/kernel.h>
+#include <edid.h>
+
+struct post_csc_coef {
+	s32 csc_coef00;
+	s32 csc_coef01;
+	s32 csc_coef02;
+	s32 csc_coef10;
+	s32 csc_coef11;
+	s32 csc_coef12;
+	s32 csc_coef20;
+	s32 csc_coef21;
+	s32 csc_coef22;
+
+	s32 csc_dc0;
+	s32 csc_dc1;
+	s32 csc_dc2;
+
+	u32 range_type;
+};
+
+int rockchip_calc_post_csc(struct csc_info *csc, struct post_csc_coef *csc_coef,
+			   int csc_mode, bool is_input_yuv, bool is_output_yuv);
+
+#endif
diff --git a/u-boot/drivers/video/drm/rockchip_rgb.c b/u-boot/drivers/video/drm/rockchip_rgb.c
index 53fb862..2b3b85c 100644
--- a/u-boot/drivers/video/drm/rockchip_rgb.c
+++ b/u-boot/drivers/video/drm/rockchip_rgb.c
@@ -13,11 +13,14 @@
 #include <dm/read.h>
 #include <dm/pinctrl.h>
 #include <linux/media-bus-format.h>
+#include <asm/gpio.h>
+#include <backlight.h>
 
 #include "rockchip_display.h"
 #include "rockchip_crtc.h"
 #include "rockchip_connector.h"
 #include "rockchip_phy.h"
+#include "rockchip_panel.h"
 
 #define HIWORD_UPDATE(v, h, l)		(((v) << (l)) | (GENMASK(h, l) << 16))
 
@@ -48,6 +51,9 @@
 #define RK3368_GRF_SOC_CON15		0x043c
 #define RK3368_FORCE_JETAG(v)		HIWORD_UPDATE(v,  13,  13)
 
+#define RK3562_GRF_IOC_VO_IO_CON	0x10500
+#define RK3562_RGB_DATA_BYPASS(v)	HIWORD_UPDATE(v, 6, 6)
+
 #define RK3568_GRF_VO_CON1		0X0364
 #define RK3568_RGB_DATA_BYPASS(v)	HIWORD_UPDATE(v, 6, 6)
 
@@ -67,6 +73,64 @@
 	struct rockchip_phy *phy;
 	const struct rockchip_rgb_funcs *funcs;
 };
+
+struct mcu_cmd_header {
+	u8 data_type;
+	u8 delay;
+	u8 payload_length;
+} __packed;
+
+struct mcu_cmd_desc {
+	struct mcu_cmd_header header;
+	const u8 *payload;
+};
+
+struct mcu_cmd_seq {
+	struct mcu_cmd_desc *cmds;
+	unsigned int cmd_cnt;
+};
+
+struct rockchip_mcu_panel_desc {
+	struct mcu_cmd_seq *init_seq;
+	struct mcu_cmd_seq *exit_seq;
+
+	struct {
+		unsigned int width;
+		unsigned int height;
+	} size;
+
+	struct {
+		unsigned int prepare;
+		unsigned int enable;
+		unsigned int disable;
+		unsigned int unprepare;
+		unsigned int reset;
+		unsigned int init;
+	} delay;
+
+	unsigned int bpc;
+	u32 bus_format;
+	u32 bus_flags;
+	bool power_invert;
+};
+
+struct rockchip_mcu_panel {
+	struct rockchip_panel base;
+	struct rockchip_mcu_panel_desc *desc;
+	struct udevice *power_supply;
+	struct udevice *backlight;
+
+	struct gpio_desc enable_gpio;
+	struct gpio_desc reset_gpio;
+
+	bool prepared;
+	bool enabled;
+};
+
+static inline struct rockchip_mcu_panel *to_rockchip_mcu_panel(struct rockchip_panel *panel)
+{
+	return container_of(panel, struct rockchip_mcu_panel, base);
+}
 
 static int rockchip_rgb_connector_prepare(struct rockchip_connector *conn,
 					  struct display_state *state)
@@ -170,9 +234,254 @@
 	.unprepare = rockchip_rgb_connector_unprepare,
 };
 
+static int rockchip_mcu_panel_send_cmds(struct display_state *state,
+					struct mcu_cmd_seq *cmds)
+{
+	int i;
+
+	if (!cmds)
+		return -EINVAL;
+
+	display_send_mcu_cmd(state, MCU_SETBYPASS, 1);
+	for (i = 0; i < cmds->cmd_cnt; i++) {
+		struct mcu_cmd_desc *desc = &cmds->cmds[i];
+		int value = 0;
+
+		value = desc->payload[0];
+		display_send_mcu_cmd(state, desc->header.data_type, value);
+
+		if (desc->header.delay)
+			mdelay(desc->header.delay);
+	}
+	display_send_mcu_cmd(state, MCU_SETBYPASS, 0);
+
+	return 0;
+}
+
+static void rockchip_mcu_panel_prepare(struct rockchip_panel *panel)
+{
+	struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel);
+	int ret;
+
+	if (mcu_panel->prepared)
+		return;
+
+	if (dm_gpio_is_valid(&mcu_panel->enable_gpio))
+		dm_gpio_set_value(&mcu_panel->enable_gpio, 1);
+
+	if (mcu_panel->desc->delay.prepare)
+		mdelay(mcu_panel->desc->delay.prepare);
+
+	if (dm_gpio_is_valid(&mcu_panel->reset_gpio))
+		dm_gpio_set_value(&mcu_panel->reset_gpio, 1);
+
+	if (mcu_panel->desc->delay.reset)
+		mdelay(mcu_panel->desc->delay.reset);
+
+	if (dm_gpio_is_valid(&mcu_panel->reset_gpio))
+		dm_gpio_set_value(&mcu_panel->reset_gpio, 0);
+
+	if (mcu_panel->desc->delay.init)
+		mdelay(mcu_panel->desc->delay.init);
+
+	if (mcu_panel->desc->init_seq) {
+		ret = rockchip_mcu_panel_send_cmds(panel->state, mcu_panel->desc->init_seq);
+		if (ret)
+			printf("failed to send mcu panel init cmds: %d\n", ret);
+	}
+
+	mcu_panel->prepared = true;
+}
+
+static void rockchip_mcu_panel_unprepare(struct rockchip_panel *panel)
+{
+	struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel);
+	int ret;
+
+	if (!mcu_panel->prepared)
+		return;
+
+	if (mcu_panel->desc->exit_seq) {
+		ret = rockchip_mcu_panel_send_cmds(panel->state, mcu_panel->desc->exit_seq);
+		if (ret)
+			printf("failed to send mcu panel exit cmds: %d\n", ret);
+	}
+
+	if (dm_gpio_is_valid(&mcu_panel->reset_gpio))
+		dm_gpio_set_value(&mcu_panel->reset_gpio, 1);
+
+	if (dm_gpio_is_valid(&mcu_panel->enable_gpio))
+		dm_gpio_set_value(&mcu_panel->enable_gpio, 0);
+
+	if (mcu_panel->desc->delay.unprepare)
+		mdelay(mcu_panel->desc->delay.unprepare);
+
+	mcu_panel->prepared = false;
+}
+
+static void rockchip_mcu_panel_enable(struct rockchip_panel *panel)
+{
+	struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel);
+
+	if (mcu_panel->enabled)
+		return;
+
+	if (mcu_panel->desc->delay.enable)
+		mdelay(mcu_panel->desc->delay.enable);
+
+	if (mcu_panel->backlight)
+		backlight_enable(mcu_panel->backlight);
+
+	mcu_panel->enabled = true;
+}
+
+static void rockchip_mcu_panel_disable(struct rockchip_panel *panel)
+{
+	struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel);
+
+	if (!mcu_panel->enabled)
+		return;
+
+	if (mcu_panel->backlight)
+		backlight_disable(mcu_panel->backlight);
+
+	if (mcu_panel->desc->delay.disable)
+		mdelay(mcu_panel->desc->delay.disable);
+
+	mcu_panel->enabled = false;
+}
+
+static const struct rockchip_panel_funcs rockchip_mcu_panel_funcs = {
+	.prepare = rockchip_mcu_panel_prepare,
+	.unprepare = rockchip_mcu_panel_unprepare,
+	.enable = rockchip_mcu_panel_enable,
+	.disable = rockchip_mcu_panel_disable,
+};
+
+static int rockchip_mcu_panel_parse_cmds(const u8 *data, int length,
+					 struct mcu_cmd_seq *pcmds)
+{
+	int len;
+	const u8 *buf;
+	const struct mcu_cmd_header *header;
+	int i, cnt = 0;
+
+	/* scan commands */
+	cnt = 0;
+	buf = data;
+	len = length;
+	while (len > sizeof(*header)) {
+		header = (const struct mcu_cmd_header *)buf;
+		buf += sizeof(*header) + header->payload_length;
+		len -= sizeof(*header) + header->payload_length;
+		cnt++;
+	}
+
+	pcmds->cmds = calloc(cnt, sizeof(struct mcu_cmd_desc));
+	if (!pcmds->cmds)
+		return -ENOMEM;
+
+	pcmds->cmd_cnt = cnt;
+
+	buf = data;
+	len = length;
+	for (i = 0; i < cnt; i++) {
+		struct mcu_cmd_desc *desc = &pcmds->cmds[i];
+
+		header = (const struct mcu_cmd_header *)buf;
+		length -= sizeof(*header);
+		buf += sizeof(*header);
+		desc->header.data_type = header->data_type;
+		desc->header.delay = header->delay;
+		desc->header.payload_length = header->payload_length;
+		desc->payload = buf;
+		buf += header->payload_length;
+		length -= header->payload_length;
+	}
+
+	return 0;
+}
+
+static int rockchip_mcu_panel_init(struct rockchip_mcu_panel *mcu_panel, ofnode mcu_panel_node)
+{
+	const void *data;
+	int len;
+	int ret;
+
+	ret = gpio_request_by_name_nodev(mcu_panel_node, "enable-gpios", 0,
+					 &mcu_panel->enable_gpio, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get mcu panel enable GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+
+	ret = gpio_request_by_name_nodev(mcu_panel_node, "reset-gpios", 0,
+					 &mcu_panel->reset_gpio, GPIOD_IS_OUT);
+	if (ret && ret != -ENOENT) {
+		printf("%s: Cannot get mcu panel reset GPIO: %d\n", __func__, ret);
+		return ret;
+	}
+
+	mcu_panel->desc = malloc(sizeof(struct rockchip_mcu_panel_desc));
+	if (!mcu_panel->desc)
+		return -ENOMEM;
+
+	mcu_panel->desc->power_invert = ofnode_read_bool(mcu_panel_node, "power-invert");
+
+	mcu_panel->desc->delay.prepare = ofnode_read_u32_default(mcu_panel_node, "prepare-delay-ms", 0);
+	mcu_panel->desc->delay.unprepare = ofnode_read_u32_default(mcu_panel_node, "unprepare-delay-ms", 0);
+	mcu_panel->desc->delay.enable = ofnode_read_u32_default(mcu_panel_node, "enable-delay-ms", 0);
+	mcu_panel->desc->delay.disable = ofnode_read_u32_default(mcu_panel_node, "disable-delay-ms", 0);
+	mcu_panel->desc->delay.init = ofnode_read_u32_default(mcu_panel_node, "init-delay-ms", 0);
+	mcu_panel->desc->delay.reset = ofnode_read_u32_default(mcu_panel_node, "reset-delay-ms", 0);
+
+	mcu_panel->desc->bus_format = ofnode_read_u32_default(mcu_panel_node, "bus-format",
+							      MEDIA_BUS_FMT_RBG888_1X24);
+	mcu_panel->desc->bpc = ofnode_read_u32_default(mcu_panel_node, "bpc", 8);
+
+	data = ofnode_get_property(mcu_panel_node, "panel-init-sequence", &len);
+	if (data) {
+		mcu_panel->desc->init_seq = calloc(1, sizeof(*mcu_panel->desc->init_seq));
+		if (!mcu_panel->desc->init_seq)
+			return -ENOMEM;
+
+		ret = rockchip_mcu_panel_parse_cmds(data, len, mcu_panel->desc->init_seq);
+		if (ret) {
+			printf("failed to parse panel init sequence\n");
+			goto free_on_cmds;
+		}
+	}
+
+	data = ofnode_get_property(mcu_panel_node, "panel-exit-sequence", &len);
+	if (data) {
+		mcu_panel->desc->exit_seq = calloc(1, sizeof(*mcu_panel->desc->exit_seq));
+		if (!mcu_panel->desc->exit_seq) {
+			ret = -ENOMEM;
+			goto free_on_cmds;
+		}
+
+		ret = rockchip_mcu_panel_parse_cmds(data, len, mcu_panel->desc->exit_seq);
+		if (ret) {
+			printf("failed to parse panel exit sequence\n");
+			goto free_cmds;
+		}
+	}
+
+	return 0;
+
+free_cmds:
+	free(mcu_panel->desc->exit_seq);
+free_on_cmds:
+	free(mcu_panel->desc->init_seq);
+	return ret;
+}
+
 static int rockchip_rgb_probe(struct udevice *dev)
 {
 	struct rockchip_rgb *rgb = dev_get_priv(dev);
+	ofnode mcu_panel_node;
+	int phandle;
+	int ret;
 
 	rgb->dev = dev;
 	rgb->funcs = (const struct rockchip_rgb_funcs *)dev_get_driver_data(dev);
@@ -181,6 +490,45 @@
 	rgb->id = of_alias_get_id(ofnode_to_np(dev->node), "rgb");
 	if (rgb->id < 0)
 		rgb->id = 0;
+
+	mcu_panel_node = dev_read_subnode(dev, "mcu-panel");
+	if (ofnode_valid(mcu_panel_node) && ofnode_is_available(mcu_panel_node)) {
+		struct rockchip_mcu_panel *mcu_panel;
+
+		mcu_panel = malloc(sizeof(struct rockchip_mcu_panel));
+		if (!mcu_panel) {
+			printf("failed to alloc mcu_panel data\n");
+			return -ENOMEM;
+		}
+
+		ret = rockchip_mcu_panel_init(mcu_panel, mcu_panel_node);
+		if (ret < 0) {
+			printf("failed to init mcu_panel: %d\n", ret);
+			return ret;
+		}
+
+		phandle = ofnode_read_u32_default(mcu_panel_node, "backlight", -1);
+		if (phandle < 0) {
+			printf("failed to find backlight phandle\n");
+			return -EINVAL;
+		}
+
+		ret = uclass_get_device_by_phandle_id(UCLASS_PANEL_BACKLIGHT, phandle,
+						      &mcu_panel->backlight);
+		if (ret && ret != -ENOENT) {
+			printf("%s: failed to get backlight device: %d\n", __func__, ret);
+			return ret;
+		}
+
+		mcu_panel->base.dev = dev;
+		mcu_panel->base.bus_format = mcu_panel->desc->bus_format;
+		mcu_panel->base.bpc = mcu_panel->desc->bpc;
+		mcu_panel->base.funcs = &rockchip_mcu_panel_funcs;
+		mcu_panel->enabled = false;
+		mcu_panel->prepared = false;
+
+		rgb->connector.panel = &mcu_panel->base;
+	}
 
 	rockchip_connector_bind(&rgb->connector, dev, rgb->id, &rockchip_rgb_connector_funcs,
 				NULL, DRM_MODE_CONNECTOR_LVDS);
@@ -260,6 +608,16 @@
 	.prepare = rk3368_rgb_prepare,
 };
 
+static void rk3562_rgb_prepare(struct rockchip_rgb *rgb, int pipe)
+{
+	regmap_write(rgb->grf, RK3562_GRF_IOC_VO_IO_CON,
+		     RK3562_RGB_DATA_BYPASS(rgb->data_sync_bypass));
+}
+
+static const struct rockchip_rgb_funcs rk3562_rgb_funcs = {
+	.prepare = rk3562_rgb_prepare,
+};
+
 static void rk3568_rgb_prepare(struct rockchip_rgb *rgb, int pipe)
 {
 	regmap_write(rgb->grf, RK3568_GRF_VO_CON1, RK3568_RGB_DATA_BYPASS(rgb->data_sync_bypass));
@@ -296,6 +654,10 @@
 		.data = (ulong)&rk3368_rgb_funcs,
 	},
 	{
+		.compatible = "rockchip,rk3562-rgb",
+		.data = (ulong)&rk3562_rgb_funcs,
+	},
+	{
 		.compatible = "rockchip,rk3568-rgb",
 		.data = (ulong)&rk3568_rgb_funcs,
 	},
diff --git a/u-boot/drivers/video/drm/rockchip_spl_display.c b/u-boot/drivers/video/drm/rockchip_spl_display.c
new file mode 100644
index 0000000..c66815a
--- /dev/null
+++ b/u-boot/drivers/video/drm/rockchip_spl_display.c
@@ -0,0 +1,265 @@
+/*
+ * (C) Copyright 2023 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <malloc.h>
+#include <mp_boot.h>
+#include <spl.h>
+#include <part.h>
+#include <drm_modes.h>
+#include <spl_display.h>
+#include <linux/hdmi.h>
+
+#include "rockchip_display.h"
+#include "rockchip_crtc.h"
+#include "rockchip_connector.h"
+#include "rockchip_phy.h"
+
+static struct base2_info base_parameter;
+
+struct display_state *rockchip_spl_display_drv_probe(void)
+{
+	struct display_state *state = malloc(sizeof(struct display_state));
+	if (!state)
+		return NULL;
+
+	memset(state, 0, sizeof(*state));
+
+	rockchip_spl_vop_probe(&state->crtc_state);
+	rockchip_spl_dw_hdmi_probe(&state->conn_state);
+	inno_spl_hdmi_phy_probe(state);
+
+	return state;
+}
+
+static int rockchip_spl_display_init(struct display_state *state)
+{
+	struct crtc_state *crtc_state = &state->crtc_state;
+	struct connector_state *conn_state = &state->conn_state;
+	struct rockchip_connector *conn = conn_state->connector;
+	const struct rockchip_crtc *crtc = crtc_state->crtc;
+	const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs;
+	const struct rockchip_connector_funcs *conn_funcs = conn->funcs;
+	struct drm_display_mode *mode = &state->conn_state.mode;
+	int ret = 0;
+
+	if (!crtc_funcs) {
+		printf("failed to find crtc functions\n");
+		return -ENXIO;
+	}
+
+	if (crtc_funcs->preinit) {
+		ret = crtc_funcs->preinit(state);
+		if (ret)
+			return ret;
+	}
+
+	rockchip_display_make_crc32_table();
+	if (conn_funcs->pre_init) {
+		ret = conn_funcs->pre_init(conn, state);
+		if (ret)
+			return ret;
+	}
+
+	if (conn_funcs->init) {
+		ret = conn_funcs->init(conn, state);
+		if (ret)
+			goto deinit;
+	}
+
+	if (conn->phy)
+		rockchip_phy_init(conn->phy);
+
+	if (conn_funcs->detect) {
+		conn->hpd = conn_funcs->detect(conn, state);
+		if (!conn->hpd)
+			goto deinit;
+	}
+
+	if (conn_funcs->get_timing) {
+		ret = conn_funcs->get_timing(conn, state);
+		if (ret)
+			goto deinit;
+	}
+
+	drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
+	if (crtc_funcs->init) {
+		ret = crtc_funcs->init(state);
+		if (ret)
+			goto deinit;
+	}
+
+	return 0;
+
+deinit:
+	rockchip_connector_deinit(state);
+	return ret;
+}
+
+static int rockchip_spl_display_post_enable(struct display_state *state)
+{
+	struct crtc_state *crtc_state = &state->crtc_state;
+	struct connector_state *conn_state = &state->conn_state;
+	struct rockchip_connector *conn = conn_state->connector;
+	const struct rockchip_crtc *crtc = crtc_state->crtc;
+	const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs;
+	const struct rockchip_connector_funcs *conn_funcs = conn->funcs;
+
+	if (crtc_funcs->enable)
+		crtc_funcs->enable(state);
+	state->crtc_state.crtc->active = true;
+
+	if (conn_funcs->enable)
+		conn_funcs->enable(conn, state);
+
+	return 0;
+}
+
+static void rockchip_spl_display_transmit_info_to_uboot(struct display_state *state)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct spl_display_info *spl_disp_info = (struct spl_display_info *)CONFIG_SPL_VIDEO_BUF;
+
+	/* transmit mode and bus_format to uboot */
+	memcpy(&spl_disp_info->mode, &conn_state->mode, sizeof(conn_state->mode));
+	spl_disp_info->bus_format = state->conn_state.bus_format;
+	spl_disp_info->enabled = 1;
+	flush_dcache_all();
+}
+
+int spl_init_display(struct task_data *data)
+{
+	struct display_state *state = NULL;
+	struct drm_display_mode *mode;
+	int ret = 0;
+
+	state = rockchip_spl_display_drv_probe();
+	if (!state) {
+		printf("rockchip_spl_display_drv_probe failed\n");
+		return -1;
+	}
+
+	ret = rockchip_spl_display_init(state);
+	if (ret) {
+		printf("rockchip_spl_display_init failed ret:%d\n", ret);
+		return  -1;
+	}
+
+	if (!state->conn_state.connector->hpd) {
+		printf("HDMI is unplug and exit\n");
+		return 0;
+	}
+
+	ret = rockchip_spl_display_post_enable(state);
+	if (ret) {
+		printf("rockchip_spl_display_post_enable failed ret:%d\n", ret);
+		return -1;
+	}
+
+	rockchip_spl_display_transmit_info_to_uboot(state);
+
+	mode = &state->conn_state.mode;
+	printf("SPL enable hdmi, detailed mode clock %u kHz, flags[%x]\n"
+	       "    H: %04d %04d %04d %04d\n"
+	       "    V: %04d %04d %04d %04d\n"
+	       "bus_format: %x\n",
+	       mode->clock, mode->flags,
+	       mode->hdisplay, mode->hsync_start,
+	       mode->hsync_end, mode->htotal,
+	       mode->vdisplay, mode->vsync_start,
+	       mode->vsync_end, mode->vtotal,
+	       state->conn_state.bus_format);
+
+	return ret;
+}
+
+struct base2_disp_info *rockchip_get_disp_info(int type, int id)
+{
+	struct base2_disp_info *disp_info;
+	struct base2_disp_header *disp_header;
+	int i = 0, offset = -1;
+	u32 crc_val;
+	u32 base2_length;
+	void *base_parameter_addr = (void *)&base_parameter;
+#ifdef CONFIG_MP_BOOT
+	void *bp_addr = (void *)CONFIG_SPL_VIDEO_BUF;
+	ulong ret;
+
+	/* make sure the baseparameter is ready */
+	ret = mpb_post(6);
+	printf("SPL read baseparameter %s\n", ret < 0 ? "failed" : "success");
+	memcpy(&base_parameter, bp_addr, sizeof(base_parameter));
+#endif
+	for (i = 0; i < 8; i++) {
+		disp_header = &base_parameter.disp_header[i];
+		if (disp_header->connector_type == type &&
+		    disp_header->connector_id == id) {
+			printf("disp info %d, type:%d, id:%d\n", i, type, id);
+			offset = disp_header->offset;
+			break;
+		}
+	}
+
+	if (offset < 0)
+		return NULL;
+	disp_info = base_parameter_addr + offset;
+	if (disp_info->screen_info[0].type != type ||
+	    disp_info->screen_info[0].id != id) {
+		printf("base2_disp_info couldn't be found, screen_info type[%d] or id[%d] mismatched\n",
+		       disp_info->screen_info[0].type,
+		       disp_info->screen_info[0].id);
+		return NULL;
+	}
+
+	if (strncasecmp(disp_info->disp_head_flag, "DISP", 4))
+		return NULL;
+
+	if (base_parameter.major_version == 3 && base_parameter.minor_version == 0) {
+		crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info,
+						      sizeof(struct base2_disp_info) - 4);
+		if (crc_val != disp_info->crc2) {
+			printf("error: connector type[%d], id[%d] disp info crc2 check error\n",
+			       type, id);
+			return NULL;
+		}
+	} else {
+		base2_length = sizeof(struct base2_disp_info) - sizeof(struct csc_info) -
+			       sizeof(struct acm_data) - 10 * 1024 - 4;
+		crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, base2_length - 4);
+		if (crc_val != disp_info->crc) {
+			printf("error: connector type[%d], id[%d] disp info crc check error\n",
+			       type, id);
+			return NULL;
+		}
+	}
+
+	return disp_info;
+}
+
+int spl_load_baseparamter(struct task_data *data)
+{
+	struct spl_load_info *info = &data->info;
+	ulong addr = CONFIG_SPL_VIDEO_BUF;
+	disk_partition_t part;
+
+	debug("== Baseparam: start\n");
+
+	if (part_get_info_by_name(info->dev, "baseparameter", &part) < 0) {
+		printf("No baseparameter partition\n");
+		return -ENOENT;
+	} else {
+		if (info->read(info, part.start, part.size, (void *)addr) != part.size)
+			return -EIO;
+		else
+			flush_dcache_range(addr, addr + part.size * info->bl_len);
+	}
+
+	debug("== Baseparam: load OK\n");
+
+	return 0;
+}
+
diff --git a/u-boot/drivers/video/drm/rockchip_tve.c b/u-boot/drivers/video/drm/rockchip_tve.c
new file mode 100644
index 0000000..9664549
--- /dev/null
+++ b/u-boot/drivers/video/drm/rockchip_tve.c
@@ -0,0 +1,848 @@
+/*
+ * SPDX-License-Identifier:	GPL-2.0+
+ * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd
+ */
+#include <common.h>
+#include <malloc.h>
+#include <fdtdec.h>
+#include <fdt_support.h>
+#include <asm/io.h>
+#include <linux/media-bus-format.h>
+#include <asm/arch-rockchip/clock.h>
+#include <dm/device.h>
+#include <dm/read.h>
+#include <dm/uclass-internal.h>
+#include <linux/fb.h>
+#include <edid.h>
+#include <syscon.h>
+#include <boot_rkimg.h>
+#include <mapmem.h>
+#include <misc.h>
+
+#include "rockchip_display.h"
+#include "rockchip_crtc.h"
+#include "rockchip_connector.h"
+#include "rockchip_phy.h"
+#include "rockchip_tve.h"
+
+#define RK322X_VDAC_STANDARD		0x15
+
+static const struct drm_display_mode tve_modes[] = {
+	/* 0 - 720x576i@50Hz */
+	{ DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753,
+		   816, 864, 576, 580, 586, 625, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+		   .vrefresh = 50, },
+	/* 1 - 720x480i@60Hz */
+	{ DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753,
+		   815, 858, 480, 483, 486, 525, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
+		   DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
+		   .vrefresh = 60, },
+};
+
+struct env_config {
+	u32 offset;
+	u32 value;
+};
+
+static struct env_config ntsc_bt656_config[] = {
+	{ BT656_DECODER_CROP, 0x00000000 },
+	{ BT656_DECODER_SIZE, 0x01e002d0 },
+	{ BT656_DECODER_HTOTAL_HS_END, 0x035a003e },
+	{ BT656_DECODER_VACT_ST_HACT_ST, 0x00160069 },
+	{ BT656_DECODER_VTOTAL_VS_END, 0x020d0003 },
+	{ BT656_DECODER_VS_ST_END_F1, 0x01060109 },
+	{ BT656_DECODER_DBG_REG, 0x024002d0 },
+	{ BT656_DECODER_CTRL, 0x00000009 },
+};
+
+static struct env_config ntsc_tve_config[] = {
+	{ TVE_MODE_CTRL, 0x000af906 },
+	{ TVE_HOR_TIMING1, 0x00c07a81 },
+	{ TVE_HOR_TIMING2, 0x169810fc },
+	{ TVE_HOR_TIMING3, 0x96b40000 },
+	{ TVE_SUB_CAR_FRQ, 0x21f07bd7 },
+	{ TVE_IMAGE_POSITION, 0x001500d6 },
+	{ TVE_ROUTING, 0x10088880 },
+	{ TVE_SYNC_ADJUST, 0x00000000 },
+	{ TVE_STATUS, 0x00000000 },
+	{ TVE_CTRL, 0x00000000 },
+	{ TVE_INTR_STATUS, 0x00000000 },
+	{ TVE_INTR_EN, 0x00000000 },
+	{ TVE_INTR_CLR, 0x00000000 },
+	{ TVE_COLOR_BUSRT_SAT, 0x0052543c },
+	{ TVE_CHROMA_BANDWIDTH, 0x00000002 },
+	{ TVE_BRIGHTNESS_CONTRAST, 0x00008300 },
+	{ TVE_CLAMP, 0x00000000 },
+};
+
+static struct env_config pal_bt656_config[] = {
+	{ BT656_DECODER_CROP, 0x00000000 },
+	{ BT656_DECODER_SIZE, 0x024002d0 },
+	{ BT656_DECODER_HTOTAL_HS_END, 0x0360003f },
+	{ BT656_DECODER_VACT_ST_HACT_ST, 0x0016006f },
+	{ BT656_DECODER_VTOTAL_VS_END, 0x02710003 },
+	{ BT656_DECODER_VS_ST_END_F1, 0x0138013b },
+	{ BT656_DECODER_DBG_REG, 0x024002d0 },
+	{ BT656_DECODER_CTRL, 0x00000009 },
+};
+
+static struct env_config pal_tve_config[] = {
+	{ TVE_MODE_CTRL, 0x010ab906 },
+	{ TVE_HOR_TIMING1, 0x00c28381 },
+	{ TVE_HOR_TIMING2, 0x267d111d },
+	{ TVE_HOR_TIMING3, 0x66c00880 },
+	{ TVE_SUB_CAR_FRQ, 0x2a098acb },
+	{ TVE_IMAGE_POSITION, 0x001500f6 },
+	{ TVE_ROUTING, 0x10008882 },
+	{ TVE_SYNC_ADJUST, 0x00000000 },
+	{ TVE_STATUS, 0x000000b0 },
+	{ TVE_CTRL, 0x00000000 },
+	{ TVE_INTR_STATUS, 0x00000000 },
+	{ TVE_INTR_EN, 0x00000000 },
+	{ TVE_INTR_CLR, 0x00000000 },
+	{ TVE_COLOR_BUSRT_SAT, 0x00356245 },
+	{ TVE_CHROMA_BANDWIDTH, 0x00000022 },
+	{ TVE_BRIGHTNESS_CONTRAST, 0x0000aa00 },
+	{ TVE_CLAMP, 0x00000000 },
+};
+
+#define BT656_ENV_CONFIG_SIZE		(sizeof(ntsc_bt656_config) / sizeof(struct env_config))
+#define TVE_ENV_CONFIG_SIZE		(sizeof(ntsc_tve_config) / sizeof(struct env_config))
+
+#define tve_writel(offset, v)		writel(v, tve->reg_base  + offset)
+#define tve_readl(offset)		readl(tve->reg_base + offset)
+
+#define tve_dac_writel(offset, v)	writel(v, tve->vdac_base + offset)
+#define tve_dac_readl(offset)		readl(tve->vdac_base + offset)
+
+#define tve_grf_writel(offset, v)	writel(v, tve->grf + offset)
+#define tve_grf_readl(offset, v)	readl(tve->grf + offset)
+
+struct rockchip_tve_data {
+	int	input_format;
+	int	soc_type;
+};
+
+struct rockchip_tve {
+	struct	rockchip_connector connector;
+	struct	udevice *dev;
+	void	*reg_base;
+	void	*vdac_base;
+	int	soc_type;
+	int	input_format;
+	int 	tv_format;
+	int	test_mode;
+	int	saturation;
+	int	brightcontrast;
+	int	adjtiming;
+	int	lumafilter0;
+	int	lumafilter1;
+	int	lumafilter2;
+	int	lumafilter3;
+	int	lumafilter4;
+	int	lumafilter5;
+	int	lumafilter6;
+	int	lumafilter7;
+	int	daclevel;
+	int	dac1level;
+	int	preferred_mode;
+	int	upsample_mode;
+	void	*grf;
+};
+
+static void tve_write_block(struct rockchip_tve *tve, struct env_config *config, int len)
+{
+	int i;
+
+	for (i = 0; i < len; i++)
+		tve_writel(config[i].offset, config[i].value);
+}
+
+static void tve_set_mode(struct rockchip_tve *tve)
+{
+	struct env_config *bt656_cfg, *tve_cfg;
+	int mode = tve->tv_format;
+
+	if (tve->soc_type == SOC_RK3528) {
+		tve_writel(TVE_LUMA_FILTER1, tve->lumafilter0);
+		tve_writel(TVE_LUMA_FILTER2, tve->lumafilter1);
+		tve_writel(TVE_LUMA_FILTER3, tve->lumafilter2);
+		tve_writel(TVE_LUMA_FILTER4, tve->lumafilter3);
+		tve_writel(TVE_LUMA_FILTER5, tve->lumafilter4);
+		tve_writel(TVE_LUMA_FILTER6, tve->lumafilter5);
+		tve_writel(TVE_LUMA_FILTER7, tve->lumafilter6);
+		tve_writel(TVE_LUMA_FILTER8, tve->lumafilter7);
+	} else {
+		if (tve->input_format == INPUT_FORMAT_RGB)
+			tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) |
+				v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) |
+				v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(0));
+		else
+			tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) |
+				v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) |
+				v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(3));
+
+		tve_writel(TV_LUMA_FILTER0, tve->lumafilter0);
+		tve_writel(TV_LUMA_FILTER1, tve->lumafilter1);
+		tve_writel(TV_LUMA_FILTER2, tve->lumafilter2);
+	}
+
+	if (mode == TVOUT_CVBS_NTSC) {
+		TVEDBG("tve set ntsc mode\n");
+
+		if (tve->soc_type == SOC_RK3528) {
+			bt656_cfg = ntsc_bt656_config;
+			tve_cfg = ntsc_tve_config;
+
+			tve_write_block(tve, bt656_cfg, BT656_ENV_CONFIG_SIZE);
+			tve_write_block(tve, tve_cfg, TVE_ENV_CONFIG_SIZE);
+		} else {
+			tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(1) |
+				   v_Y_AGC_PULSE_ON(0) | v_Y_VIDEO_ON(1) |
+				   v_YPP_MODE(1) | v_Y_SYNC_ON(1) | v_PIC_MODE(mode));
+			tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_NTSC) |
+				   v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3));
+			tve_writel(TV_SATURATION, 0x0042543C);
+			if (tve->test_mode)
+				tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00008300);
+			else
+				tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00007900);
+
+			tve_writel(TV_FREQ_SC,	0x21F07BD7);
+			tve_writel(TV_SYNC_TIMING, 0x00C07a81);
+			tve_writel(TV_ADJ_TIMING, 0x96B40000 | 0x70);
+			tve_writel(TV_ACT_ST,	0x001500D6);
+			tve_writel(TV_ACT_TIMING, 0x069800FC | (1 << 12) | (1 << 28));
+		}
+	} else if (mode == TVOUT_CVBS_PAL) {
+		TVEDBG("tve set pal mode\n");
+
+		if (tve->soc_type == SOC_RK3528) {
+			bt656_cfg = pal_bt656_config;
+			tve_cfg = pal_tve_config;
+
+			tve_write_block(tve, bt656_cfg, BT656_ENV_CONFIG_SIZE);
+			tve_write_block(tve, tve_cfg, TVE_ENV_CONFIG_SIZE);
+		} else {
+			tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(0) |
+				   v_Y_AGC_PULSE_ON(0) | v_Y_VIDEO_ON(1) |
+				   v_YPP_MODE(1) | v_Y_SYNC_ON(1) | v_PIC_MODE(mode));
+			tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_PAL) |
+				   v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3));
+
+			tve_writel(TV_SATURATION, tve->saturation);
+			tve_writel(TV_BRIGHTNESS_CONTRAST, tve->brightcontrast);
+
+			tve_writel(TV_FREQ_SC,	0x2A098ACB);
+			tve_writel(TV_SYNC_TIMING, 0x00C28381);
+			tve_writel(TV_ADJ_TIMING, (0xc << 28) | 0x06c00800 | 0x80);
+			tve_writel(TV_ACT_ST,	0x001500F6);
+			tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28));
+
+			tve_writel(TV_ADJ_TIMING, tve->adjtiming);
+			tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28));
+		}
+	}
+
+	if (tve->soc_type == SOC_RK3528) {
+		u32 upsample_mode = 0;
+		u32 mask = 0;
+		u32 val = 0;
+		bool upsample_en;
+
+		upsample_en = tve->upsample_mode ? 1 : 0;
+		if (upsample_en)
+			upsample_mode = tve->upsample_mode - 1;
+		mask = m_TVE_DCLK_POL | m_TVE_DCLK_EN | m_DCLK_UPSAMPLE_2X4X |
+		       m_DCLK_UPSAMPLE_EN | m_TVE_MODE | m_TVE_EN;
+		val = v_TVE_DCLK_POL(0) | v_TVE_DCLK_EN(1) | v_DCLK_UPSAMPLE_2X4X(upsample_mode) |
+		      v_DCLK_UPSAMPLE_EN(upsample_en) | v_TVE_MODE(tve->tv_format) | v_TVE_EN(1);
+
+		tve_grf_writel(RK3528_VO_GRF_CVBS_CON, (mask << 16) | val);
+	}
+}
+
+static void dac_init(struct rockchip_tve *tve)
+{
+	tve_dac_writel(VDAC_VDAC1, v_CUR_REG(tve->dac1level) |
+				   m_DR_PWR_DOWN | m_BG_PWR_DOWN);
+	tve_dac_writel(VDAC_VDAC2, v_CUR_CTR(tve->daclevel));
+	tve_dac_writel(VDAC_VDAC3, v_CAB_EN(0));
+}
+
+static void dac_enable(struct rockchip_tve *tve, bool enable)
+{
+	u32 mask = 0;
+	u32 val = 0;
+	u32 grfreg = 0;
+	u32 offset = 0;
+
+	if (enable) {
+		TVEDBG("tve enable\n");
+
+		if (tve->soc_type == SOC_RK3036) {
+			mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN;
+			val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve->daclevel);
+			grfreg = RK3036_GRF_SOC_CON3;
+		} else if (tve->soc_type == SOC_RK312X) {
+			mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN;
+			val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve->daclevel);
+			grfreg = RK312X_GRF_TVE_CON;
+		} else if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) {
+			val = v_CUR_REG(tve->dac1level) | v_DR_PWR_DOWN(0) | v_BG_PWR_DOWN(0);
+		} else if (tve->soc_type == SOC_RK3528) {
+			/*
+			 * Reset the vdac
+			 */
+			tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(0) | v_DIGITAL_RST(0));
+			mdelay(20);
+			tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(1) | v_DIGITAL_RST(1));
+
+			tve_dac_writel(VDAC_CURRENT_CTRL, v_OUT_CURRENT(0xd2));
+
+			val = v_REF_VOLTAGE(7) | v_DAC_PWN(1) | v_BIAS_PWN(1);
+			offset = VDAC_PWM_REF_CTRL;
+		}
+	} else {
+		TVEDBG("tve disable\n");
+
+		if (tve->soc_type == SOC_RK312X) {
+			mask = m_VBG_EN | m_DAC_EN;
+			grfreg = RK312X_GRF_TVE_CON;
+		} else if (tve->soc_type == SOC_RK3036) {
+			mask = m_VBG_EN | m_DAC_EN;
+			grfreg = RK3036_GRF_SOC_CON3;
+		} else if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) {
+			val = v_CUR_REG(tve->dac1level) | m_DR_PWR_DOWN | m_BG_PWR_DOWN;
+			offset = VDAC_VDAC1;
+		} else if (tve->soc_type == SOC_RK3528) {
+			val = v_DAC_PWN(0) | v_BIAS_PWN(0);
+			offset = VDAC_PWM_REF_CTRL;
+		}
+	}
+
+	if (grfreg)
+		tve_grf_writel(grfreg, (mask << 16) | val);
+	else if (tve->vdac_base)
+		tve_dac_writel(offset, val);
+}
+
+static u8 rk_get_vdac_value(void)
+{
+	u8 value = 0;
+#ifdef CONFIG_ROCKCHIP_EFUSE
+#if defined(CONFIG_ROCKCHIP_RK322X)
+	struct udevice *dev;
+	u32 regs[2] = {0};
+	u8 fuses[1];
+	ofnode node;
+	int ret;
+
+	ret = uclass_get_device_by_driver(UCLASS_MISC, DM_GET_DRIVER(rockchip_efuse), &dev);
+	if (ret) {
+		printf("%s: no misc-device found\n", __func__);
+		return -EINVAL;
+	}
+
+	node = dev_read_subnode(dev, "tve_dac");
+	if (!ofnode_valid(node))
+		return -EINVAL;
+
+	ret = ofnode_read_u32_array(node, "reg", regs, 2);
+	if (ret) {
+		printf("Cannot get efuse reg\n");
+		return -EINVAL;
+	}
+
+	ret = misc_read(dev, regs[0], &fuses, regs[1]);
+	if (ret) {
+		printf("%s: misc_read failed\n", __func__);
+		return 0;
+	}
+
+	value = fuses[0];
+	value = (value >> 3) & 0x1f;
+#endif
+#endif /* CONFIG_RK_EFUSE */
+	if (value > 0)
+		value += 5;
+	TVEDBG("%s value = 0x%x\n", __func__, value);
+
+	return value;
+}
+
+static int tve_parse_dt(struct rockchip_tve *tve)
+{
+	tve->preferred_mode = dev_read_u32_default(tve->dev, "rockchip,tvemode", -1);
+	if (tve->preferred_mode < 0) {
+		tve->preferred_mode = 0;
+	} else if (tve->preferred_mode > 1) {
+		printf("tve mode value invalid\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter0 = dev_read_u32_default(tve->dev, "rockchip,lumafilter0", 0);
+	if (tve->lumafilter0 == 0) {
+		printf("tve get lumafilter0 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter1 = dev_read_u32_default(tve->dev, "rockchip,lumafilter1", 0);
+	if (tve->lumafilter1 == 0) {
+		printf("tve get lumafilter1 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter2 = dev_read_u32_default(tve->dev, "rockchip,lumafilter2", 0);
+	if (tve->lumafilter2 == 0) {
+		printf("tve get lumafilter2 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter3 = dev_read_u32_default(tve->dev, "rockchip,lumafilter3", 0);
+	if (tve->lumafilter3 == 0) {
+		printf("tve get lumafilter3 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter4 = dev_read_u32_default(tve->dev, "rockchip,lumafilter4", 0);
+	if (tve->lumafilter4 == 0) {
+		printf("tve get lumafilter4 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter5 = dev_read_u32_default(tve->dev, "rockchip,lumafilter5", 0);
+	if (tve->lumafilter5 == 0) {
+		printf("tve get lumafilter5 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter6 = dev_read_u32_default(tve->dev, "rockchip,lumafilter6", 0);
+	if (tve->lumafilter6 == 0) {
+		printf("tve get lumafilter6 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter7 = dev_read_u32_default(tve->dev, "rockchip,lumafilter7", 0);
+	if (tve->lumafilter7 == 0) {
+		printf("tve get lumafilter7 err\n");
+		return -EINVAL;
+	}
+
+	tve->upsample_mode = dev_read_u32_default(tve->dev, "rockchip,tve-upsample", -1);
+	if (tve->upsample_mode < 0 || tve->upsample_mode > DCLK_UPSAMPLEx4) {
+		printf("tve get upsample_mode err\n");
+		return -EINVAL;
+	}
+
+	TVEDBG("tve->preferred_mode = 0x%x\n", tve->preferred_mode);
+	TVEDBG("tve->lumafilter0 = 0x%x\n", tve->lumafilter0);
+	TVEDBG("tve->lumafilter1 = 0x%x\n", tve->lumafilter1);
+	TVEDBG("tve->lumafilter2 = 0x%x\n", tve->lumafilter2);
+	TVEDBG("tve->lumafilter3 = 0x%x\n", tve->lumafilter3);
+	TVEDBG("tve->lumafilter4 = 0x%x\n", tve->lumafilter4);
+	TVEDBG("tve->lumafilter5 = 0x%x\n", tve->lumafilter5);
+	TVEDBG("tve->lumafilter6 = 0x%x\n", tve->lumafilter6);
+	TVEDBG("tve->lumafilter7 = 0x%x\n", tve->lumafilter7);
+	TVEDBG("tve->upsample_mode = 0x%x\n", tve->upsample_mode);
+
+	return 0;
+}
+
+static int tve_parse_dt_legacy(struct rockchip_tve *tve)
+{
+	int dac_value, getvdac;
+
+	if (tve->soc_type == SOC_RK312X)
+		tve->test_mode = dev_read_u32_default(tve->dev, "test_mode", 0);
+
+	tve->preferred_mode = dev_read_u32_default(tve->dev, "rockchip,tvemode", -1);
+	if (tve->preferred_mode < 0) {
+		tve->preferred_mode = 0;
+	} else if (tve->preferred_mode > 1) {
+		printf("tve mode value invalid\n");
+		return -EINVAL;
+	}
+
+	tve->saturation = dev_read_u32_default(tve->dev, "rockchip,saturation", 0);
+	if (tve->saturation == 0) {
+		printf("tve get saturation err\n");
+		return -EINVAL;
+	}
+
+	tve->brightcontrast = dev_read_u32_default(tve->dev, "rockchip,brightcontrast", 0);
+	if (tve->brightcontrast == 0) {
+		printf("tve get brightcontrast err\n");
+		return -EINVAL;
+	}
+
+	tve->adjtiming = dev_read_u32_default(tve->dev, "rockchip,adjtiming", 0);
+	if (tve->adjtiming == 0) {
+		printf("tve get adjtiming err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter0 = dev_read_u32_default(tve->dev, "rockchip,lumafilter0", 0);
+	if (tve->lumafilter0 == 0) {
+		printf("tve get lumafilter0 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter1 = dev_read_u32_default(tve->dev, "rockchip,lumafilter1", 0);
+	if (tve->lumafilter1 == 0) {
+		printf("tve get lumafilter1 err\n");
+		return -EINVAL;
+	}
+
+	tve->lumafilter2 = dev_read_u32_default(tve->dev, "rockchip,lumafilter2", 0);
+	if (tve->lumafilter2 == 0) {
+		printf("tve get lumafilter2 err\n");
+		return -EINVAL;
+	}
+
+	dac_value = dev_read_u32_default(tve->dev, "rockchip,daclevel", 0);
+	if (dac_value == 0) {
+		printf("tve get dac_value err\n");
+		return -EINVAL;
+	}
+
+	tve->daclevel = dac_value;
+	if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) {
+		getvdac = rk_get_vdac_value();
+		if (getvdac > 0) {
+			tve->daclevel = dac_value + getvdac - RK322X_VDAC_STANDARD;
+			if (tve->daclevel > 0x3f || tve->daclevel < 0) {
+				printf("rk322x daclevel error!\n");
+				tve->daclevel = dac_value;
+			}
+		} else if (getvdac < 0) {
+			printf("get rk322x daclevel error\n");
+			return -EINVAL;
+		}
+	}
+
+	if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) {
+		tve->dac1level = dev_read_u32_default(tve->dev, "rockchip,dac1level", 0);
+		if (tve->dac1level == 0) {
+			printf("rk322x dac1level error!\n");
+			return -EINVAL;
+		}
+	}
+
+	TVEDBG("tve->test_mode = 0x%x\n", tve->test_mode);
+	TVEDBG("tve->saturation = 0x%x\n", tve->saturation);
+	TVEDBG("tve->brightcontrast = 0x%x\n", tve->brightcontrast);
+	TVEDBG("tve->adjtiming = 0x%x\n", tve->adjtiming);
+	TVEDBG("tve->lumafilter0 = 0x%x\n", tve->lumafilter0);
+	TVEDBG("tve->lumafilter1 = 0x%x\n", tve->lumafilter1);
+	TVEDBG("tve->lumafilter2 = 0x%x\n", tve->lumafilter2);
+	TVEDBG("tve->daclevel = 0x%x\n", tve->daclevel);
+
+	return 0;
+}
+
+static int rockchip_drm_tve_init(struct rockchip_connector *conn, struct display_state *state)
+{
+	struct rockchip_tve *tve = dev_get_priv(conn->dev);
+	struct connector_state *conn_state = &state->conn_state;
+	fdt_addr_t addr;
+	int ret;
+
+	conn_state->output_mode = ROCKCHIP_OUT_MODE_P888;
+	conn_state->bus_format = MEDIA_BUS_FMT_YUV8_1X24;
+	if (tve->soc_type == SOC_RK3528)
+		conn_state->output_if |= VOP_OUTPUT_IF_BT656;
+	conn_state->color_space = V4L2_COLORSPACE_SMPTE170M;
+
+	conn_state->disp_info = rockchip_get_disp_info(conn_state->type, 0);
+
+	if (tve->soc_type == SOC_RK3528)
+		ret = tve_parse_dt(tve);
+	else
+		ret = tve_parse_dt_legacy(tve);
+	if (ret) {
+		printf("tve parse dts error\n");
+		return -EINVAL;
+	}
+
+	addr = dev_read_addr_index(conn->dev, 0);
+	if (addr == FDT_ADDR_T_NONE) {
+		printf("failed to get tve reg_base\n");
+		return -EINVAL;
+	}
+	tve->reg_base = (void *)addr;
+
+	if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328 ||
+	    tve->soc_type == SOC_RK3528) {
+		addr = dev_read_addr_index(conn->dev, 1);
+		if (addr == FDT_ADDR_T_NONE) {
+			printf("failed to get tve vdac_base\n");
+			return -EINVAL;
+		}
+		tve->vdac_base = (void *)addr;
+	}
+
+	tve->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+	if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328)
+		dac_init(tve);
+
+	return 0;
+}
+
+static int rockchip_drm_tve_enable(struct rockchip_connector *conn, struct display_state *state)
+{
+	struct rockchip_tve *tve = dev_get_priv(conn->dev);
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+
+#ifdef CONFIG_ROCKCHIP_INNO_HDMI_PHY
+	/* set inno hdmi phy clk. */
+	if (tve->soc_type != SOC_RK3528)
+		rockchip_phy_set_pll(conn->phy, 27000000);
+#endif
+	if (mode->vdisplay == 576)
+		tve->tv_format = TVOUT_CVBS_PAL;
+	else
+		tve->tv_format = TVOUT_CVBS_NTSC;
+
+	tve_set_mode(tve);
+	mdelay(1000);
+	dac_enable(tve, true);
+
+	return 0;
+}
+
+static void rockchip_drm_tve_deinit(struct rockchip_connector *conn, struct display_state *state)
+{
+	struct rockchip_tve *tve = dev_get_priv(conn->dev);
+
+	dac_enable(tve, false);
+}
+
+static int rockchip_drm_tve_prepare(struct rockchip_connector *conn, struct display_state *state)
+{
+	return 0;
+}
+
+static int rockchip_drm_tve_disable(struct rockchip_connector *conn, struct display_state *state)
+{
+	struct rockchip_tve *tve = dev_get_priv(conn->dev);
+
+	dac_enable(tve, false);
+
+	return 0;
+}
+
+static int rockchip_drm_tve_detect(struct rockchip_connector *conn, struct display_state *state)
+{
+	return 1;
+}
+
+static void tve_select_output(struct rockchip_tve *tve, struct connector_state *conn_state,
+			      struct drm_display_mode *mode)
+{
+	int ret, i, screen_size;
+	struct base_screen_info *screen_info = NULL;
+	struct base2_screen_info *screen_info2 = NULL;
+	struct base_disp_info base_parameter;
+	struct base2_disp_info *base2_parameter = conn_state->disp_info;
+	struct drm_display_mode modes[2];
+	const struct base_overscan *scan;
+	struct overscan *overscan = &conn_state->overscan;
+	char baseparameter_buf[8 * RK_BLK_SIZE] __aligned(ARCH_DMA_MINALIGN);
+	struct blk_desc *dev_desc;
+	disk_partition_t part_info;
+	int max_scan = 100;
+	int min_scan = 50;
+	int offset = 0;
+	bool found = false;
+
+	for (i = 0; i < 2; i++) {
+		modes[i] = tve_modes[i];
+		if (i == tve->preferred_mode)
+			modes[i].type |= DRM_MODE_TYPE_PREFERRED;
+	}
+	*mode = modes[tve->preferred_mode];
+
+	if (!base2_parameter) {
+		dev_desc = rockchip_get_bootdev();
+		if (!dev_desc) {
+			printf("%s: Could not find device\n", __func__);
+			goto null_basep;
+		}
+
+		ret = part_get_info_by_name(dev_desc, "baseparameter",
+					    &part_info);
+		if (ret < 0) {
+			printf("Could not find baseparameter partition\n");
+			goto null_basep;
+		}
+
+read_aux:
+		ret = blk_dread(dev_desc, part_info.start + offset, 1,
+				(void *)baseparameter_buf);
+		if (ret < 0) {
+			printf("read baseparameter failed\n");
+			goto null_basep;
+		}
+
+		memcpy(&base_parameter, baseparameter_buf,
+		       sizeof(base_parameter));
+		scan = &base_parameter.scan;
+
+		screen_size = sizeof(base_parameter.screen_list) /
+			sizeof(base_parameter.screen_list[0]);
+
+		for (i = 0; i < screen_size; i++) {
+			if (base_parameter.screen_list[i].type ==
+			    DRM_MODE_CONNECTOR_TV) {
+				found = true;
+				screen_info = &base_parameter.screen_list[i];
+				break;
+			}
+		}
+
+		if (!found && !offset) {
+			printf("cvbs info isn't saved in main block\n");
+			offset += 16;
+			goto read_aux;
+		}
+	} else {
+		scan = &base2_parameter->overscan_info;
+		screen_size = sizeof(base2_parameter->screen_info) /
+			sizeof(base2_parameter->screen_info[0]);
+
+		for (i = 0; i < screen_size; i++) {
+			if (base2_parameter->screen_info[i].type ==
+			    DRM_MODE_CONNECTOR_TV) {
+				screen_info2 =
+					&base2_parameter->screen_info[i];
+				break;
+			}
+		}
+		screen_info = malloc(sizeof(*screen_info));
+
+		screen_info->type = screen_info2->type;
+		screen_info->mode = screen_info2->resolution;
+		screen_info->format = screen_info2->format;
+		screen_info->depth = screen_info2->depthc;
+		screen_info->feature = screen_info2->feature;
+	}
+
+	if (scan->leftscale < min_scan && scan->leftscale > 0)
+		overscan->left_margin = min_scan;
+	else if (scan->leftscale < max_scan && scan->leftscale > 0)
+		overscan->left_margin = scan->leftscale;
+
+	if (scan->rightscale < min_scan && scan->rightscale > 0)
+		overscan->right_margin = min_scan;
+	else if (scan->rightscale < max_scan && scan->rightscale > 0)
+		overscan->right_margin = scan->rightscale;
+
+	if (scan->topscale < min_scan && scan->topscale > 0)
+		overscan->top_margin = min_scan;
+	else if (scan->topscale < max_scan && scan->topscale > 0)
+		overscan->top_margin = scan->topscale;
+
+	if (scan->bottomscale < min_scan && scan->bottomscale > 0)
+		overscan->bottom_margin = min_scan;
+	else if (scan->bottomscale < max_scan && scan->bottomscale > 0)
+		overscan->bottom_margin = scan->bottomscale;
+
+null_basep:
+
+	if (screen_info)
+		printf("cvbs base_parameter.mode:%dx%d\n",
+		       screen_info->mode.hdisplay,
+		       screen_info->mode.vdisplay);
+
+	if (screen_info &&
+	    (screen_info->mode.hdisplay == 720 &&
+	     screen_info->mode.vdisplay == 576))
+		*mode = modes[0];
+	else if (screen_info &&
+		 (screen_info->mode.hdisplay == 720 &&
+		  screen_info->mode.vdisplay == 480))
+		*mode = modes[1];
+}
+
+static int rockchip_drm_tve_get_timing(struct rockchip_connector *conn, struct display_state *state)
+{
+	struct rockchip_tve *tve = dev_get_priv(conn->dev);
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+
+	tve_select_output(tve, conn_state, mode);
+
+	return 0;
+}
+
+const struct rockchip_connector_funcs rockchip_drm_tve_funcs = {
+	.init = rockchip_drm_tve_init,
+	.deinit = rockchip_drm_tve_deinit,
+	.prepare = rockchip_drm_tve_prepare,
+	.enable = rockchip_drm_tve_enable,
+	.disable = rockchip_drm_tve_disable,
+	.get_timing = rockchip_drm_tve_get_timing,
+	.detect = rockchip_drm_tve_detect,
+};
+
+static int rockchip_drm_tve_probe(struct udevice *dev)
+{
+	struct rockchip_tve *tve = dev_get_priv(dev);
+	const struct rockchip_tve_data *data;
+
+	tve->dev = dev;
+	data = (const struct rockchip_tve_data *)dev_get_driver_data(dev);
+	tve->soc_type = data->soc_type;
+	tve->input_format = data->input_format;
+
+	rockchip_connector_bind(&tve->connector, dev, 0, &rockchip_drm_tve_funcs, NULL, DRM_MODE_CONNECTOR_TV);
+
+	return 0;
+}
+
+static const struct rockchip_tve_data rk3036_tve = {
+	.soc_type = SOC_RK3036,
+	.input_format = INPUT_FORMAT_RGB,
+};
+
+static const struct rockchip_tve_data rk312x_tve = {
+	.soc_type = SOC_RK312X,
+	.input_format = INPUT_FORMAT_RGB,
+};
+
+static const struct rockchip_tve_data rk322x_tve = {
+	.soc_type = SOC_RK322X,
+	.input_format = INPUT_FORMAT_YUV,
+};
+
+static const struct rockchip_tve_data rk3328_tve = {
+	.soc_type = SOC_RK3328,
+	.input_format = INPUT_FORMAT_YUV,
+};
+
+static const struct rockchip_tve_data rk3528_tve = {
+	.soc_type = SOC_RK3528,
+	.input_format = INPUT_FORMAT_YUV,
+};
+
+static const struct udevice_id rockchip_drm_tve_ids[] = {
+	{ .compatible = "rockchip,rk3036-tve", .data = (ulong)&rk3036_tve },
+	{ .compatible = "rockchip,rk312x-tve", .data = (ulong)&rk312x_tve },
+	{ .compatible = "rockchip,rk322x-tve", .data = (ulong)&rk322x_tve },
+	{ .compatible = "rockchip,rk3328-tve", .data = (ulong)&rk3328_tve },
+	{ .compatible = "rockchip,rk3528-tve", .data = (ulong)&rk3528_tve },
+};
+
+U_BOOT_DRIVER(rockchip_drm_tve) = {
+	.name = "rockchip_drm_tve",
+	.id = UCLASS_DISPLAY,
+	.of_match = rockchip_drm_tve_ids,
+	.probe	= rockchip_drm_tve_probe,
+	.priv_auto_alloc_size = sizeof(struct rockchip_tve),
+};
diff --git a/u-boot/drivers/video/drm/rockchip_tve.h b/u-boot/drivers/video/drm/rockchip_tve.h
new file mode 100644
index 0000000..5cf5f21
--- /dev/null
+++ b/u-boot/drivers/video/drm/rockchip_tve.h
@@ -0,0 +1,253 @@
+/*
+ * SPDX-License-Identifier:	GPL-2.0+
+ * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd
+ */
+#ifndef __ROCKCHIP_TVE_H__
+#define __ROCKCHIP_TVE_H__
+
+#define RK3036_GRF_SOC_CON3	0x0154
+#define RK312X_GRF_TVE_CON	0x0170
+	#define m_EXTREF_EN		BIT(0)
+	#define m_VBG_EN		BIT(1)
+	#define m_DAC_EN		BIT(2)
+	#define m_SENSE_EN		BIT(3)
+	#define m_BIAS_EN		(7 << 4)
+	#define m_DAC_GAIN		(0x3f << 7)
+	#define v_DAC_GAIN(x)		(((x) & 0x3f) << 7)
+
+#define TV_CTRL			(0x00)
+	#define m_CVBS_MODE			BIT(24)
+	#define m_CLK_UPSTREAM_EN		(3 << 18)
+	#define m_TIMING_EN			(3 << 16)
+	#define m_LUMA_FILTER_GAIN		(3 << 9)
+	#define m_LUMA_FILTER_BW		BIT(8)
+	#define m_CSC_PATH			(3 << 1)
+
+	#define v_CVBS_MODE(x)			(((x) & 1) << 24)
+	#define v_CLK_UPSTREAM_EN(x)		(((x) & 3) << 18)
+	#define v_TIMING_EN(x)			(((x) & 3) << 16)
+	#define v_LUMA_FILTER_GAIN(x)		(((x) & 3) << 9)
+	#define v_LUMA_FILTER_UPSAMPLE(x)	(((x) & 1) << 8)
+	#define v_CSC_PATH(x)			(((x) & 3) << 1)
+
+#define TV_SYNC_TIMING		(0x04)
+#define TV_ACT_TIMING		(0x08)
+#define TV_ADJ_TIMING		(0x0c)
+#define TV_FREQ_SC		(0x10)
+#define TV_LUMA_FILTER0		(0x14)
+#define TV_LUMA_FILTER1		(0x18)
+#define TV_LUMA_FILTER2		(0x1C)
+#define TV_ACT_ST		(0x34)
+#define TV_ROUTING		(0x38)
+	#define m_DAC_SENSE_EN		BIT(27)
+	#define m_Y_IRE_7_5		BIT(19)
+	#define m_Y_AGC_PULSE_ON	BIT(15)
+	#define m_Y_VIDEO_ON		BIT(11)
+	#define m_Y_SYNC_ON		BIT(7)
+	#define m_YPP_MODE		BIT(3)
+	#define m_MONO_EN		BIT(2)
+	#define m_PIC_MODE		BIT(1)
+
+	#define v_DAC_SENSE_EN(x)	(((x) & 1) << 27)
+	#define v_Y_IRE_7_5(x)		(((x) & 1) << 19)
+	#define v_Y_AGC_PULSE_ON(x)	(((x) & 1) << 15)
+	#define v_Y_VIDEO_ON(x)		(((x) & 1) << 11)
+	#define v_Y_SYNC_ON(x)		(((x) & 1) << 7)
+	#define v_YPP_MODE(x)		(((x) & 1) << 3)
+	#define v_MONO_EN(x)		(((x) & 1) << 2)
+	#define v_PIC_MODE(x)		(((x) & 1) << 1)
+
+#define TV_SYNC_ADJUST		(0x50)
+#define TV_STATUS		(0x54)
+#define TV_RESET		(0x68)
+	#define m_RESET			BIT(1)
+	#define v_RESET(x)		(((x) & 1) << 1)
+#define TV_SATURATION		(0x78)
+#define TV_BW_CTRL		(0x8C)
+	#define m_CHROMA_BW	(3 << 4)
+	#define m_COLOR_DIFF_BW	(0xf)
+
+	enum {
+		BP_FILTER_PASS = 0,
+		BP_FILTER_NTSC,
+		BP_FILTER_PAL,
+	};
+	enum {
+		COLOR_DIFF_FILTER_OFF = 0,
+		COLOR_DIFF_FILTER_BW_0_6,
+		COLOR_DIFF_FILTER_BW_1_3,
+		COLOR_DIFF_FILTER_BW_2_0
+	};
+
+	#define v_CHROMA_BW(x)		((3 & (x)) << 4)
+	#define v_COLOR_DIFF_BW(x)	(0xF & (x))
+
+#define TV_BRIGHTNESS_CONTRAST	(0x90)
+
+#define VDAC_VDAC0		(0x00)
+	#define m_RST_ANA		BIT(7)
+	#define m_RST_DIG		BIT(6)
+
+	#define v_RST_ANA(x)		(((x) & 1) << 7)
+	#define v_RST_DIG(x)		(((x) & 1) << 6)
+#define VDAC_VDAC1		(0x280)
+	#define m_CUR_REG		(0xf << 4)
+	#define m_DR_PWR_DOWN		BIT(1)
+	#define m_BG_PWR_DOWN		BIT(0)
+
+	#define v_CUR_REG(x)		(((x) & 0xf) << 4)
+	#define v_DR_PWR_DOWN(x)	(((x) & 1) << 1)
+	#define v_BG_PWR_DOWN(x)	(((x) & 1) << 0)
+#define VDAC_VDAC2	(0x284)
+	#define m_CUR_CTR		(0X3f)
+
+	#define v_CUR_CTR(x)		(((x) & 0x3f))
+#define VDAC_VDAC3		(0x288)
+	#define m_CAB_EN		BIT(5)
+	#define m_CAB_REF		BIT(4)
+	#define m_CAB_FLAG		BIT(0)
+
+	#define v_CAB_EN(x)		(((x) & 1) << 5)
+	#define v_CAB_REF(x)		(((x) & 1) << 4)
+	#define v_CAB_FLAG(x)		(((x) & 1) << 0)
+
+// RK3528 CVBS GRF
+#define RK3528_VO_GRF_VDAC_DIS	0x60000
+	#define m_VDAC_DIS_NEGE_ST	BIT(2)
+	#define m_VDAC_DIS_POSE_ST	BIT(1)
+	#define m_STAT_VDAC_DISDET	BIT(0)
+
+	#define v_VDAC_DIS_NEGE_ST(x)	(((x) & 1) << 2)
+	#define v_VDAC_DIS_POSE_ST(x)	(((x) & 1) << 1)
+	#define v_STAT_VDAC_DISDET(x)	(((x) & 1) << 0)
+
+#define RK3528_VO_GRF_CVBS_CON	0x60010
+	#define m_VDAC_DIS_INT_EN	BIT(8)
+	#define m_VDAC_DIS_NEGE_MASK	BIT(7)
+	#define m_VDAC_DIS_POSE_MASK	BIT(6)
+	#define m_TVE_DCLK_POL		BIT(5)
+	#define m_TVE_DCLK_EN		BIT(4)
+	#define m_DCLK_UPSAMPLE_2X4X	BIT(3)
+	#define m_DCLK_UPSAMPLE_EN	BIT(2)
+	#define m_TVE_MODE		BIT(1)
+	#define m_TVE_EN		BIT(0)
+
+	#define v_VDAC_DIS_INT_EN(x)	(((x) & 1) << 8)
+	#define v_VDAC_DIS_NEGE_MASK(x)	(((x) & 1) << 7)
+	#define v_VDAC_DIS_POSE_MASK(x)	(((x) & 1) << 6)
+	#define v_TVE_DCLK_POL(x)	(((x) & 1) << 5)
+	#define v_TVE_DCLK_EN(x)	(((x) & 1) << 4)
+	#define v_DCLK_UPSAMPLE_2X4X(x)	(((x) & 1) << 3)
+	#define v_DCLK_UPSAMPLE_EN(x)	(((x) & 1) << 2)
+	#define v_TVE_MODE(x)		(((x) & 1) << 1)
+	#define v_TVE_EN(x)		(((x) & 1) << 0)
+
+// RK3528 CVBS TVE
+#define BT656_DECODER_CTRL		(0x3D00)
+#define BT656_DECODER_CROP		(0x3D04)
+#define BT656_DECODER_SIZE		(0x3D08)
+#define BT656_DECODER_HTOTAL_HS_END	(0x3D0C)
+#define BT656_DECODER_VACT_ST_HACT_ST	(0x3D10)
+#define BT656_DECODER_VTOTAL_VS_END	(0x3D14)
+#define BT656_DECODER_VS_ST_END_F1	(0x3D18)
+#define BT656_DECODER_DBG_REG		(0x3D1C)
+#define TVE_MODE_CTRL			(0x3E00)
+#define TVE_HOR_TIMING1			(0x3E04)
+#define TVE_HOR_TIMING2			(0x3E08)
+#define TVE_HOR_TIMING3			(0x3E0C)
+#define TVE_SUB_CAR_FRQ			(0x3E10)
+#define TVE_LUMA_FILTER1		(0x3E14)
+#define TVE_LUMA_FILTER2		(0x3E18)
+#define TVE_LUMA_FILTER3		(0x3E1C)
+#define TVE_LUMA_FILTER4		(0x3E20)
+#define TVE_LUMA_FILTER5		(0x3E24)
+#define TVE_LUMA_FILTER6		(0x3E28)
+#define TVE_LUMA_FILTER7		(0x3E2C)
+#define TVE_LUMA_FILTER8		(0x3E30)
+#define TVE_IMAGE_POSITION		(0x3E34)
+#define TVE_ROUTING			(0x3E38)
+#define TVE_SYNC_ADJUST			(0x3E50)
+#define TVE_STATUS			(0x3E54)
+#define TVE_CTRL			(0x3E68)
+#define TVE_INTR_STATUS			(0x3E6C)
+#define TVE_INTR_EN			(0x3E70)
+#define TVE_INTR_CLR			(0x3E74)
+#define TVE_COLOR_BUSRT_SAT		(0x3E78)
+#define TVE_CHROMA_BANDWIDTH		(0x3E8C)
+#define TVE_BRIGHTNESS_CONTRAST		(0x3E90)
+#define TVE_ID				(0x3E98)
+#define TVE_REVISION			(0x3E9C)
+#define TVE_CLAMP			(0x3EA0)
+
+// RK3528 CVBS VDAC
+#define VDAC_CLK_RST			(0x0000)
+	#define m_ANALOG_RST		BIT(7)
+	#define m_DIGITAL_RST		BIT(6)
+	#define m_INPUT_CLK_INV		BIT(0)
+
+	#define v_ANALOG_RST(x)		(((x) & 1) << 7)
+	#define v_DIGITAL_RST(x)	(((x) & 1) << 6)
+	#define v_INPUT_CLK_INV(x)	(((x) & 1) << 0)
+#define VDAC_SINE_CTRL			(0x0004)
+#define VDAC_SQUARE_CTRL		(0x0008)
+#define VDAC_LEVEL_CTRL0		(0x0018)
+#define VDAC_LEVEL_CTRL1		(0x001C)
+#define VDAC_PWM_REF_CTRL		(0x0280)
+	#define m_REF_VOLTAGE		(0xf << 4)
+	#define m_REF_RESISTOR		BIT(3)
+	#define m_SMP_CLK_INV		BIT(2)
+	#define m_DAC_PWN		BIT(1)
+	#define m_BIAS_PWN		BIT(0)
+
+	#define v_REF_VOLTAGE(x)	(((x) & 0xf) << 4)
+	#define v_SMP_CLK_INV(x)	(((x) & 1) << 2)
+	#define v_REF_RESISTOR(x)	(((x) & 1) << 3)
+	#define v_DAC_PWN(x)		(((x) & 1) << 1)
+	#define v_BIAS_PWN(x)		(((x) & 1) << 0)
+#define VDAC_CURRENT_CTRL		(0x0284)
+	#define m_OUT_CURRENT		(0xff << 0)
+
+	#define v_OUT_CURRENT(x)	(((x) & 0xff) << 0)
+#define VDAC_CABLE_CTRL			(0x0288)
+#define VDAC_VOLTAGE_CTRL		(0x028C)
+#define VDAC_BIAS_CLK_CTRL0		(0x0290)
+#define VDAC_BIAS_CLK_CTRL1		(0x0294)
+#define VDAC_AUTO_CLK_CTRL0		(0x0298)
+#define VDAC_AUTO_CLK_CTRL1		(0x029C)
+
+enum {
+	TVOUT_CVBS_NTSC = 0,
+	TVOUT_CVBS_PAL,
+};
+
+enum {
+	INPUT_FORMAT_RGB = 0,
+	INPUT_FORMAT_YUV
+};
+
+enum {
+	SOC_RK3036 = 0,
+	SOC_RK312X,
+	SOC_RK322X,
+	SOC_RK3328,
+	SOC_RK3528
+};
+
+
+enum {
+	DCLK_UPSAMPLEx1 = 0,
+	DCLK_UPSAMPLEx2,
+	DCLK_UPSAMPLEx4
+};
+
+#define RK30_TVE_REGBASE 0x10118000 + 0x200
+#define MAX_TVE_COUNT  2
+
+#ifdef TVEDEBUG
+#define TVEDBG(format, ...) \
+		printf("TVE: " format, ## __VA_ARGS__)
+#else
+#define TVEDBG(format, ...)
+#endif
+
+#endif /* __ROCKCHIP_TVE_H__ */
diff --git a/u-boot/drivers/video/drm/rockchip_vop.c b/u-boot/drivers/video/drm/rockchip_vop.c
index e0ce7cf..fb90de8 100644
--- a/u-boot/drivers/video/drm/rockchip_vop.c
+++ b/u-boot/drivers/video/drm/rockchip_vop.c
@@ -97,6 +97,19 @@
 		return false;
 }
 
+static bool is_rb_swap(uint32_t bus_format, uint32_t output_mode)
+{
+	/*
+	 * The default component order of serial rgb3x8 formats
+	 * is BGR. So it is needed to enable RB swap.
+	 */
+	if (bus_format == MEDIA_BUS_FMT_SRGB888_3X8 ||
+	    bus_format == MEDIA_BUS_FMT_SRGB888_DUMMY_4X8)
+		return true;
+	else
+		return false;
+}
+
 static int rockchip_vop_init_gamma(struct vop *vop, struct display_state *state)
 {
 	struct crtc_state *crtc_state = &state->crtc_state;
@@ -298,7 +311,7 @@
 	VOP_CTRL_SET(vop, win_channel[2], 0x56);
 	VOP_CTRL_SET(vop, dsp_blank, 0);
 
-	dclk_inv = (mode->flags & DRM_MODE_FLAG_PPIXDATA) ? 0 : 1;
+	dclk_inv = (conn_state->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0;
 	/* For improving signal quality, dclk need to be inverted by default on rv1106. */
 	if ((VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 12))
 		dclk_inv = !dclk_inv;
@@ -403,8 +416,9 @@
 	VOP_CTRL_SET(vop, hdmi_dclk_out_en,
 		     conn_state->output_mode == ROCKCHIP_OUT_MODE_YUV420 ? 1 : 0);
 
-	if (is_uv_swap(conn_state->bus_format, conn_state->output_mode))
-		VOP_CTRL_SET(vop, dsp_data_swap, DSP_RB_SWAP);
+	if (is_uv_swap(conn_state->bus_format, conn_state->output_mode) ||
+	    is_rb_swap(conn_state->bus_format, conn_state->output_mode))
+		VOP_CTRL_SET(vop, dsp_rb_swap, 1);
 	else
 		VOP_CTRL_SET(vop, dsp_data_swap, 0);
 
@@ -888,6 +902,16 @@
 	return 0;
 }
 
+static int rockchip_vop_mode_fixup(struct display_state *state)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+
+	drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V | CRTC_STEREO_DOUBLE);
+
+	return 0;
+}
+
 const struct rockchip_crtc_funcs rockchip_vop_funcs = {
 	.preinit = rockchip_vop_preinit,
 	.init = rockchip_vop_init,
@@ -899,4 +923,5 @@
 	.send_mcu_cmd = rockchip_vop_send_mcu_cmd,
 	.mode_valid = rockchip_vop_mode_valid,
 	.plane_check = rockchip_vop_plane_check,
+	.mode_fixup = rockchip_vop_mode_fixup,
 };
diff --git a/u-boot/drivers/video/drm/rockchip_vop.h b/u-boot/drivers/video/drm/rockchip_vop.h
index c75550d..aa2209d 100644
--- a/u-boot/drivers/video/drm/rockchip_vop.h
+++ b/u-boot/drivers/video/drm/rockchip_vop.h
@@ -298,6 +298,11 @@
 
 	struct vop_reg dsp_out_yuv;
 	struct vop_reg dsp_data_swap;
+	struct vop_reg dsp_bg_swap;
+	struct vop_reg dsp_rb_swap;
+	struct vop_reg dsp_rg_swap;
+	struct vop_reg dsp_delta_swap;
+	struct vop_reg dsp_dummy_swap;
 	struct vop_reg dsp_ccir656_avg;
 	struct vop_reg dsp_black;
 	struct vop_reg dsp_blank;
diff --git a/u-boot/drivers/video/drm/rockchip_vop2.c b/u-boot/drivers/video/drm/rockchip_vop2.c
index 4015101..040b54d 100644
--- a/u-boot/drivers/video/drm/rockchip_vop2.c
+++ b/u-boot/drivers/video/drm/rockchip_vop2.c
@@ -17,20 +17,24 @@
 #include <linux/list.h>
 #include <linux/log2.h>
 #include <linux/media-bus-format.h>
-#include <clk.h>
 #include <asm/arch/clock.h>
+#include <asm/gpio.h>
 #include <linux/err.h>
 #include <linux/ioport.h>
 #include <dm/device.h>
 #include <dm/read.h>
+#include <dm/ofnode.h>
 #include <fixp-arith.h>
 #include <syscon.h>
 #include <linux/iopoll.h>
 #include <dm/uclass-internal.h>
+#include <stdlib.h>
 
 #include "rockchip_display.h"
 #include "rockchip_crtc.h"
 #include "rockchip_connector.h"
+#include "rockchip_phy.h"
+#include "rockchip_post_csc.h"
 
 /* System registers definition */
 #define RK3568_REG_CFG_DONE			0x000
@@ -40,9 +44,12 @@
 #define EN_MASK					1
 
 #define RK3568_AUTO_GATING_CTRL			0x008
+#define AUTO_GATING_EN_SHIFT			31
+#define PORT_DCLK_AUTO_GATING_EN_SHIFT		14
 
 #define RK3568_SYS_AXI_LUT_CTRL			0x024
 #define LUT_DMA_EN_SHIFT			0
+#define DSP_VS_T_SEL_SHIFT			16
 
 #define RK3568_DSP_IF_EN			0x028
 #define RGB_EN_SHIFT				0
@@ -81,6 +88,9 @@
 #define LVDS_DUAL_EN_SHIFT			0
 #define LVDS_DUAL_LEFT_RIGHT_EN_SHIFT		1
 #define LVDS_DUAL_SWAP_EN_SHIFT			2
+#define BT656_UV_SWAP				4
+#define BT656_YC_SWAP				5
+#define BT656_DCLK_POL				6
 #define RK3588_HDMI_DUAL_EN_SHIFT		8
 #define RK3588_EDP_DUAL_EN_SHIFT		8
 #define RK3588_DP_DUAL_EN_SHIFT			9
@@ -93,15 +103,22 @@
 #define IF_CTRL_REG_DONE_IMD_SHIFT		28
 #define IF_CRTL_MIPI_DCLK_POL_SHIT		19
 #define IF_CRTL_EDP_DCLK_POL_SHIT		15
+#define IF_CTRL_EDP_PIN_POL_MASK		0x7
+#define IF_CTRL_EDP_PIN_POL_SHIFT		12
 #define IF_CRTL_HDMI_DCLK_POL_SHIT		7
 #define IF_CRTL_HDMI_PIN_POL_MASK		0x7
 #define IF_CRTL_HDMI_PIN_POL_SHIT		4
+#define IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT		3
+#define IF_CTRL_RGB_LVDS_PIN_POL_MASK		0x7
+#define IF_CTRL_RGB_LVDS_PIN_POL_SHIFT		0
+
+#define RK3562_MIPI_DCLK_POL_SHIFT		15
+#define RK3562_MIPI_PIN_POL_SHIFT		12
+#define RK3562_IF_PIN_POL_MASK			0x7
 
 #define RK3588_DP0_PIN_POL_SHIFT		8
 #define RK3588_DP1_PIN_POL_SHIFT		12
 #define RK3588_IF_PIN_POL_MASK			0x7
-
-#define IF_CRTL_RGB_LVDS_DCLK_POL_SHIT		3
 
 #define HDMI_EDP0_DCLK_DIV_SHIFT		16
 #define HDMI_EDP0_PIXCLK_DIV_SHIFT		18
@@ -118,6 +135,8 @@
 #define GAMMA_AHB_WRITE_SEL_MASK		0x3
 #define GAMMA_AHB_WRITE_SEL_SHIFT		12
 #define PORT_MERGE_EN_SHIFT			16
+#define ESMART_LB_MODE_SEL_MASK			0x3
+#define ESMART_LB_MODE_SEL_SHIFT		26
 
 #define RK3568_SYS_PD_CTRL			0x034
 #define RK3568_VP0_LINE_FLAG			0x70
@@ -145,6 +164,11 @@
 #define RK3588_DSC_8K_PD_EN_SHIFT		5
 #define RK3588_DSC_4K_PD_EN_SHIFT		6
 #define RK3588_ESMART_PD_EN_SHIFT		7
+
+#define RK3588_SYS_VAR_FREQ_CTRL		0x038
+#define RK3588_VP0_LINE_FLAG_OR_EN_SHIFT	20
+#define RK3588_VP0_DSP_HOLD_OR_EN_SHIFT		24
+#define RK3588_VP0_ALMOST_FULL_OR_EN_SHIFT	28
 
 #define RK3568_SYS_STATUS0			0x60
 #define RK3588_CLUSTER0_PD_STATUS_SHIFT		8
@@ -212,10 +236,27 @@
 #define RK3588_DSC_8K_STATUS			0x220
 
 /* Overlay registers definition    */
+#define RK3528_OVL_SYS				0x500
+#define RK3528_OVL_SYS_PORT_SEL_IMD		0x504
+#define RK3528_OVL_SYS_GATING_EN_IMD		0x508
+#define RK3528_OVL_SYS_CLUSTER0_CTRL		0x510
+#define RK3528_OVL_SYS_ESMART0_CTRL		0x520
+#define ESMART_DLY_NUM_MASK			0xff
+#define ESMART_DLY_NUM_SHIFT			0
+#define RK3528_OVL_SYS_ESMART1_CTRL		0x524
+#define RK3528_OVL_SYS_ESMART2_CTRL		0x528
+#define RK3528_OVL_SYS_ESMART3_CTRL		0x52C
+#define RK3528_CLUSTER0_MIX_SRC_COLOR_CTRL	0x530
+#define RK3528_CLUSTER0_MIX_DST_COLOR_CTRL	0x534
+#define RK3528_CLUSTER0_MIX_SRC_ALPHA_CTRL	0x538
+#define RK3528_CLUSTER0_MIX_DST_ALPHA_CTRL	0x53c
+
+#define RK3528_OVL_PORT0_CTRL			0x600
 #define RK3568_OVL_CTRL				0x600
 #define OVL_MODE_SEL_MASK			0x1
 #define OVL_MODE_SEL_SHIFT			0
 #define OVL_PORT_MUX_REG_DONE_IMD_SHIFT		28
+#define RK3528_OVL_PORT0_LAYER_SEL		0x604
 #define RK3568_OVL_LAYER_SEL			0x604
 #define LAYER_SEL_MASK				0xf
 
@@ -229,10 +270,27 @@
 #define RK3568_CLUSTER0_MIX_DST_COLOR_CTRL	0x614
 #define RK3568_CLUSTER0_MIX_SRC_ALPHA_CTRL	0x618
 #define RK3568_CLUSTER0_MIX_DST_ALPHA_CTRL	0x61C
+#define RK3528_OVL_PORT0_MIX0_SRC_COLOR_CTRL	0x620
+#define RK3528_OVL_PORT0_MIX0_DST_COLOR_CTRL	0x624
+#define RK3528_OVL_PORT0_MIX0_SRC_ALPHA_CTRL	0x628
+#define RK3528_OVL_PORT0_MIX0_DST_ALPHA_CTRL	0x62C
+#define RK3528_OVL_PORT0_MIX1_SRC_COLOR_CTRL	0x630
+#define RK3528_OVL_PORT0_MIX1_DST_COLOR_CTRL	0x634
+#define RK3528_OVL_PORT0_MIX1_SRC_ALPHA_CTRL	0x638
+#define RK3528_OVL_PORT0_MIX1_DST_ALPHA_CTRL	0x63C
+#define RK3528_OVL_PORT0_MIX2_SRC_COLOR_CTRL	0x640
+#define RK3528_OVL_PORT0_MIX2_DST_COLOR_CTRL	0x644
+#define RK3528_OVL_PORT0_MIX2_SRC_ALPHA_CTRL	0x648
+#define RK3528_OVL_PORT0_MIX2_DST_ALPHA_CTRL	0x64C
 #define RK3568_MIX0_SRC_COLOR_CTRL		0x650
 #define RK3568_MIX0_DST_COLOR_CTRL		0x654
 #define RK3568_MIX0_SRC_ALPHA_CTRL		0x658
 #define RK3568_MIX0_DST_ALPHA_CTRL		0x65C
+#define RK3528_HDR_SRC_COLOR_CTRL		0x660
+#define RK3528_HDR_DST_COLOR_CTRL		0x664
+#define RK3528_HDR_SRC_ALPHA_CTRL		0x668
+#define RK3528_HDR_DST_ALPHA_CTRL		0x66C
+#define RK3528_OVL_PORT0_BG_MIX_CTRL		0x670
 #define RK3568_HDR0_SRC_COLOR_CTRL		0x6C0
 #define RK3568_HDR0_DST_COLOR_CTRL		0x6C4
 #define RK3568_HDR0_SRC_ALPHA_CTRL		0x6C8
@@ -244,6 +302,22 @@
 #define RK3568_VP2_BG_MIX_CTRL			0x6E8
 #define RK3568_CLUSTER_DLY_NUM			0x6F0
 #define RK3568_SMART_DLY_NUM			0x6F8
+
+#define RK3528_OVL_PORT1_CTRL			0x700
+#define RK3528_OVL_PORT1_LAYER_SEL		0x704
+#define RK3528_OVL_PORT1_MIX0_SRC_COLOR_CTRL	0x720
+#define RK3528_OVL_PORT1_MIX0_DST_COLOR_CTRL	0x724
+#define RK3528_OVL_PORT1_MIX0_SRC_ALPHA_CTRL	0x728
+#define RK3528_OVL_PORT1_MIX0_DST_ALPHA_CTRL	0x72C
+#define RK3528_OVL_PORT1_MIX1_SRC_COLOR_CTRL	0x730
+#define RK3528_OVL_PORT1_MIX1_DST_COLOR_CTRL	0x734
+#define RK3528_OVL_PORT1_MIX1_SRC_ALPHA_CTRL	0x738
+#define RK3528_OVL_PORT1_MIX1_DST_ALPHA_CTRL	0x73C
+#define RK3528_OVL_PORT1_MIX2_SRC_COLOR_CTRL	0x740
+#define RK3528_OVL_PORT1_MIX2_DST_COLOR_CTRL	0x744
+#define RK3528_OVL_PORT1_MIX2_SRC_ALPHA_CTRL	0x748
+#define RK3528_OVL_PORT1_MIX2_DST_ALPHA_CTRL	0x74C
+#define RK3528_OVL_PORT1_BG_MIX_CTRL		0x770
 
 /* Video Port registers definition */
 #define RK3568_VP0_DSP_CTRL			0xC00
@@ -263,6 +337,7 @@
 #define POST_DSP_OUT_R2Y_SHIFT			15
 #define PRE_DITHER_DOWN_EN_SHIFT		16
 #define DITHER_DOWN_EN_SHIFT			17
+#define DITHER_DOWN_MODE_SHIFT			20
 #define GAMMA_UPDATE_EN_SHIFT			22
 #define DSP_LUT_EN_SHIFT			28
 
@@ -279,6 +354,9 @@
 
 
 #define RK3568_VP0_COLOR_BAR_CTRL		0xC08
+
+#define RK3568_VP0_DCLK_SEL			0xC0C
+
 #define RK3568_VP0_3D_LUT_CTRL			0xC10
 #define VP0_3D_LUT_EN_SHIFT				0
 #define VP0_3D_LUT_UPDATE_SHIFT			2
@@ -333,6 +411,50 @@
 #define BCSH_EN_SHIFT				31
 #define BCSH_EN_MASK				1
 
+#define RK3528_VP0_ACM_CTRL			0xCD0
+#define POST_CSC_COE00_MASK			0xFFFF
+#define POST_CSC_COE00_SHIFT			16
+#define POST_R2Y_MODE_MASK			0x7
+#define POST_R2Y_MODE_SHIFT			8
+#define POST_CSC_MODE_MASK			0x7
+#define POST_CSC_MODE_SHIFT			3
+#define POST_R2Y_EN_MASK			0x1
+#define POST_R2Y_EN_SHIFT			2
+#define POST_CSC_EN_MASK			0x1
+#define POST_CSC_EN_SHIFT			1
+#define POST_ACM_BYPASS_EN_MASK			0x1
+#define POST_ACM_BYPASS_EN_SHIFT		0
+#define RK3528_VP0_CSC_COE01_02			0xCD4
+#define RK3528_VP0_CSC_COE10_11			0xCD8
+#define RK3528_VP0_CSC_COE12_20			0xCDC
+#define RK3528_VP0_CSC_COE21_22			0xCE0
+#define RK3528_VP0_CSC_OFFSET0			0xCE4
+#define RK3528_VP0_CSC_OFFSET1			0xCE8
+#define RK3528_VP0_CSC_OFFSET2			0xCEC
+
+#define RK3562_VP0_MCU_CTRL			0xCF8
+#define MCU_TYPE_SHIFT				31
+#define MCU_BYPASS_SHIFT			30
+#define MCU_RS_SHIFT				29
+#define MCU_FRAME_ST_SHIFT			28
+#define MCU_HOLD_MODE_SHIFT			27
+#define MCU_CLK_SEL_SHIFT			26
+#define MCU_CLK_SEL_MASK			0x1
+#define MCU_RW_PEND_SHIFT			20
+#define MCU_RW_PEND_MASK			0x3F
+#define MCU_RW_PST_SHIFT			16
+#define MCU_RW_PST_MASK				0xF
+#define MCU_CS_PEND_SHIFT			10
+#define MCU_CS_PEND_MASK			0x3F
+#define MCU_CS_PST_SHIFT			6
+#define MCU_CS_PST_MASK				0xF
+#define MCU_PIX_TOTAL_SHIFT			0
+#define MCU_PIX_TOTAL_MASK			0x3F
+
+#define RK3562_VP0_MCU_RW_BYPASS_PORT		0xCFC
+#define MCU_WRITE_DATA_BYPASS_SHIFT		0
+#define MCU_WRITE_DATA_BYPASS_MASK		0xFFFFFFFF
+
 #define RK3568_VP1_DSP_CTRL			0xD00
 #define RK3568_VP1_MIPI_CTRL			0xD04
 #define RK3568_VP1_COLOR_BAR_CTRL		0xD08
@@ -374,9 +496,20 @@
 #define CLUSTER_YUV2RGB_EN_SHIFT		8
 #define CLUSTER_RGB2YUV_EN_SHIFT		9
 #define CLUSTER_CSC_MODE_SHIFT			10
-#define CLUSTER_YRGB_XSCL_MODE_SHIFT		12
-#define CLUSTER_YRGB_YSCL_MODE_SHIFT		14
+#define CLUSTER_DITHER_UP_EN_SHIFT		18
 #define RK3568_CLUSTER0_WIN0_CTRL1		0x1004
+#define RK3568_CLUSTER_YRGB_XSCL_MODE_SHIFT	12
+#define RK3568_CLUSTER_YRGB_YSCL_MODE_SHIFT	14
+#define RK3528_CLUSTER_YRGB_YSCL_MODE_SHIFT	14
+#define AVG2_MASK				0x1
+#define CLUSTER_AVG2_SHIFT			18
+#define AVG4_MASK				0x1
+#define CLUSTER_AVG4_SHIFT			19
+#define RK3528_CLUSTER_YRGB_XSCL_MODE_SHIFT	22
+#define CLUSTER_XGT_EN_SHIFT			24
+#define XGT_MODE_MASK				0x3
+#define CLUSTER_XGT_MODE_SHIFT			25
+#define CLUSTER_XAVG_EN_SHIFT			27
 #define CLUSTER_YRGB_GT2_SHIFT			28
 #define CLUSTER_YRGB_GT4_SHIFT			29
 #define RK3568_CLUSTER0_WIN0_CTRL2		0x1008
@@ -399,6 +532,7 @@
 #define RK3568_CLUSTER0_WIN0_AFBCD_PIC_OFFSET	0x1064
 #define RK3568_CLUSTER0_WIN0_AFBCD_DSP_OFFSET	0x1068
 #define RK3568_CLUSTER0_WIN0_AFBCD_CTRL		0x106C
+#define CLUSTER_AFBCD_HALF_BLOCK_SHIFT		7
 
 #define RK3568_CLUSTER0_WIN1_CTRL0		0x1080
 #define RK3568_CLUSTER0_WIN1_CTRL1		0x1084
@@ -463,6 +597,8 @@
 #define RGB2YUV_EN_SHIFT			1
 #define CSC_MODE_SHIFT				2
 #define CSC_MODE_MASK				0x3
+#define ESMART_LB_SELECT_SHIFT			12
+#define ESMART_LB_SELECT_MASK			0x3
 
 #define RK3568_ESMART0_CTRL1			0x1804
 #define ESMART_AXI_YRGB_ID_MASK			0x1f
@@ -476,10 +612,14 @@
 #define ESMART_AXI_ID_SHIFT			1
 
 #define RK3568_ESMART0_REGION0_CTRL		0x1810
-#define REGION0_RB_SWAP_SHIFT			14
 #define WIN_EN_SHIFT				0
 #define WIN_FORMAT_MASK				0x1f
 #define WIN_FORMAT_SHIFT			1
+#define REGION0_DITHER_UP_EN_SHIFT		12
+#define REGION0_RB_SWAP_SHIFT			14
+#define ESMART_XAVG_EN_SHIFT			20
+#define ESMART_XGT_EN_SHIFT			21
+#define ESMART_XGT_MODE_SHIFT			22
 
 #define RK3568_ESMART0_REGION0_YRGB_MST		0x1814
 #define RK3568_ESMART0_REGION0_CBR_MST		0x1818
@@ -680,6 +820,13 @@
 #define RK3568_SMART1_REGION3_SCL_FACTOR_CBR	0x1EC8
 #define RK3568_SMART1_REGION3_SCL_OFFSET	0x1ECC
 
+/* HDR register definition */
+#define RK3568_HDR_LUT_CTRL			0x2000
+
+#define RK3588_VP3_DSP_CTRL			0xF00
+#define RK3588_CLUSTER2_WIN0_CTRL0		0x1400
+#define RK3588_CLUSTER3_WIN0_CTRL0		0x1600
+
 /* DSC 8K/4K register definition */
 #define RK3588_DSC_8K_PPS0_3			0x4000
 #define RK3588_DSC_8K_CTRL0			0x40A0
@@ -690,10 +837,14 @@
 #define DSC_MER_SHIFT				5
 #define DSC_EPB_SHIFT				6
 #define DSC_EPL_SHIFT				7
+#define DSC_NSLC_MASK				0x7
 #define DSC_NSLC_SHIFT				16
 #define DSC_SBO_SHIFT				28
 #define DSC_IFEP_SHIFT				29
 #define DSC_PPS_UPD_SHIFT			31
+#define DSC_CTRL0_DEF_CON ((1 << DSC_EN_SHIFT)   | (1 << DSC_RBIT_SHIFT) | (0 << DSC_RBYT_SHIFT) | \
+			   (1 << DSC_FLAL_SHIFT) | (1 << DSC_MER_SHIFT)  | (0 << DSC_EPB_SHIFT)  | \
+			   (1 << DSC_EPL_SHIFT)  | (1 << DSC_SBO_SHIFT))
 
 #define RK3588_DSC_8K_CTRL1			0x40A4
 #define RK3588_DSC_8K_STS0			0x40A8
@@ -705,8 +856,24 @@
 #define RK3588_DSC_4K_STS0			0x41A8
 #define RK3588_DSC_4K_ERS			0x41C4
 
+/* RK3528 HDR register definition */
+#define RK3528_HDR_LUT_CTRL			0x2000
+
+/* RK3528 ACM register definition */
+#define RK3528_ACM_CTRL				0x6400
+#define RK3528_ACM_DELTA_RANGE			0x6404
+#define RK3528_ACM_FETCH_START			0x6408
+#define RK3528_ACM_FETCH_DONE			0x6420
+#define RK3528_ACM_YHS_DEL_HY_SEG0		0x6500
+#define RK3528_ACM_YHS_DEL_HY_SEG152		0x6760
+#define RK3528_ACM_YHS_DEL_HS_SEG0		0x6764
+#define RK3528_ACM_YHS_DEL_HS_SEG220		0x6ad4
+#define RK3528_ACM_YHS_DEL_HGAIN_SEG0		0x6ad8
+#define RK3528_ACM_YHS_DEL_HGAIN_SEG64		0x6bd8
+
 #define RK3568_MAX_REG				0x1ED0
 
+#define RK3562_GRF_IOC_VO_IO_CON		0x10500
 #define RK3568_GRF_VO_CON1			0x0364
 #define GRF_BT656_CLK_INV_SHIFT			1
 #define GRF_BT1120_CLK_INV_SHIFT		2
@@ -771,11 +938,52 @@
 
 #define VOP2_PLANE_NO_SCALING			BIT(16)
 
-enum vop2_csc_format {
+#define VOP_FEATURE_OUTPUT_10BIT	BIT(0)
+#define VOP_FEATURE_AFBDC		BIT(1)
+#define VOP_FEATURE_ALPHA_SCALE		BIT(2)
+#define VOP_FEATURE_HDR10		BIT(3)
+#define VOP_FEATURE_NEXT_HDR		BIT(4)
+/* a feature to splice two windows and two vps to support resolution > 4096 */
+#define VOP_FEATURE_SPLICE		BIT(5)
+#define VOP_FEATURE_OVERSCAN		BIT(6)
+#define VOP_FEATURE_VIVID_HDR		BIT(7)
+#define VOP_FEATURE_POST_ACM		BIT(8)
+#define VOP_FEATURE_POST_CSC		BIT(9)
+
+#define WIN_FEATURE_HDR2SDR		BIT(0)
+#define WIN_FEATURE_SDR2HDR		BIT(1)
+#define WIN_FEATURE_PRE_OVERLAY		BIT(2)
+#define WIN_FEATURE_AFBDC		BIT(3)
+#define WIN_FEATURE_CLUSTER_MAIN	BIT(4)
+#define WIN_FEATURE_CLUSTER_SUB		BIT(5)
+/* a mirror win can only get fb address
+ * from source win:
+ * Cluster1---->Cluster0
+ * Esmart1 ---->Esmart0
+ * Smart1  ---->Smart0
+ * This is a feather on rk3566
+ */
+#define WIN_FEATURE_MIRROR		BIT(6)
+#define WIN_FEATURE_MULTI_AREA		BIT(7)
+#define WIN_FEATURE_Y2R_13BIT_DEPTH	BIT(8)
+
+#define V4L2_COLORSPACE_BT709F		0xfe
+#define V4L2_COLORSPACE_BT2020F		0xff
+
+enum vop_csc_format {
 	CSC_BT601L,
 	CSC_BT709L,
 	CSC_BT601F,
 	CSC_BT2020,
+	CSC_BT709L_13BIT,
+	CSC_BT709F_13BIT,
+	CSC_BT2020L_13BIT,
+	CSC_BT2020F_13BIT,
+};
+
+enum vop_csc_bit_depth {
+	CSC_10BIT_DEPTH,
+	CSC_13BIT_DEPTH,
 };
 
 enum vop2_pol {
@@ -861,6 +1069,19 @@
 	VOP_DSC_IF_MIPI_VIDEO_MODE = 3,
 };
 
+enum vop3_pre_scale_down_mode {
+	VOP3_PRE_SCALE_UNSPPORT,
+	VOP3_PRE_SCALE_DOWN_GT,
+	VOP3_PRE_SCALE_DOWN_AVG,
+};
+
+enum vop3_esmart_lb_mode {
+	VOP3_ESMART_8K_MODE,
+	VOP3_ESMART_4K_4K_MODE,
+	VOP3_ESMART_4K_2K_2K_MODE,
+	VOP3_ESMART_2K_2K_2K_2K_MODE,
+};
+
 struct vop2_layer {
 	u8 id;
 	/**
@@ -886,12 +1107,19 @@
 	u8 phys_id;
 	enum vop2_layer_type type;
 	u8 win_sel_port_offset;
-	u8 layer_sel_win_id;
+	u8 layer_sel_win_id[VOP2_VP_MAX];
 	u8 axi_id;
 	u8 axi_uv_id;
 	u8 axi_yrgb_id;
 	u8 splice_win_id;
 	u8 pd_id;
+	u8 hsu_filter_mode;
+	u8 hsd_filter_mode;
+	u8 vsu_filter_mode;
+	u8 vsd_filter_mode;
+	u8 hsd_pre_filter_mode;
+	u8 vsd_pre_filter_mode;
+	u8 scale_engine_num;
 	u32 reg_offset;
 	u32 max_upscale_factor;
 	u32 max_downscale_factor;
@@ -901,6 +1129,9 @@
 struct vop2_vp_data {
 	u32 feature;
 	u8 pre_scan_max_dly;
+	u8 layer_mix_dly;
+	u8 hdr_mix_dly;
+	u8 win_dly;
 	u8 splice_vp_id;
 	struct vop_rect max_output;
 	u32 max_dclk;
@@ -936,8 +1167,18 @@
 	char dsc_error_info[50];
 };
 
+struct vop2_dump_regs {
+	u32 offset;
+	const char *name;
+	u32 state_base;
+	u32 state_mask;
+	u32 state_shift;
+	bool enable_state;
+};
+
 struct vop2_data {
 	u32 version;
+	u32 esmart_lb_mode;
 	struct vop2_vp_data *vp_data;
 	struct vop2_win_data *win_data;
 	struct vop2_vp_plane_mask *plane_mask;
@@ -946,6 +1187,8 @@
 	struct vop2_dsc_data *dsc;
 	struct dsc_error_info *dsc_error_ecw;
 	struct dsc_error_info *dsc_error_buffer_flow;
+	struct vop2_dump_regs *dump_regs;
+	u8 *vp_primary_plane_order;
 	u8 nr_vps;
 	u8 nr_layers;
 	u8 nr_mixers;
@@ -955,6 +1198,7 @@
 	u8 nr_dsc_ecw;
 	u8 nr_dsc_buffer_flow;
 	u32 reg_len;
+	u32 dump_regs_size;
 };
 
 struct vop2 {
@@ -966,12 +1210,22 @@
 	void *sys_pmu;
 	u32 reg_len;
 	u32 version;
+	u32 esmart_lb_mode;
 	bool global_init;
 	const struct vop2_data *data;
 	struct vop2_vp_plane_mask vp_plane_mask[VOP2_VP_MAX];
 };
 
 static struct vop2 *rockchip_vop2;
+
+static inline bool is_vop3(struct vop2 *vop2)
+{
+	if (vop2->version == VOP_VERSION_RK3568 || vop2->version == VOP_VERSION_RK3588)
+		return false;
+	else
+		return true;
+}
+
 /*
  * bli_sd_factor = (src - 1) / (dst - 1) << 12;
  * avg_sd_factor:
@@ -979,8 +1233,8 @@
  * bic_su_factor:
  * = (src - 1) / (dst - 1) << 16;
  *
- * gt2 enable: dst get one line from two line of the src
- * gt4 enable: dst get one line from four line of the src.
+ * ygt2 enable: dst get one line from two line of the src
+ * ygt4 enable: dst get one line from four line of the src.
  *
  */
 #define VOP2_BILI_SCL_DN(src, dst)	(((src - 1) << 12) / (dst - 1))
@@ -989,6 +1243,8 @@
 #define VOP2_BILI_SCL_FAC_CHECK(src, dst, fac)	 \
 				(fac * (dst - 1) >> 12 < (src - 1))
 #define VOP2_COMMON_SCL_FAC_CHECK(src, dst, fac) \
+				(fac * (dst - 1) >> 16 < (src - 1))
+#define VOP3_COMMON_HOR_SCL_FAC_CHECK(src, dst, fac) \
 				(fac * (dst - 1) >> 16 < (src - 1))
 
 static uint16_t vop2_scale_factor(enum scale_mode mode,
@@ -1030,6 +1286,51 @@
 	return fac;
 }
 
+static bool vop3_scale_up_fac_check(uint32_t src, uint32_t dst, uint32_t fac, bool is_hor)
+{
+	if (is_hor)
+		return VOP3_COMMON_HOR_SCL_FAC_CHECK(src, dst, fac);
+	return VOP2_COMMON_SCL_FAC_CHECK(src, dst, fac);
+}
+
+static uint16_t vop3_scale_factor(enum scale_mode mode,
+				  uint32_t src, uint32_t dst, bool is_hor)
+{
+	uint32_t fac = 0;
+	int i = 0;
+
+	if (mode == SCALE_NONE)
+		return 0;
+
+	/*
+	 * A workaround to avoid zero div.
+	 */
+	if ((dst == 1) || (src == 1)) {
+		dst = dst + 1;
+		src = src + 1;
+	}
+
+	if (mode == SCALE_DOWN) {
+		fac = VOP2_BILI_SCL_DN(src, dst);
+		for (i = 0; i < 100; i++) {
+			if (VOP2_BILI_SCL_FAC_CHECK(src, dst, fac))
+				break;
+			fac -= 1;
+			printf("down fac cali: src:%d, dst:%d, fac:0x%x\n", src, dst, fac);
+		}
+	} else {
+		fac = VOP2_COMMON_SCL(src, dst);
+		for (i = 0; i < 100; i++) {
+			if (vop3_scale_up_fac_check(src, dst, fac, is_hor))
+				break;
+			fac -= 1;
+			printf("up fac cali:  src:%d, dst:%d, fac:0x%x\n", src, dst, fac);
+		}
+	}
+
+	return fac;
+}
+
 static inline enum scale_mode scl_get_scl_mode(int src, int dst)
 {
 	if (src < dst)
@@ -1040,19 +1341,6 @@
 	return SCALE_NONE;
 }
 
-static u8 rk3588_vop2_vp_primary_plane_order[VOP2_VP_MAX] = {
-	ROCKCHIP_VOP2_ESMART0,
-	ROCKCHIP_VOP2_ESMART1,
-	ROCKCHIP_VOP2_ESMART2,
-	ROCKCHIP_VOP2_ESMART3,
-};
-
-static u8 rk3568_vop2_vp_primary_plane_order[VOP2_VP_MAX] = {
-	ROCKCHIP_VOP2_SMART0,
-	ROCKCHIP_VOP2_SMART1,
-	ROCKCHIP_VOP2_ESMART1,
-};
-
 static inline int interpolate(int x1, int y1, int x2, int y2, int x)
 {
 	return y1 + (y2 - y1) * (x - x1) / (x2 - x1);
@@ -1061,23 +1349,13 @@
 static int vop2_get_primary_plane(struct vop2 *vop2, u32 plane_mask)
 {
 	int i = 0;
-	u8 *vop2_vp_primary_plane_order;
-	u8 default_primary_plane;
 
-	if (vop2->version == VOP_VERSION_RK3588) {
-		vop2_vp_primary_plane_order = rk3588_vop2_vp_primary_plane_order;
-		default_primary_plane = ROCKCHIP_VOP2_ESMART0;
-	} else {
-		vop2_vp_primary_plane_order = rk3568_vop2_vp_primary_plane_order;
-		default_primary_plane = ROCKCHIP_VOP2_SMART0;
+	for (i = 0; i < vop2->data->nr_layers; i++) {
+		if (plane_mask & BIT(vop2->data->vp_primary_plane_order[i]))
+			return vop2->data->vp_primary_plane_order[i];
 	}
 
-	for (i = 0; i < vop2->data->nr_vps; i++) {
-		if (plane_mask & BIT(vop2_vp_primary_plane_order[i]))
-			return vop2_vp_primary_plane_order[i];
-	}
-
-	return default_primary_plane;
+	return vop2->data->vp_primary_plane_order[0];
 }
 
 static inline u16 scl_cal_scale(int src, int dst, int shift)
@@ -1210,6 +1488,7 @@
 	switch (bus_format) {
 	case MEDIA_BUS_FMT_YUV8_1X24:
 	case MEDIA_BUS_FMT_YUV10_1X30:
+	case MEDIA_BUS_FMT_YUYV10_1X20:
 	case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
 	case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
 	case MEDIA_BUS_FMT_YUYV8_2X8:
@@ -1226,7 +1505,7 @@
 	}
 }
 
-static int vop2_convert_csc_mode(int csc_mode)
+static int vop2_convert_csc_mode(int csc_mode, int bit_depth)
 {
 	switch (csc_mode) {
 	case V4L2_COLORSPACE_SMPTE170M:
@@ -1236,11 +1515,31 @@
 	case V4L2_COLORSPACE_REC709:
 	case V4L2_COLORSPACE_SMPTE240M:
 	case V4L2_COLORSPACE_DEFAULT:
-		return CSC_BT709L;
+		if (bit_depth == CSC_13BIT_DEPTH)
+			return CSC_BT709L_13BIT;
+		else
+			return CSC_BT709L;
 	case V4L2_COLORSPACE_JPEG:
 		return CSC_BT601F;
 	case V4L2_COLORSPACE_BT2020:
-		return CSC_BT2020;
+		if (bit_depth == CSC_13BIT_DEPTH)
+			return CSC_BT2020L_13BIT;
+		else
+			return CSC_BT2020;
+	case V4L2_COLORSPACE_BT709F:
+		if (bit_depth == CSC_10BIT_DEPTH) {
+			printf("WARN: Unsupported bt709f at 10bit csc depth, use bt601f instead\n");
+			return CSC_BT601F;
+		} else {
+			return CSC_BT709F_13BIT;
+		}
+	case V4L2_COLORSPACE_BT2020F:
+		if (bit_depth == CSC_10BIT_DEPTH) {
+			printf("WARN: Unsupported bt2020f at 10bit csc depth, use bt601f instead\n");
+			return CSC_BT601F;
+		} else {
+			return CSC_BT2020F_13BIT;
+		}
 	default:
 		return CSC_BT709L;
 	}
@@ -1265,6 +1564,19 @@
 	     bus_format == MEDIA_BUS_FMT_YUV10_1X30) &&
 	    (output_mode == ROCKCHIP_OUT_MODE_AAAA ||
 	     output_mode == ROCKCHIP_OUT_MODE_P888)))
+		return true;
+	else
+		return false;
+}
+
+static bool is_rb_swap(u32 bus_format, u32 output_mode)
+{
+	/*
+	 * The default component order of serial rgb3x8 formats
+	 * is BGR. So it is needed to enable RB swap.
+	 */
+	if (bus_format == MEDIA_BUS_FMT_SRGB888_3X8 ||
+	    bus_format == MEDIA_BUS_FMT_SRGB888_DUMMY_4X8)
 		return true;
 	else
 		return false;
@@ -1533,7 +1845,7 @@
 			cstate->post_y2r_en = 1;
 	}
 
-	cstate->post_csc_mode = vop2_convert_csc_mode(conn_state->color_space);
+	cstate->post_csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_10BIT_DEPTH);
 
 	if (cstate->feature & VOP_FEATURE_OUTPUT_10BIT)
 		brightness = interpolate(0, -128, 100, 127,
@@ -1578,7 +1890,7 @@
 	u16 hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
 
 	bg_ovl_dly = cstate->crtc->vps[crtc_id].bg_ovl_dly;
-	bg_dly =  vop2->data->vp_data[crtc_id].pre_scan_max_dly;
+	bg_dly = vop2->data->vp_data[crtc_id].pre_scan_max_dly;
 	bg_dly -= bg_ovl_dly;
 
 	if (cstate->splice_mode)
@@ -1590,6 +1902,33 @@
 		hsync_len = 8;
 	pre_scan_dly = (pre_scan_dly << 16) | hsync_len;
 	vop2_mask_write(vop2, RK3568_VP0_BG_MIX_CTRL + crtc_id * 4,
+			BG_MIX_CTRL_MASK, BG_MIX_CTRL_SHIFT, bg_dly, false);
+	vop2_writel(vop2, RK3568_VP0_PRE_SCAN_HTIMING + (crtc_id * 0x100), pre_scan_dly);
+}
+
+static void vop3_setup_pipe_dly(struct display_state *state, struct vop2 *vop2, int crtc_id)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2_win_data *win_data;
+	u32 bg_dly, pre_scan_dly;
+	u16 hdisplay = mode->crtc_hdisplay;
+	u16 hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
+	u8 primary_plane_id = vop2->vp_plane_mask[cstate->crtc_id].primary_plane_id;
+	u8 win_id;
+
+	win_data = vop2_find_win_by_phys_id(vop2, primary_plane_id);
+	win_id = atoi(&win_data->name[strlen(win_data->name) - 1]);
+	vop2_mask_write(vop2, RK3528_OVL_SYS_ESMART0_CTRL + win_id * 4,
+			ESMART_DLY_NUM_MASK, ESMART_DLY_NUM_SHIFT, 0, false);
+
+	bg_dly = vop2->data->vp_data[crtc_id].win_dly +
+		 vop2->data->vp_data[crtc_id].layer_mix_dly +
+		 vop2->data->vp_data[crtc_id].hdr_mix_dly;
+	pre_scan_dly = bg_dly + (hdisplay >> 1) - 1;
+	pre_scan_dly = (pre_scan_dly << 16) | hsync_len;
+	vop2_mask_write(vop2, RK3528_OVL_PORT0_BG_MIX_CTRL + crtc_id * 0x100,
 			BG_MIX_CTRL_MASK, BG_MIX_CTRL_SHIFT, bg_dly, false);
 	vop2_writel(vop2, RK3568_VP0_PRE_SCAN_HTIMING + (crtc_id * 0x100), pre_scan_dly);
 }
@@ -1644,9 +1983,176 @@
 		vop2_writel(vop2, RK3568_VP0_POST_DSP_VACT_INFO_F1 + vp_offset, val);
 	}
 
-	vop2_setup_dly_for_vp(state, vop2, cstate->crtc_id);
-	if (cstate->splice_mode)
-		vop2_setup_dly_for_vp(state, vop2, cstate->splice_crtc_id);
+	if (is_vop3(vop2)) {
+		vop3_setup_pipe_dly(state, vop2, cstate->crtc_id);
+	} else {
+		vop2_setup_dly_for_vp(state, vop2, cstate->crtc_id);
+		if (cstate->splice_mode)
+			vop2_setup_dly_for_vp(state, vop2, cstate->splice_crtc_id);
+	}
+}
+
+static void vop3_post_acm_config(struct display_state *state, struct vop2 *vop2)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct crtc_state *cstate = &state->crtc_state;
+	struct acm_data *acm = &conn_state->disp_info->acm_data;
+	struct drm_display_mode *mode = &conn_state->mode;
+	u32 vp_offset = (cstate->crtc_id * 0x100);
+	s16 *lut_y;
+	s16 *lut_h;
+	s16 *lut_s;
+	u32 value;
+	int i;
+
+	vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset,
+		POST_ACM_BYPASS_EN_MASK, POST_ACM_BYPASS_EN_SHIFT, 0, false);
+	if (!acm->acm_enable) {
+		writel(0, vop2->regs + RK3528_ACM_CTRL);
+		return;
+	}
+
+	printf("post acm enable\n");
+
+	writel(1, vop2->regs + RK3528_ACM_FETCH_START);
+
+	value = (acm->acm_enable & 0x1) + ((mode->hdisplay & 0xfff) << 8) +
+		((mode->vdisplay & 0xfff) << 20);
+	writel(value, vop2->regs + RK3528_ACM_CTRL);
+
+	value = (acm->y_gain & 0x3ff) + ((acm->h_gain << 10) & 0xffc00) +
+		((acm->s_gain << 20) & 0x3ff00000);
+	writel(value, vop2->regs + RK3528_ACM_DELTA_RANGE);
+
+	lut_y = &acm->gain_lut_hy[0];
+	lut_h = &acm->gain_lut_hy[ACM_GAIN_LUT_HY_LENGTH];
+	lut_s = &acm->gain_lut_hy[ACM_GAIN_LUT_HY_LENGTH * 2];
+	for (i = 0; i < ACM_GAIN_LUT_HY_LENGTH; i++) {
+		value = (lut_y[i] & 0xff) + ((lut_h[i] << 8) & 0xff00) +
+			((lut_s[i] << 16) & 0xff0000);
+		writel(value, vop2->regs + RK3528_ACM_YHS_DEL_HY_SEG0 + (i << 2));
+	}
+
+	lut_y = &acm->gain_lut_hs[0];
+	lut_h = &acm->gain_lut_hs[ACM_GAIN_LUT_HS_LENGTH];
+	lut_s = &acm->gain_lut_hs[ACM_GAIN_LUT_HS_LENGTH * 2];
+	for (i = 0; i < ACM_GAIN_LUT_HS_LENGTH; i++) {
+		value = (lut_y[i] & 0xff) + ((lut_h[i] << 8) & 0xff00) +
+			((lut_s[i] << 16) & 0xff0000);
+		writel(value, vop2->regs + RK3528_ACM_YHS_DEL_HS_SEG0 + (i << 2));
+	}
+
+	lut_y = &acm->delta_lut_h[0];
+	lut_h = &acm->delta_lut_h[ACM_DELTA_LUT_H_LENGTH];
+	lut_s = &acm->delta_lut_h[ACM_DELTA_LUT_H_LENGTH * 2];
+	for (i = 0; i < ACM_DELTA_LUT_H_LENGTH; i++) {
+		value = (lut_y[i] & 0x3ff) + ((lut_h[i] << 12) & 0xff000) +
+			((lut_s[i] << 20) & 0x3ff00000);
+		writel(value, vop2->regs + RK3528_ACM_YHS_DEL_HGAIN_SEG0 + (i << 2));
+	}
+
+	writel(1, vop2->regs + RK3528_ACM_FETCH_DONE);
+}
+
+static void vop3_post_csc_config(struct display_state *state, struct vop2 *vop2)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct crtc_state *cstate = &state->crtc_state;
+	struct acm_data *acm = &conn_state->disp_info->acm_data;
+	struct csc_info *csc = &conn_state->disp_info->csc_info;
+	struct post_csc_coef csc_coef;
+	bool is_input_yuv = false;
+	bool is_output_yuv = false;
+	bool post_r2y_en = false;
+	bool post_csc_en = false;
+	u32 vp_offset = (cstate->crtc_id * 0x100);
+	u32 value;
+	int range_type;
+
+	printf("post csc enable\n");
+
+	if (acm->acm_enable) {
+		if (!cstate->yuv_overlay)
+			post_r2y_en = true;
+
+		/* do y2r in csc module */
+		if (!is_yuv_output(conn_state->bus_format))
+			post_csc_en = true;
+	} else {
+		if (!cstate->yuv_overlay && is_yuv_output(conn_state->bus_format))
+			post_r2y_en = true;
+
+		/* do y2r in csc module */
+		if (cstate->yuv_overlay && !is_yuv_output(conn_state->bus_format))
+			post_csc_en = true;
+	}
+
+	if (csc->csc_enable)
+		post_csc_en = true;
+
+	if (cstate->yuv_overlay || post_r2y_en)
+		is_input_yuv = true;
+
+	if (is_yuv_output(conn_state->bus_format))
+		is_output_yuv = true;
+
+	cstate->post_csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_13BIT_DEPTH);
+
+	if (post_csc_en) {
+		rockchip_calc_post_csc(csc, &csc_coef, cstate->post_csc_mode, is_input_yuv,
+				       is_output_yuv);
+
+		vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset,
+				POST_CSC_COE00_MASK, POST_CSC_COE00_SHIFT,
+				csc_coef.csc_coef00, false);
+		value = csc_coef.csc_coef01 & 0xffff;
+		value |= (csc_coef.csc_coef02 << 16) & 0xffff0000;
+		writel(value, vop2->regs + RK3528_VP0_CSC_COE01_02);
+		value = csc_coef.csc_coef10 & 0xffff;
+		value |= (csc_coef.csc_coef11 << 16) & 0xffff0000;
+		writel(value, vop2->regs + RK3528_VP0_CSC_COE10_11);
+		value = csc_coef.csc_coef12 & 0xffff;
+		value |= (csc_coef.csc_coef20 << 16) & 0xffff0000;
+		writel(value, vop2->regs + RK3528_VP0_CSC_COE12_20);
+		value = csc_coef.csc_coef21 & 0xffff;
+		value |= (csc_coef.csc_coef22 << 16) & 0xffff0000;
+		writel(value, vop2->regs + RK3528_VP0_CSC_COE21_22);
+		writel(csc_coef.csc_dc0, vop2->regs + RK3528_VP0_CSC_OFFSET0);
+		writel(csc_coef.csc_dc1, vop2->regs + RK3528_VP0_CSC_OFFSET1);
+		writel(csc_coef.csc_dc2, vop2->regs + RK3528_VP0_CSC_OFFSET2);
+
+		range_type = csc_coef.range_type ? 0 : 1;
+		range_type <<= is_input_yuv ? 0 : 1;
+		vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset,
+				POST_CSC_MODE_MASK, POST_CSC_MODE_SHIFT, range_type, false);
+	}
+
+	vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset,
+			POST_R2Y_EN_MASK, POST_R2Y_EN_SHIFT, post_r2y_en ? 1 : 0, false);
+	vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset,
+			POST_CSC_EN_MASK, POST_CSC_EN_SHIFT, post_csc_en ? 1 : 0, false);
+	vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset,
+			POST_R2Y_MODE_MASK, POST_R2Y_MODE_SHIFT, cstate->post_csc_mode, false);
+}
+
+static void vop3_post_config(struct display_state *state, struct vop2 *vop2)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct base2_disp_info *disp_info = conn_state->disp_info;
+	const char *enable_flag;
+	if (!disp_info) {
+		printf("disp_info is empty\n");
+		return;
+	}
+
+	enable_flag = (const char *)&disp_info->cacm_header;
+	if (strncasecmp(enable_flag, "CACM", 4)) {
+		printf("acm and csc is not support\n");
+		return;
+	}
+
+	vop3_post_acm_config(state, vop2);
+	vop3_post_csc_config(state, vop2);
 }
 
 /*
@@ -1731,112 +2237,55 @@
 		vop2->regsbak[i] = base[i];
 }
 
-static void vop2_global_initial(struct vop2 *vop2, struct display_state *state)
+static void vop3_overlay_init(struct vop2 *vop2, struct display_state *state)
+{
+	struct vop2_win_data *win_data;
+	int layer_phy_id = 0;
+	int i, j;
+	u32 ovl_port_offset = 0;
+	u32 layer_nr = 0;
+	u8 shift = 0;
+
+	/* layer sel win id */
+	for (i = 0; i < vop2->data->nr_vps; i++) {
+		shift = 0;
+		ovl_port_offset = 0x100 * i;
+		layer_nr = vop2->vp_plane_mask[i].attached_layers_nr;
+		for (j = 0; j < layer_nr; j++) {
+			layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j];
+			win_data = vop2_find_win_by_phys_id(vop2, layer_phy_id);
+			vop2_mask_write(vop2, RK3528_OVL_PORT0_LAYER_SEL + ovl_port_offset, LAYER_SEL_MASK,
+					shift, win_data->layer_sel_win_id[i], false);
+			shift += 4;
+		}
+	}
+
+	/* win sel port */
+	for (i = 0; i < vop2->data->nr_vps; i++) {
+		layer_nr = vop2->vp_plane_mask[i].attached_layers_nr;
+		for (j = 0; j < layer_nr; j++) {
+			if (!vop2->vp_plane_mask[i].attached_layers[j])
+				continue;
+			layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j];
+			win_data = vop2_find_win_by_phys_id(vop2, layer_phy_id);
+			shift = win_data->win_sel_port_offset * 2;
+			vop2_mask_write(vop2, RK3528_OVL_SYS_PORT_SEL_IMD, LAYER_SEL_PORT_MASK,
+					shift, i, false);
+		}
+	}
+}
+
+static void vop2_overlay_init(struct vop2 *vop2, struct display_state *state)
 {
 	struct crtc_state *cstate = &state->crtc_state;
-	int i, j, port_mux = 0, total_used_layer = 0;
-	u8 shift = 0;
-	int layer_phy_id = 0;
-	u32 layer_nr = 0;
 	struct vop2_win_data *win_data;
-	struct vop2_vp_plane_mask *plane_mask;
+	int layer_phy_id = 0;
+	int total_used_layer = 0;
+	int port_mux = 0;
+	int i, j;
+	u32 layer_nr = 0;
+	u8 shift = 0;
 
-	if (vop2->global_init)
-		return;
-
-	/* OTP must enable at the first time, otherwise mirror layer register is error */
-	if (soc_is_rk3566())
-		vop2_mask_write(vop2, RK3568_SYS_OTP_WIN_EN, EN_MASK,
-				OTP_WIN_EN_SHIFT, 1, false);
-
-	if (cstate->crtc->assign_plane) {/* dts assign plane */
-		u32 plane_mask;
-		int primary_plane_id;
-
-		for (i = 0; i < vop2->data->nr_vps; i++) {
-			plane_mask = cstate->crtc->vps[i].plane_mask;
-			vop2->vp_plane_mask[i].plane_mask = plane_mask;
-			layer_nr = hweight32(plane_mask); /* use bitmap to store plane mask */
-			vop2->vp_plane_mask[i].attached_layers_nr = layer_nr;
-			primary_plane_id = cstate->crtc->vps[i].primary_plane_id;
-			if (primary_plane_id < 0)
-				primary_plane_id = vop2_get_primary_plane(vop2, plane_mask);
-			vop2->vp_plane_mask[i].primary_plane_id = primary_plane_id;
-			vop2->vp_plane_mask[i].plane_mask = plane_mask;
-
-			/* plane mask[bitmap] convert into layer phy id[enum vop2_layer_phy_id]*/
-			for (j = 0; j < layer_nr; j++) {
-				vop2->vp_plane_mask[i].attached_layers[j] = ffs(plane_mask) - 1;
-				plane_mask &= ~BIT(vop2->vp_plane_mask[i].attached_layers[j]);
-			}
-		}
-	} else {/* need soft assign plane mask */
-		/* find the first unplug devices and set it as main display */
-		int main_vp_index = -1;
-		int active_vp_num = 0;
-
-		for (i = 0; i < vop2->data->nr_vps; i++) {
-			if (cstate->crtc->vps[i].enable)
-				active_vp_num++;
-		}
-		printf("VOP have %d active VP\n", active_vp_num);
-
-		if (soc_is_rk3566() && active_vp_num > 2)
-			printf("ERROR: rk3566 only support 2 display output!!\n");
-		plane_mask = vop2->data->plane_mask;
-		plane_mask += (active_vp_num - 1) * VOP2_VP_MAX;
-
-		for (i = 0; i < vop2->data->nr_vps; i++) {
-			if (!is_hot_plug_devices(cstate->crtc->vps[i].output_type)) {
-				vop2->vp_plane_mask[i] = plane_mask[0]; /* the first store main display plane mask*/
-				main_vp_index = i;
-				break;
-			}
-		}
-
-		/* if no find unplug devices, use vp0 as main display */
-		if (main_vp_index < 0) {
-			main_vp_index = 0;
-			vop2->vp_plane_mask[0] = plane_mask[0];
-		}
-
-		j = 1; /* plane_mask[0] store main display, so we from plane_mask[1] */
-
-		/* init other display except main display */
-		for (i = 0; i < vop2->data->nr_vps; i++) {
-			if (i == main_vp_index || !cstate->crtc->vps[i].enable) /* main display or no connect devices */
-				continue;
-			vop2->vp_plane_mask[i] = plane_mask[j++];
-		}
-
-		/* store plane mask for vop2_fixup_dts */
-		for (i = 0; i < vop2->data->nr_vps; i++) {
-			layer_nr = vop2->vp_plane_mask[i].attached_layers_nr;
-			for (j = 0; j < layer_nr; j++) {
-				layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j];
-				vop2->vp_plane_mask[i].plane_mask |= BIT(layer_phy_id);
-			}
-		}
-	}
-
-	if (vop2->version == VOP_VERSION_RK3588)
-		rk3588_vop2_regsbak(vop2);
-	else
-		memcpy(vop2->regsbak, vop2->regs, vop2->reg_len);
-
-	vop2_mask_write(vop2, RK3568_OVL_CTRL, EN_MASK,
-			OVL_PORT_MUX_REG_DONE_IMD_SHIFT, 1, false);
-	vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
-			IF_CTRL_REG_DONE_IMD_SHIFT, 1, false);
-
-	for (i = 0; i < vop2->data->nr_vps; i++) {
-		printf("vp%d have layer nr:%d[", i, vop2->vp_plane_mask[i].attached_layers_nr);
-		for (j = 0; j < vop2->vp_plane_mask[i].attached_layers_nr; j++)
-			printf("%d ", vop2->vp_plane_mask[i].attached_layers[j]);
-		printf("], primary plane: %d\n", vop2->vp_plane_mask[i].primary_plane_id);
-	}
-
-	shift = 0;
 	/* layer sel win id */
 	for (i = 0; i < vop2->data->nr_vps; i++) {
 		layer_nr = vop2->vp_plane_mask[i].attached_layers_nr;
@@ -1844,7 +2293,7 @@
 			layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j];
 			win_data = vop2_find_win_by_phys_id(vop2, layer_phy_id);
 			vop2_mask_write(vop2, RK3568_OVL_LAYER_SEL, LAYER_SEL_MASK,
-					shift, win_data->layer_sel_win_id, false);
+					shift, win_data->layer_sel_win_id[i], false);
 			shift += 4;
 		}
 	}
@@ -1882,6 +2331,190 @@
 		vop2_mask_write(vop2, RK3568_OVL_PORT_SEL, PORT_MUX_MASK,
 				PORT_MUX_SHIFT + shift, port_mux, false);
 	}
+}
+
+static bool vop3_ignore_plane(struct vop2 *vop2, struct vop2_win_data *win)
+{
+	if (!is_vop3(vop2))
+		return false;
+
+	if (vop2->esmart_lb_mode == VOP3_ESMART_8K_MODE &&
+	    win->phys_id != ROCKCHIP_VOP2_ESMART0)
+		return true;
+	else if (vop2->esmart_lb_mode == VOP3_ESMART_4K_4K_MODE &&
+		 (win->phys_id == ROCKCHIP_VOP2_ESMART1 || win->phys_id == ROCKCHIP_VOP2_ESMART3))
+		return true;
+	else if (vop2->esmart_lb_mode == VOP3_ESMART_4K_2K_2K_MODE &&
+		 win->phys_id == ROCKCHIP_VOP2_ESMART1)
+		return true;
+	else
+		return false;
+}
+
+static void vop3_init_esmart_scale_engine(struct vop2 *vop2)
+{
+	struct vop2_win_data *win_data;
+	int i;
+	u8 scale_engine_num = 0;
+
+	/* store plane mask for vop2_fixup_dts */
+	for (i = 0; i < vop2->data->nr_layers; i++) {
+		win_data = &vop2->data->win_data[i];
+		if (win_data->type == CLUSTER_LAYER || vop3_ignore_plane(vop2, win_data))
+			continue;
+
+		win_data->scale_engine_num = scale_engine_num++;
+	}
+}
+
+static void vop2_global_initial(struct vop2 *vop2, struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2_vp_plane_mask *plane_mask;
+	int layer_phy_id = 0;
+	int i, j;
+	int ret;
+	u32 layer_nr = 0;
+
+	if (vop2->global_init)
+		return;
+
+	/* OTP must enable at the first time, otherwise mirror layer register is error */
+	if (soc_is_rk3566())
+		vop2_mask_write(vop2, RK3568_SYS_OTP_WIN_EN, EN_MASK,
+				OTP_WIN_EN_SHIFT, 1, false);
+
+	if (cstate->crtc->assign_plane) {/* dts assign plane */
+		u32 plane_mask;
+		int primary_plane_id;
+
+		for (i = 0; i < vop2->data->nr_vps; i++) {
+			plane_mask = cstate->crtc->vps[i].plane_mask;
+			vop2->vp_plane_mask[i].plane_mask = plane_mask;
+			layer_nr = hweight32(plane_mask); /* use bitmap to store plane mask */
+			vop2->vp_plane_mask[i].attached_layers_nr = layer_nr;
+			primary_plane_id = cstate->crtc->vps[i].primary_plane_id;
+			if (primary_plane_id >= ROCKCHIP_VOP2_LAYER_MAX)
+				primary_plane_id = vop2_get_primary_plane(vop2, plane_mask);
+			vop2->vp_plane_mask[i].primary_plane_id = primary_plane_id;
+			vop2->vp_plane_mask[i].plane_mask = plane_mask;
+
+			/* plane mask[bitmap] convert into layer phy id[enum vop2_layer_phy_id]*/
+			for (j = 0; j < layer_nr; j++) {
+				vop2->vp_plane_mask[i].attached_layers[j] = ffs(plane_mask) - 1;
+				plane_mask &= ~BIT(vop2->vp_plane_mask[i].attached_layers[j]);
+			}
+		}
+	} else {/* need soft assign plane mask */
+		/* find the first unplug devices and set it as main display */
+		int main_vp_index = -1;
+		int active_vp_num = 0;
+
+		for (i = 0; i < vop2->data->nr_vps; i++) {
+			if (cstate->crtc->vps[i].enable)
+				active_vp_num++;
+		}
+		printf("VOP have %d active VP\n", active_vp_num);
+
+		if (soc_is_rk3566() && active_vp_num > 2)
+			printf("ERROR: rk3566 only support 2 display output!!\n");
+		plane_mask = vop2->data->plane_mask;
+		plane_mask += (active_vp_num - 1) * VOP2_VP_MAX;
+		/*
+		 * For rk3528, one display policy for hdmi store in plane_mask[0], and the other
+		 * for cvbs store in plane_mask[2].
+		 */
+		if (vop2->version == VOP_VERSION_RK3528 && active_vp_num == 1 &&
+		    cstate->crtc->vps[1].output_type == DRM_MODE_CONNECTOR_TV)
+			plane_mask += 2 * VOP2_VP_MAX;
+
+		if (vop2->version == VOP_VERSION_RK3528) {
+			/*
+			 * For rk3528, the plane mask of vp is limited, only esmart2 can be selected
+			 * by both vp0 and vp1.
+			 */
+			j = 0;
+		} else {
+			for (i = 0; i < vop2->data->nr_vps; i++) {
+				if (!is_hot_plug_devices(cstate->crtc->vps[i].output_type)) {
+					vop2->vp_plane_mask[i] = plane_mask[0]; /* the first store main display plane mask*/
+					main_vp_index = i;
+					break;
+				}
+			}
+
+			/* if no find unplug devices, use vp0 as main display */
+			if (main_vp_index < 0) {
+				main_vp_index = 0;
+				vop2->vp_plane_mask[0] = plane_mask[0];
+			}
+
+			j = 1; /* plane_mask[0] store main display, so we from plane_mask[1] */
+		}
+
+		/* init other display except main display */
+		for (i = 0; i < vop2->data->nr_vps; i++) {
+			if (i == main_vp_index || !cstate->crtc->vps[i].enable) /* main display or no connect devices */
+				continue;
+			vop2->vp_plane_mask[i] = plane_mask[j++];
+		}
+
+		/* store plane mask for vop2_fixup_dts */
+		for (i = 0; i < vop2->data->nr_vps; i++) {
+			layer_nr = vop2->vp_plane_mask[i].attached_layers_nr;
+			for (j = 0; j < layer_nr; j++) {
+				layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j];
+				vop2->vp_plane_mask[i].plane_mask |= BIT(layer_phy_id);
+			}
+		}
+	}
+
+	if (vop2->version == VOP_VERSION_RK3588)
+		rk3588_vop2_regsbak(vop2);
+	else
+		memcpy(vop2->regsbak, vop2->regs, vop2->reg_len);
+
+	vop2_mask_write(vop2, RK3568_OVL_CTRL, EN_MASK,
+			OVL_PORT_MUX_REG_DONE_IMD_SHIFT, 1, false);
+	vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
+			IF_CTRL_REG_DONE_IMD_SHIFT, 1, false);
+
+	for (i = 0; i < vop2->data->nr_vps; i++) {
+		printf("vp%d have layer nr:%d[", i, vop2->vp_plane_mask[i].attached_layers_nr);
+		for (j = 0; j < vop2->vp_plane_mask[i].attached_layers_nr; j++)
+			printf("%d ", vop2->vp_plane_mask[i].attached_layers[j]);
+		printf("], primary plane: %d\n", vop2->vp_plane_mask[i].primary_plane_id);
+	}
+
+	if (is_vop3(vop2))
+		vop3_overlay_init(vop2, state);
+	else
+		vop2_overlay_init(vop2, state);
+
+	if (is_vop3(vop2)) {
+		/*
+		 * you can rewrite at dts vop node:
+		 *
+		 * VOP3_ESMART_8K_MODE = 0,
+		 * VOP3_ESMART_4K_4K_MODE = 1,
+		 * VOP3_ESMART_4K_2K_2K_MODE = 2,
+		 * VOP3_ESMART_2K_2K_2K_2K_MODE = 3,
+		 *
+		 * &vop {
+		 * 	esmart_lb_mode = /bits/ 8 <2>;
+		 * };
+		 */
+		ret = ofnode_read_u32(cstate->node, "esmart_lb_mode", &vop2->esmart_lb_mode);
+		if (ret < 0)
+			vop2->esmart_lb_mode = vop2->data->esmart_lb_mode;
+		vop2_mask_write(vop2, RK3568_SYS_LUT_PORT_SEL, ESMART_LB_MODE_SEL_MASK,
+				ESMART_LB_MODE_SEL_SHIFT, vop2->esmart_lb_mode, false);
+
+		vop3_init_esmart_scale_engine(vop2);
+
+		vop2_mask_write(vop2, RK3568_SYS_AXI_LUT_CTRL, EN_MASK,
+				DSP_VS_T_SEL_SHIFT, 0, false);
+	}
 
 	if (vop2->version == VOP_VERSION_RK3568)
 		vop2_writel(vop2, RK3568_AUTO_GATING_CTRL, 0);
@@ -1891,14 +2524,6 @@
 
 static int vop2_initial(struct vop2 *vop2, struct display_state *state)
 {
-	struct crtc_state *cstate = &state->crtc_state;
-	int ret;
-
-	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
-	ret = clk_set_defaults(cstate->dev);
-	if (ret)
-		debug("%s clk_set_defaults failed %d\n", __func__, ret);
-
 	rockchip_vop2_gamma_lut_init(vop2, state);
 	rockchip_vop2_cubic_lut_init(vop2, state);
 
@@ -1918,12 +2543,17 @@
 		rockchip_vop2 = calloc(1, sizeof(struct vop2));
 		if (!rockchip_vop2)
 			return -ENOMEM;
-		rockchip_vop2->regs = dev_read_addr_ptr(cstate->dev);
+		memset(rockchip_vop2, 0, sizeof(struct vop2));
 		rockchip_vop2->regsbak = malloc(RK3568_MAX_REG);
 		rockchip_vop2->reg_len = RK3568_MAX_REG;
+#ifdef CONFIG_SPL_BUILD
+		rockchip_vop2->regs = (void *)RK3528_VOP_BASE;
+#else
+		rockchip_vop2->regs = dev_read_addr_ptr(cstate->dev);
 		rockchip_vop2->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
 		if (rockchip_vop2->grf <= 0)
 			printf("%s: Get syscon grf failed (ret=%p)\n", __func__, rockchip_vop2->grf);
+#endif
 		rockchip_vop2->version = vop2_data->version;
 		rockchip_vop2->data = vop2_data;
 		if (rockchip_vop2->version == VOP_VERSION_RK3588) {
@@ -2021,11 +2651,12 @@
 		}
 
 		if (v_pixclk > VOP2_MAX_DCLK_RATE)
-			dclk_rate = vop2_calc_dclk(dclk_core_rate, vop2->data->vp_data->max_dclk);
+			dclk_rate = vop2_calc_dclk(dclk_core_rate,
+						   vop2->data->vp_data[cstate->crtc_id].max_dclk);
 
 		if (!dclk_rate) {
 			printf("DP if_pixclk_rate out of range(max_dclk: %d KHZ, dclk_core: %lld KHZ)\n",
-			       vop2->data->vp_data->max_dclk, if_pixclk_rate);
+			       vop2->data->vp_data[cstate->crtc_id].max_dclk, if_pixclk_rate);
 			return -EINVAL;
 		}
 		*if_pixclk_div = dclk_rate / if_pixclk_rate;
@@ -2045,10 +2676,11 @@
 		dclk_out_rate = v_pixclk >> 2;
 		dclk_out_rate = dclk_out_rate / K;
 
-		dclk_rate = vop2_calc_dclk(dclk_out_rate, vop2->data->vp_data->max_dclk);
+		dclk_rate = vop2_calc_dclk(dclk_out_rate,
+					   vop2->data->vp_data[cstate->crtc_id].max_dclk);
 		if (!dclk_rate) {
 			printf("DP dclk_core out of range(max_dclk: %d KHZ, dclk_core: %ld KHZ)\n",
-			       vop2->data->vp_data->max_dclk, dclk_core_rate);
+			       vop2->data->vp_data[cstate->crtc_id].max_dclk, dclk_core_rate);
 			return -EINVAL;
 		}
 		*dclk_out_div = dclk_rate / dclk_out_rate;
@@ -2064,21 +2696,22 @@
 		/* dclk_core = dclk_out * K = if_pixclk * K = v_pixclk / 4 */
 		dclk_out_rate = dclk_core_rate / K;
 		/* dclk_rate = N * dclk_core_rate N = (1,2,4 ), we get a little factor here */
-		dclk_rate = vop2_calc_dclk(dclk_out_rate, vop2->data->vp_data->max_dclk);
+		dclk_rate = vop2_calc_dclk(dclk_out_rate,
+					   vop2->data->vp_data[cstate->crtc_id].max_dclk);
 		if (!dclk_rate) {
 			printf("MIPI dclk out of range(max_dclk: %d KHZ, dclk_rate: %ld KHZ)\n",
-			       vop2->data->vp_data->max_dclk, dclk_rate);
+			       vop2->data->vp_data[cstate->crtc_id].max_dclk, dclk_rate);
 			return -EINVAL;
 		}
 
 		if (cstate->dsc_enable)
-			dclk_rate = dclk_rate >> 1;
+			dclk_rate /= cstate->dsc_slice_num;
 
 		*dclk_out_div = dclk_rate / dclk_out_rate;
 		*dclk_core_div = dclk_rate / dclk_core_rate;
 		*if_pixclk_div = 1;       /*mipi pixclk == dclk_out*/
 		if (cstate->dsc_enable)
-			*if_pixclk_div = dclk_out_rate / if_pixclk_rate;
+			*if_pixclk_div = dclk_out_rate * 1000LL / if_pixclk_rate;
 
 	} else if (output_type == DRM_MODE_CONNECTOR_DPI) {
 		dclk_rate = v_pixclk;
@@ -2098,7 +2731,7 @@
 	struct connector_state *conn_state = &state->conn_state;
 	struct drm_display_mode *mode = &conn_state->mode;
 	struct crtc_state *cstate = &state->crtc_state;
-	u64 v_pixclk = mode->clock; /* video timing pixclk */
+	u64 v_pixclk = mode->crtc_clock * 1000LL; /* video timing pixclk */
 	u8 k = 1;
 
 	if (conn_state->output_flags & ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE)
@@ -2201,8 +2834,7 @@
 
 		if (conn_state->hold_mode) {
 			vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
-					EN_MASK, EDPI_TE_EN, 1, false);
-
+					EN_MASK, EDPI_TE_EN, !cstate->soft_te, false);
 			vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
 					EN_MASK, EDPI_WMS_HOLD_EN, 1, false);
 		}
@@ -2227,14 +2859,8 @@
 				if_pixclk_div, false);
 
 		if (conn_state->hold_mode) {
-			/* UNDO: RK3588 VP1->DSC1->DSI1 only can support soft TE mode */
-			if (vop2->version == VOP_VERSION_RK3588 && val == 3)
-				vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
-						EN_MASK, EDPI_TE_EN, 0, false);
-			else
-				vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
-						EN_MASK, EDPI_TE_EN, 1, false);
-
+			vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
+					EN_MASK, EDPI_TE_EN, !cstate->soft_te, false);
 			vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
 					EN_MASK, EDPI_WMS_HOLD_EN, 1, false);
 		}
@@ -2371,7 +2997,7 @@
 	bool dclk_inv;
 	u32 val;
 
-	dclk_inv = (mode->flags & DRM_MODE_FLAG_PPIXDATA) ? 0 : 1;
+	dclk_inv = (conn_state->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0;
 	val = (mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : BIT(HSYNC_POSITIVE);
 	val |= (mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : BIT(VSYNC_POSITIVE);
 
@@ -2380,6 +3006,8 @@
 				1, false);
 		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
 				RGB_MUX_SHIFT, cstate->crtc_id, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_RGB_LVDS_PIN_POL_MASK,
+				IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false);
 		vop2_grf_writel(vop2, vop2->grf, RK3568_GRF_VO_CON1, EN_MASK,
 				GRF_RGB_DCLK_INV_SHIFT, dclk_inv);
 	}
@@ -2409,8 +3037,10 @@
 				1, false);
 		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
 				LVDS0_MUX_SHIFT, cstate->crtc_id, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_RGB_LVDS_PIN_POL_MASK,
+				IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false);
 		vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
-				IF_CRTL_RGB_LVDS_DCLK_POL_SHIT, dclk_inv, false);
+				IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT, dclk_inv, false);
 	}
 
 	if (conn_state->output_if & VOP_OUTPUT_IF_LVDS1) {
@@ -2418,8 +3048,10 @@
 				1, false);
 		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
 				LVDS1_MUX_SHIFT, cstate->crtc_id, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_RGB_LVDS_PIN_POL_MASK,
+				IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false);
 		vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
-				IF_CRTL_RGB_LVDS_DCLK_POL_SHIT, dclk_inv, false);
+				IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT, dclk_inv, false);
 	}
 
 	if (conn_state->output_flags &
@@ -2472,6 +3104,8 @@
 				EDP0_MUX_SHIFT, cstate->crtc_id, false);
 		vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
 				IF_CRTL_EDP_DCLK_POL_SHIT, dclk_inv, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_EDP_PIN_POL_MASK,
+				IF_CTRL_EDP_PIN_POL_SHIFT, val, false);
 	}
 
 	if (conn_state->output_if & VOP_OUTPUT_IF_HDMI0) {
@@ -2489,6 +3123,88 @@
 	return mode->clock;
 }
 
+static unsigned long rk3528_vop2_if_cfg(struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+	struct vop2 *vop2 = cstate->private;
+	u32 val;
+
+	val = (mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : BIT(HSYNC_POSITIVE);
+	val |= (mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : BIT(VSYNC_POSITIVE);
+
+	if (conn_state->output_if & VOP_OUTPUT_IF_BT656) {
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, BT656_EN_SHIFT,
+				1, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
+				RGB_MUX_SHIFT, cstate->crtc_id, false);
+	}
+
+	if (conn_state->output_if & VOP_OUTPUT_IF_HDMI0) {
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, HDMI0_EN_SHIFT,
+				1, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
+				HDMI0_MUX_SHIFT, cstate->crtc_id, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
+				IF_CRTL_HDMI_DCLK_POL_SHIT, 1, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL,
+				IF_CRTL_HDMI_PIN_POL_MASK,
+				IF_CRTL_HDMI_PIN_POL_SHIT, val, false);
+	}
+
+	return mode->crtc_clock;
+}
+
+static unsigned long rk3562_vop2_if_cfg(struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+	struct vop2 *vop2 = cstate->private;
+	bool dclk_inv;
+	u32 val;
+
+	dclk_inv = (conn_state->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0;
+	val = (mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : BIT(HSYNC_POSITIVE);
+	val |= (mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : BIT(VSYNC_POSITIVE);
+
+	if (conn_state->output_if & VOP_OUTPUT_IF_RGB) {
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, RGB_EN_SHIFT,
+				1, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
+				RGB_MUX_SHIFT, cstate->crtc_id, false);
+		vop2_grf_writel(vop2, vop2->grf, RK3562_GRF_IOC_VO_IO_CON, EN_MASK,
+				GRF_RGB_DCLK_INV_SHIFT, dclk_inv);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, RK3562_IF_PIN_POL_MASK,
+				IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false);
+	}
+
+	if (conn_state->output_if & VOP_OUTPUT_IF_LVDS0) {
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, LVDS0_EN_SHIFT,
+				1, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
+				LVDS0_MUX_SHIFT, cstate->crtc_id, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
+				IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT, dclk_inv, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, RK3562_IF_PIN_POL_MASK,
+				IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false);
+	}
+
+	if (conn_state->output_if & VOP_OUTPUT_IF_MIPI0) {
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, MIPI0_EN_SHIFT,
+				1, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK,
+				MIPI0_MUX_SHIFT, cstate->crtc_id, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK,
+				RK3562_MIPI_DCLK_POL_SHIFT, dclk_inv, false);
+		vop2_mask_write(vop2, RK3568_DSP_IF_POL, RK3562_IF_PIN_POL_MASK,
+				RK3562_MIPI_PIN_POL_SHIFT, val, false);
+	}
+
+	return mode->crtc_clock;
+}
+
 static void vop2_post_color_swap(struct display_state *state)
 {
 	struct crtc_state *cstate = &state->crtc_state;
@@ -2498,7 +3214,8 @@
 	u32 output_type = conn_state->type;
 	u32 data_swap = 0;
 
-	if (is_uv_swap(conn_state->bus_format, conn_state->output_mode))
+	if (is_uv_swap(conn_state->bus_format, conn_state->output_mode) ||
+	    is_rb_swap(conn_state->bus_format, conn_state->output_mode))
 		data_swap = DSP_RB_SWAP;
 
 	if (vop2->version == VOP_VERSION_RK3588 &&
@@ -2603,10 +3320,10 @@
 	u16 vact_end = vact_st + vdisplay;
 	u32 ctrl_regs_offset = (dsc_id * 0x30);
 	u32 decoder_regs_offset = (dsc_id * 0x100);
-	u32 backup_regs_offset = 0;
 	int dsc_txp_clk_div = 0;
 	int dsc_pxl_clk_div = 0;
 	int dsc_cds_clk_div = 0;
+	int val = 0;
 
 	if (!vop2->data->nr_dscs) {
 		printf("Unsupported DSC\n");
@@ -2678,21 +3395,42 @@
 		 * dly_num = delay_line_num * T(one-line) / T (dsc_cds)
 		 * T (one-line) = 1/v_pixclk_mhz * htotal = htotal/v_pixclk_mhz
 		 * T (dsc_cds) = 1 / dsc_cds_rate_mhz
+		 *
+		 * HDMI:
 		 * delay_line_num: according the pps initial_xmit_delay to adjust vop dsc delay
 		 *                 delay_line_num = 4 - BPP / 8
 		 *                                = (64 - target_bpp / 8) / 16
-		 *
 		 * dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * (64 - target_bpp / 8) / 16;
+		 *
+		 * MIPI DSI[4320 and 9216 is buffer size for DSC]:
+		 * DSC0:delay_line_num = 4320 * 8 / slince_num / chunk_size;
+		 *	delay_line_num = delay_line_num > 5 ? 5 : delay_line_num;
+		 * DSC1:delay_line_num = 9216 * 2 / slince_num / chunk_size;
+		 *	delay_line_num = delay_line_num > 5 ? 5 : delay_line_num;
+		 * dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * delay_line_num
 		 */
 		do_div(dsc_cds_rate, 1000000); /* hz to Mhz */
 		dsc_cds_rate_mhz = dsc_cds_rate;
-		dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * (64 - target_bpp / 8) / 16;
+		dsc_hsync = hsync_len / 2;
+		if (dsc_interface_mode == VOP_DSC_IF_HDMI) {
+			dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * (64 - target_bpp / 8) / 16;
+		} else {
+			int dsc_buf_size  = dsc_id == 0 ? 4320 * 8 : 9216 * 2;
+			int delay_line_num = dsc_buf_size / cstate->dsc_slice_num /
+					     be16_to_cpu(cstate->pps.chunk_size);
+
+			delay_line_num = delay_line_num > 5 ? 5 : delay_line_num;
+			dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * delay_line_num;
+
+			/* The dsc mipi video mode dsc_hsync minimum size is 8 pixels */
+			if (dsc_hsync < 8)
+				dsc_hsync = 8;
+		}
 		vop2_mask_write(vop2, RK3588_DSC_8K_INIT_DLY + ctrl_regs_offset, DSC_INIT_DLY_MODE_MASK,
 				DSC_INIT_DLY_MODE_SHIFT, 0, false);
 		vop2_mask_write(vop2, RK3588_DSC_8K_INIT_DLY + ctrl_regs_offset, DSC_INIT_DLY_NUM_MASK,
 				DSC_INIT_DLY_NUM_SHIFT, dly_num, false);
 
-		dsc_hsync = hsync_len / 2;
 		/*
 		 * htotal / dclk_core = dsc_htotal /cds_clk
 		 *
@@ -2724,34 +3462,15 @@
 	vop2_mask_write(vop2, RK3588_DSC_8K_RST + ctrl_regs_offset, RST_DEASSERT_MASK,
 			RST_DEASSERT_SHIFT, 1, false);
 	udelay(10);
-	/* read current dsc core register and backup to regsbak */
-	backup_regs_offset = RK3588_DSC_8K_CTRL0;
-	vop2->regsbak[backup_regs_offset >> 2] = vop2_readl(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset);
 
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_EN_SHIFT, 1, false);
+	val |= DSC_CTRL0_DEF_CON | (ilog2(cstate->dsc_slice_num) << DSC_NSLC_SHIFT) |
+	       ((dsc_sink_cap->version_minor == 2 ? 1 : 0) << DSC_IFEP_SHIFT);
+	vop2_writel(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, val);
+
 	vop2_load_pps(state, vop2, dsc_id);
 
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_RBIT_SHIFT, 1, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_RBYT_SHIFT, 0, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_FLAL_SHIFT, 1, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_MER_SHIFT, 1, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_EPB_SHIFT, 0, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_EPL_SHIFT, 1, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_NSLC_SHIFT, ilog2(cstate->dsc_slice_num), false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_SBO_SHIFT, 1, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_IFEP_SHIFT, dsc_sink_cap->version_minor == 2 ? 1 : 0, false);
-	vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK,
-			DSC_PPS_UPD_SHIFT, 1, false);
+	val |= (1 << DSC_PPS_UPD_SHIFT);
+	vop2_writel(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, val);
 
 	printf("DSC%d: txp:%lld div:%d, pxl:%lld div:%d, dsc:%lld div:%d\n",
 	       dsc_id,
@@ -2800,6 +3519,133 @@
 	return false;
 }
 
+static void vop3_mcu_mode_setup(struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2 *vop2 = cstate->private;
+	u32 vp_offset = (cstate->crtc_id * 0x100);
+
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+			MCU_TYPE_SHIFT, 1, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+			MCU_HOLD_MODE_SHIFT, 1, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_PIX_TOTAL_MASK,
+			MCU_PIX_TOTAL_SHIFT, cstate->mcu_timing.mcu_pix_total, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PST_MASK,
+			MCU_CS_PST_SHIFT, cstate->mcu_timing.mcu_cs_pst, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PEND_MASK,
+			MCU_CS_PEND_SHIFT, cstate->mcu_timing.mcu_cs_pend, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PST_MASK,
+			MCU_RW_PST_SHIFT, cstate->mcu_timing.mcu_rw_pst, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PEND_MASK,
+			MCU_RW_PEND_SHIFT, cstate->mcu_timing.mcu_rw_pend, false);
+}
+
+static void vop3_mcu_bypass_mode_setup(struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2 *vop2 = cstate->private;
+	u32 vp_offset = (cstate->crtc_id * 0x100);
+
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+			MCU_TYPE_SHIFT, 1, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+			MCU_HOLD_MODE_SHIFT, 1, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_PIX_TOTAL_MASK,
+			MCU_PIX_TOTAL_SHIFT, 53, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PST_MASK,
+			MCU_CS_PST_SHIFT, 6, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PEND_MASK,
+			MCU_CS_PEND_SHIFT, 48, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PST_MASK,
+			MCU_RW_PST_SHIFT, 12, false);
+	vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PEND_MASK,
+			MCU_RW_PEND_SHIFT, 30, false);
+}
+
+static int rockchip_vop2_send_mcu_cmd(struct display_state *state, u32 type, u32 value)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+	struct vop2 *vop2 = cstate->private;
+	u32 vp_offset = (cstate->crtc_id * 0x100);
+	u32 cfg_done = CFG_DONE_EN | BIT(cstate->crtc_id) | (BIT(cstate->crtc_id) << 16);
+
+	/*
+	 * 1.disable port dclk auto gating.
+	 * 2.set mcu bypass mode timing to adapt to the mode of sending cmds.
+	 * 3.make setting of output mode take effect.
+	 * 4.set dclk rate to 150M, in order to sync with hclk in sending cmds.
+	 */
+	if (type == MCU_SETBYPASS && value) {
+		vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK,
+				AUTO_GATING_EN_SHIFT, 0, false);
+		vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK,
+				PORT_DCLK_AUTO_GATING_EN_SHIFT, 0, false);
+		vop3_mcu_bypass_mode_setup(state);
+		vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
+				STANDBY_EN_SHIFT, 0, false);
+		vop2_writel(vop2, RK3568_REG_CFG_DONE, cfg_done);
+		vop2_clk_set_rate(&cstate->dclk, 150000000);
+	}
+
+	switch (type) {
+	case MCU_WRCMD:
+		vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+				MCU_RS_SHIFT, 0, false);
+		vop2_mask_write(vop2, RK3562_VP0_MCU_RW_BYPASS_PORT + vp_offset,
+				MCU_WRITE_DATA_BYPASS_MASK, MCU_WRITE_DATA_BYPASS_SHIFT,
+				value, false);
+		vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+				MCU_RS_SHIFT, 1, false);
+		break;
+	case MCU_WRDATA:
+		vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+				MCU_RS_SHIFT, 1, false);
+		vop2_mask_write(vop2, RK3562_VP0_MCU_RW_BYPASS_PORT + vp_offset,
+				MCU_WRITE_DATA_BYPASS_MASK, MCU_WRITE_DATA_BYPASS_SHIFT,
+				value, false);
+		break;
+	case MCU_SETBYPASS:
+		vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+				MCU_BYPASS_SHIFT, value ? 1 : 0, false);
+		break;
+	default:
+		break;
+	}
+
+	/*
+	 * 1.restore port dclk auto gating.
+	 * 2.restore mcu data mode timing.
+	 * 3.restore dclk rate to crtc_clock.
+	 */
+	if (type == MCU_SETBYPASS && !value) {
+		vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK,
+				AUTO_GATING_EN_SHIFT, 1, false);
+		vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK,
+				PORT_DCLK_AUTO_GATING_EN_SHIFT, 1, false);
+		vop3_mcu_mode_setup(state);
+		vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
+				STANDBY_EN_SHIFT, 1, false);
+		vop2_clk_set_rate(&cstate->dclk, mode->crtc_clock * 1000);
+	}
+
+	return 0;
+}
+
+static int vop2_get_vrefresh(struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+
+	if (cstate->mcu_timing.mcu_pix_total)
+		return mode->vrefresh / cstate->mcu_timing.mcu_pix_total;
+	else
+		return mode->vrefresh;
+}
+
 static int rockchip_vop2_init(struct display_state *state)
 {
 	struct crtc_state *cstate = &state->crtc_state;
@@ -2822,22 +3668,24 @@
 	u32 line_flag_offset = (cstate->crtc_id * 4);
 	u32 val, act_end;
 	u8 dither_down_en = 0;
+	u8 dither_down_mode = 0;
 	u8 pre_dither_down_en = 0;
 	u8 dclk_div_factor = 0;
 	char output_type_name[30] = {0};
+#ifndef CONFIG_SPL_BUILD
 	char dclk_name[9];
-	struct clk dclk;
+#endif
 	struct clk hdmi0_phy_pll;
 	struct clk hdmi1_phy_pll;
 	struct clk hdmi_phy_pll;
 	struct udevice *disp_dev;
-	unsigned long dclk_rate;
+	unsigned long dclk_rate = 0;
 	int ret;
 
 	printf("VOP update mode to: %dx%d%s%d, type:%s for VP%d\n",
 	       mode->crtc_hdisplay, mode->vdisplay,
 	       mode->flags & DRM_MODE_FLAG_INTERLACE ? "i" : "p",
-	       mode->vrefresh,
+	       vop2_get_vrefresh(state),
 	       get_output_if_name(conn_state->output_if, output_type_name),
 	       cstate->crtc_id);
 
@@ -2854,11 +3702,20 @@
 				PORT_MERGE_EN_SHIFT, 1, false);
 	}
 
+	vop2_mask_write(vop2, RK3588_SYS_VAR_FREQ_CTRL, EN_MASK,
+			RK3588_VP0_LINE_FLAG_OR_EN_SHIFT + cstate->crtc_id, 1, false);
+	vop2_mask_write(vop2, RK3588_SYS_VAR_FREQ_CTRL, EN_MASK,
+			RK3588_VP0_ALMOST_FULL_OR_EN_SHIFT + cstate->crtc_id, 1, false);
+
 	vop2_initial(vop2, state);
 	if (vop2->version == VOP_VERSION_RK3588)
 		dclk_rate = rk3588_vop2_if_cfg(state);
-	else
+	else if (vop2->version == VOP_VERSION_RK3568)
 		dclk_rate = rk3568_vop2_if_cfg(state);
+	else if (vop2->version == VOP_VERSION_RK3528)
+		dclk_rate = rk3528_vop2_if_cfg(state);
+	else if (vop2->version == VOP_VERSION_RK3562)
+		dclk_rate = rk3562_vop2_if_cfg(state);
 
 	if (conn_state->output_mode == ROCKCHIP_OUT_MODE_AAAA &&
 	    !(cstate->feature & VOP_FEATURE_OUTPUT_10BIT))
@@ -2872,12 +3729,16 @@
 	switch (conn_state->bus_format) {
 	case MEDIA_BUS_FMT_RGB565_1X16:
 		dither_down_en = 1;
+		dither_down_mode = RGB888_TO_RGB565;
+		pre_dither_down_en = 1;
 		break;
 	case MEDIA_BUS_FMT_RGB666_1X18:
 	case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
 	case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
 	case MEDIA_BUS_FMT_RGB666_1X7X3_JEIDA:
 		dither_down_en = 1;
+		dither_down_mode = RGB888_TO_RGB666;
+		pre_dither_down_en = 1;
 		break;
 	case MEDIA_BUS_FMT_YUV8_1X24:
 	case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
@@ -2886,23 +3747,28 @@
 		break;
 	case MEDIA_BUS_FMT_YUV10_1X30:
 	case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
-	case MEDIA_BUS_FMT_RGB888_1X24:
-	case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
-	case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
-	default:
 		dither_down_en = 0;
 		pre_dither_down_en = 0;
 		break;
+	case MEDIA_BUS_FMT_YUYV10_1X20:
+	case MEDIA_BUS_FMT_RGB888_1X24:
+	case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
+	case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
+	case MEDIA_BUS_FMT_RGB101010_1X30:
+	default:
+		dither_down_en = 0;
+		pre_dither_down_en = 1;
+		break;
 	}
 
-	if (conn_state->output_mode == ROCKCHIP_OUT_MODE_AAAA)
-		pre_dither_down_en = 0;
-	else
-		pre_dither_down_en = 1;
 	vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
 			DITHER_DOWN_EN_SHIFT, dither_down_en, false);
 	vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
+			DITHER_DOWN_MODE_SHIFT, dither_down_mode, false);
+	vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
 			PRE_DITHER_DOWN_EN_SHIFT, pre_dither_down_en, false);
+	vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
+			DITHER_DOWN_MODE_SHIFT, dither_down_mode, false);
 
 	yuv_overlay = is_yuv_output(conn_state->bus_format) ? 1 : 0;
 	vop2_mask_write(vop2, RK3568_OVL_CTRL, EN_MASK, cstate->crtc_id,
@@ -2946,15 +3812,13 @@
 	vop2_writel(vop2, RK3568_VP0_DSP_VTOTAL_VS_END + vp_offset,
 		    (vtotal << 16) | vsync_len);
 
-	if (vop2->version == VOP_VERSION_RK3568) {
-		if (mode->flags & DRM_MODE_FLAG_DBLCLK ||
-		    conn_state->output_if & VOP_OUTPUT_IF_BT656)
-			vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
-					CORE_DCLK_DIV_EN_SHIFT, 1, false);
-		else
-			vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
-					CORE_DCLK_DIV_EN_SHIFT, 0, false);
-	}
+	if (mode->flags & DRM_MODE_FLAG_DBLCLK ||
+	    conn_state->output_if & VOP_OUTPUT_IF_BT656)
+		vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
+				CORE_DCLK_DIV_EN_SHIFT, 1, false);
+	else
+		vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK,
+				CORE_DCLK_DIV_EN_SHIFT, 0, false);
 
 	if (conn_state->output_mode == ROCKCHIP_OUT_MODE_YUV420)
 		vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
@@ -2987,22 +3851,26 @@
 
 	vop2_tv_config_update(state, vop2);
 	vop2_post_config(state, vop2);
+	if (cstate->feature & (VOP_FEATURE_POST_ACM | VOP_FEATURE_POST_CSC))
+		vop3_post_config(state, vop2);
 
 	if (cstate->dsc_enable) {
 		if (conn_state->output_flags & ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE) {
-			vop2_dsc_enable(state, vop2, 0, dclk_rate);
-			vop2_dsc_enable(state, vop2, 1, dclk_rate);
+			vop2_dsc_enable(state, vop2, 0, dclk_rate * 1000LL);
+			vop2_dsc_enable(state, vop2, 1, dclk_rate * 1000LL);
 		} else {
-			vop2_dsc_enable(state, vop2, cstate->dsc_id, dclk_rate);
+			vop2_dsc_enable(state, vop2, cstate->dsc_id, dclk_rate * 1000LL);
 		}
 	}
 
+#ifndef CONFIG_SPL_BUILD
 	snprintf(dclk_name, sizeof(dclk_name), "dclk_vp%d", cstate->crtc_id);
-	ret = clk_get_by_name(cstate->dev, dclk_name, &dclk);
+	ret = clk_get_by_name(cstate->dev, dclk_name, &cstate->dclk);
 	if (ret) {
 		printf("%s: Failed to get dclk ret=%d\n", __func__, ret);
 		return ret;
 	}
+#endif
 
 	ret = uclass_get_device_by_name(UCLASS_VIDEO, "display-subsystem", &disp_dev);
 	if (!ret) {
@@ -3018,11 +3886,27 @@
 		debug("%s: Faile to find display-subsystem node\n", __func__);
 	}
 
+	if (vop2->version == VOP_VERSION_RK3528) {
+		struct ofnode_phandle_args args;
+
+		ret = dev_read_phandle_with_args(cstate->dev, "assigned-clock-parents",
+						 "#clock-cells", 0, 0, &args);
+		if (!ret) {
+			ret = uclass_find_device_by_ofnode(UCLASS_CLK, args.node, &hdmi0_phy_pll.dev);
+			if (ret) {
+				debug("warn: can't get clk device\n");
+				return ret;
+			}
+		} else {
+			debug("assigned-clock-parents's node not define\n");
+		}
+	}
+
 	if (mode->crtc_clock < VOP2_MAX_DCLK_RATE) {
 		if (conn_state->output_if & VOP_OUTPUT_IF_HDMI0)
-			vop2_clk_set_parent(&dclk, &hdmi0_phy_pll);
+			vop2_clk_set_parent(&cstate->dclk, &hdmi0_phy_pll);
 		else if (conn_state->output_if & VOP_OUTPUT_IF_HDMI1)
-			vop2_clk_set_parent(&dclk, &hdmi1_phy_pll);
+			vop2_clk_set_parent(&cstate->dclk, &hdmi1_phy_pll);
 
 		/*
 		 * uboot clk driver won't set dclk parent's rate when use
@@ -3035,16 +3919,28 @@
 		} else if ((conn_state->output_if & VOP_OUTPUT_IF_HDMI1) && hdmi1_phy_pll.dev) {
 			ret = vop2_clk_set_rate(&hdmi1_phy_pll, dclk_rate * 1000);
 		} else {
-			if (is_extend_pll(state, &hdmi_phy_pll.dev))
+			if (is_extend_pll(state, &hdmi_phy_pll.dev)) {
 				ret = vop2_clk_set_rate(&hdmi_phy_pll, dclk_rate * 1000);
-			else
-				ret = vop2_clk_set_rate(&dclk, dclk_rate * 1000);
+			} else {
+#ifndef CONFIG_SPL_BUILD
+				ret = vop2_clk_set_rate(&cstate->dclk, dclk_rate * 1000);
+#else
+				if (vop2->version == VOP_VERSION_RK3528) {
+					void *cru_base = (void *)RK3528_CRU_BASE;
+
+					/* dclk src switch to hdmiphy pll */
+					writel((BIT(0) << 16) | BIT(0), cru_base + 0x450);
+					rockchip_phy_set_pll(conn_state->connector->phy, dclk_rate * 1000);
+					ret = dclk_rate * 1000;
+				}
+#endif
+			}
 		}
 	} else {
 		if (is_extend_pll(state, &hdmi_phy_pll.dev))
 			ret = vop2_clk_set_rate(&hdmi_phy_pll, dclk_rate * 1000);
 		else
-			ret = vop2_clk_set_rate(&dclk, dclk_rate * 1000);
+			ret = vop2_clk_set_rate(&cstate->dclk, dclk_rate * 1000);
 	}
 
 	if (IS_ERR_VALUE(ret)) {
@@ -3053,7 +3949,11 @@
 		return ret;
 	} else {
 		dclk_div_factor = mode->clock / dclk_rate;
-		mode->crtc_clock = ret * dclk_div_factor / 1000;
+		if (vop2->version == VOP_VERSION_RK3528 &&
+		    conn_state->output_if & VOP_OUTPUT_IF_BT656)
+			mode->crtc_clock = ret / 4 / 1000;
+		else
+			mode->crtc_clock = ret * dclk_div_factor / 1000;
 		printf("VP%d set crtc_clock to %dKHz\n", cstate->crtc_id, mode->crtc_clock);
 	}
 
@@ -3061,6 +3961,9 @@
 			RK3568_DSP_LINE_FLAG_NUM0_SHIFT, act_end, false);
 	vop2_mask_write(vop2, RK3568_SYS_CTRL_LINE_FLAG0 + line_flag_offset, LINE_FLAG_NUM_MASK,
 			RK3568_DSP_LINE_FLAG_NUM1_SHIFT, act_end, false);
+
+	if (cstate->mcu_timing.mcu_pix_total)
+		vop3_mcu_mode_setup(state);
 
 	return 0;
 }
@@ -3071,71 +3974,129 @@
 {
 	uint16_t yrgb_hor_scl_mode, yrgb_ver_scl_mode;
 	uint16_t hscl_filter_mode, vscl_filter_mode;
-	uint8_t gt2 = 0, gt4 = 0;
+	uint8_t xgt2 = 0, xgt4 = 0;
+	uint8_t ygt2 = 0, ygt4 = 0;
 	uint32_t xfac = 0, yfac = 0;
-	uint16_t hsu_filter_mode = VOP2_SCALE_UP_BIC;
-	uint16_t hsd_filter_mode = VOP2_SCALE_DOWN_BIL;
-	uint16_t vsu_filter_mode = VOP2_SCALE_UP_BIL;
-	uint16_t vsd_filter_mode = VOP2_SCALE_DOWN_BIL;
 	u32 win_offset = win->reg_offset;
+	bool xgt_en = false;
+	bool xavg_en = false;
 
-	if (src_h >= (4 * dst_h))
-		gt4 = 1;
-	else if (src_h >= (2 * dst_h))
-		gt2 = 1;
+	if (is_vop3(vop2)) {
+		if (src_w >= (4 * dst_w)) {
+			xgt4 = 1;
+			src_w >>= 2;
+		} else if (src_w >= (2 * dst_w)) {
+			xgt2 = 1;
+			src_w >>= 1;
+		}
+	}
 
-	if (gt4)
+	if (src_h >= (4 * dst_h)) {
+		ygt4 = 1;
 		src_h >>= 2;
-	else if (gt2)
+	} else if (src_h >= (2 * dst_h)) {
+		ygt2 = 1;
 		src_h >>= 1;
+	}
 
 	yrgb_hor_scl_mode = scl_get_scl_mode(src_w, dst_w);
 	yrgb_ver_scl_mode = scl_get_scl_mode(src_h, dst_h);
 
 	if (yrgb_hor_scl_mode == SCALE_UP)
-		hscl_filter_mode = hsu_filter_mode;
+		hscl_filter_mode = win->hsu_filter_mode;
 	else
-		hscl_filter_mode = hsd_filter_mode;
+		hscl_filter_mode = win->hsd_filter_mode;
 
 	if (yrgb_ver_scl_mode == SCALE_UP)
-		vscl_filter_mode = vsu_filter_mode;
+		vscl_filter_mode = win->vsu_filter_mode;
 	else
-		vscl_filter_mode = vsd_filter_mode;
+		vscl_filter_mode = win->vsd_filter_mode;
 
 	/*
 	 * RK3568 VOP Esmart/Smart dsp_w should be even pixel
 	 * at scale down mode
 	 */
-	if ((yrgb_hor_scl_mode == SCALE_DOWN) && (dst_w & 0x1)) {
+	if ((yrgb_hor_scl_mode == SCALE_DOWN) && (dst_w & 0x1) && !is_vop3(vop2)) {
 		printf("win dst_w[%d] should align as 2 pixel\n", dst_w);
 		dst_w += 1;
 	}
 
-	xfac = vop2_scale_factor(yrgb_hor_scl_mode, hscl_filter_mode, src_w, dst_w);
-	yfac = vop2_scale_factor(yrgb_ver_scl_mode, vscl_filter_mode, src_h, dst_h);
+	if (is_vop3(vop2)) {
+		xfac = vop3_scale_factor(yrgb_hor_scl_mode, src_w, dst_w, true);
+		yfac = vop3_scale_factor(yrgb_ver_scl_mode, src_h, dst_h, false);
+
+		if (win->hsd_pre_filter_mode == VOP3_PRE_SCALE_DOWN_AVG)
+			xavg_en = xgt2 || xgt4;
+		else
+			xgt_en = xgt2 || xgt4;
+	} else {
+		xfac = vop2_scale_factor(yrgb_hor_scl_mode, hscl_filter_mode, src_w, dst_w);
+		yfac = vop2_scale_factor(yrgb_ver_scl_mode, vscl_filter_mode, src_h, dst_h);
+	}
 
 	if (win->type == CLUSTER_LAYER) {
 		vop2_writel(vop2, RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB + win_offset,
 			    yfac << 16 | xfac);
 
-		vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
-				YRGB_GT2_MASK, CLUSTER_YRGB_GT2_SHIFT, gt2, false);
-		vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
-				YRGB_GT4_MASK, CLUSTER_YRGB_GT4_SHIFT, gt4, false);
+		if (is_vop3(vop2)) {
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					EN_MASK, CLUSTER_XGT_EN_SHIFT, xgt_en, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					EN_MASK, CLUSTER_XAVG_EN_SHIFT, xavg_en, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					XGT_MODE_MASK, CLUSTER_XGT_MODE_SHIFT, xgt2 ? 0 : 1, false);
 
-		vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
-				YRGB_XSCL_MODE_MASK, CLUSTER_YRGB_XSCL_MODE_SHIFT, yrgb_hor_scl_mode, false);
-		vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
-				YRGB_YSCL_MODE_MASK, CLUSTER_YRGB_YSCL_MODE_SHIFT, yrgb_ver_scl_mode, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_XSCL_MODE_MASK, RK3528_CLUSTER_YRGB_XSCL_MODE_SHIFT,
+					yrgb_hor_scl_mode, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_YSCL_MODE_MASK, RK3528_CLUSTER_YRGB_YSCL_MODE_SHIFT,
+					yrgb_ver_scl_mode, false);
+		} else {
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_XSCL_MODE_MASK, RK3568_CLUSTER_YRGB_XSCL_MODE_SHIFT,
+					yrgb_hor_scl_mode, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_YSCL_MODE_MASK, RK3568_CLUSTER_YRGB_YSCL_MODE_SHIFT,
+					yrgb_ver_scl_mode, false);
+		}
 
+		if (!is_vop3(vop2) || win->vsd_pre_filter_mode == VOP3_PRE_SCALE_DOWN_GT) {
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_GT2_MASK, CLUSTER_YRGB_GT2_SHIFT, ygt2, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_GT4_MASK, CLUSTER_YRGB_GT4_SHIFT, ygt4, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					AVG2_MASK, CLUSTER_AVG2_SHIFT, 0, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					AVG4_MASK, CLUSTER_AVG4_SHIFT, 0, false);
+		} else {
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_GT2_MASK, CLUSTER_YRGB_GT2_SHIFT, 0, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					YRGB_GT4_MASK, CLUSTER_YRGB_GT4_SHIFT, 0, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					AVG2_MASK, CLUSTER_AVG2_SHIFT, ygt2, false);
+			vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset,
+					AVG4_MASK, CLUSTER_AVG4_SHIFT, ygt4, false);
+		}
 	} else {
 		vop2_writel(vop2, RK3568_ESMART0_REGION0_SCL_FACTOR_YRGB + win_offset,
 			    yfac << 16 | xfac);
 
+		if (is_vop3(vop2)) {
+			vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset,
+					EN_MASK, ESMART_XGT_EN_SHIFT, xgt_en, false);
+			vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset,
+					EN_MASK, ESMART_XAVG_EN_SHIFT, xavg_en, false);
+			vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset,
+					XGT_MODE_MASK, ESMART_XGT_MODE_SHIFT, xgt2 ? 0 : 1, false);
+		}
+
 		vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset,
-				YRGB_GT2_MASK, YRGB_GT2_SHIFT, gt2, false);
+				YRGB_GT2_MASK, YRGB_GT2_SHIFT, ygt2, false);
 		vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset,
-				YRGB_GT4_MASK, YRGB_GT4_SHIFT, gt4, false);
+				YRGB_GT4_MASK, YRGB_GT4_SHIFT, ygt4, false);
 
 		vop2_mask_write(vop2, RK3568_ESMART0_REGION0_SCL_CTRL + win_offset,
 				YRGB_XSCL_MODE_MASK, YRGB_XSCL_MODE_SHIFT, yrgb_hor_scl_mode, false);
@@ -3172,6 +4133,16 @@
 	}
 }
 
+static bool vop2_win_dither_up(uint32_t format)
+{
+	switch (format) {
+	case ROCKCHIP_FMT_RGB565:
+		return true;
+	default:
+		return false;
+	}
+}
+
 static void vop2_set_cluster_win(struct display_state *state, struct vop2_win_data *win)
 {
 	struct crtc_state *cstate = &state->crtc_state;
@@ -3193,6 +4164,7 @@
 	u32 splice_yrgb_offset = 0;
 	u32 win_offset = win->reg_offset;
 	u32 cfg_done = CFG_DONE_EN | BIT(cstate->crtc_id) | (BIT(cstate->crtc_id) << 16);
+	bool dither_up;
 
 	if (win->splice_mode_right) {
 		src_w = cstate->right_src_rect.w;
@@ -3223,11 +4195,17 @@
 
 	vop2_setup_scale(vop2, win, src_w, src_h, crtc_w, crtc_h);
 
-	if (vop2->version == VOP_VERSION_RK3588)
+	if (vop2->version == VOP_VERSION_RK3588 || vop2->version == VOP_VERSION_RK3528 ||
+	    vop2->version == VOP_VERSION_RK3562)
 		vop2_axi_config(vop2, win);
 
 	if (y_mirror)
 		printf("WARN: y mirror is unsupported by cluster window\n");
+
+	/* rk3588 should set half_blocK_en to 1 in line and tile mode */
+	if (vop2->version == VOP_VERSION_RK3588)
+		vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_AFBCD_CTRL + win_offset,
+				EN_MASK, CLUSTER_AFBCD_HALF_BLOCK_SHIFT, 1, false);
 
 	vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset,
 			WIN_FORMAT_MASK, WIN_FORMAT_SHIFT, cstate->format,
@@ -3242,12 +4220,17 @@
 
 	vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, EN_MASK, WIN_EN_SHIFT, 1, false);
 
-	csc_mode = vop2_convert_csc_mode(conn_state->color_space);
+	csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_10BIT_DEPTH);
 	vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, EN_MASK,
 			CLUSTER_RGB2YUV_EN_SHIFT,
 			is_yuv_output(conn_state->bus_format), false);
 	vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, CSC_MODE_MASK,
 			CLUSTER_CSC_MODE_SHIFT, csc_mode, false);
+
+	dither_up = vop2_win_dither_up(cstate->format);
+	vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, EN_MASK,
+			CLUSTER_DITHER_UP_EN_SHIFT, dither_up, false);
+
 	vop2_mask_write(vop2, RK3568_CLUSTER0_CTRL + win_offset, EN_MASK, CLUSTER_EN_SHIFT, 1, false);
 
 	vop2_writel(vop2, RK3568_REG_CFG_DONE, cfg_done);
@@ -3274,6 +4257,7 @@
 	u32 splice_yrgb_offset = 0;
 	u32 win_offset = win->reg_offset;
 	u32 cfg_done = CFG_DONE_EN | BIT(cstate->crtc_id) | (BIT(cstate->crtc_id) << 16);
+	bool dither_up;
 
 	if (win->splice_mode_right) {
 		src_w = cstate->right_src_rect.w;
@@ -3311,9 +4295,14 @@
 	else
 		y_mirror = 0;
 
+	if (is_vop3(vop2))
+		vop2_mask_write(vop2, RK3568_ESMART0_CTRL0 + win_offset, ESMART_LB_SELECT_MASK,
+				ESMART_LB_SELECT_SHIFT, win->scale_engine_num, false);
+
 	vop2_setup_scale(vop2, win, src_w, src_h, crtc_w, crtc_h);
 
-	if (vop2->version == VOP_VERSION_RK3588)
+	if (vop2->version == VOP_VERSION_RK3588 || vop2->version == VOP_VERSION_RK3528 ||
+	    vop2->version == VOP_VERSION_RK3562)
 		vop2_axi_config(vop2, win);
 
 	if (y_mirror)
@@ -3337,12 +4326,16 @@
 	vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, EN_MASK,
 			WIN_EN_SHIFT, 1, false);
 
-	csc_mode = vop2_convert_csc_mode(conn_state->color_space);
+	csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_10BIT_DEPTH);
 	vop2_mask_write(vop2, RK3568_ESMART0_CTRL0 + win_offset, EN_MASK,
 			RGB2YUV_EN_SHIFT,
 			is_yuv_output(conn_state->bus_format), false);
 	vop2_mask_write(vop2, RK3568_ESMART0_CTRL0 + win_offset, CSC_MODE_MASK,
 			CSC_MODE_SHIFT, csc_mode, false);
+
+	dither_up = vop2_win_dither_up(cstate->format);
+	vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, EN_MASK,
+			REGION0_DITHER_UP_EN_SHIFT, dither_up, false);
 
 	vop2_writel(vop2, RK3568_REG_CFG_DONE, cfg_done);
 }
@@ -3412,6 +4405,10 @@
 		printf("invalid win id %d\n", primary_plane_id);
 		return -ENODEV;
 	}
+
+	/* ignore some plane register according vop3 esmart lb mode */
+	if (vop3_ignore_plane(vop2, win_data))
+		return -EACCES;
 
 	if (vop2->version == VOP_VERSION_RK3588) {
 		if (vop2_power_domain_on(vop2, win_data->pd_id))
@@ -3494,6 +4491,10 @@
 	if (cstate->dsc_enable)
 		vop2_dsc_cfg_done(state);
 
+	if (cstate->mcu_timing.mcu_pix_total)
+		vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK,
+				MCU_HOLD_MODE_SHIFT, 0, false);
+
 	return 0;
 }
 
@@ -3570,7 +4571,7 @@
 	int vp_id = 0;
 	int cursor_plane_id = -1;
 
-	if (vop_fix_dts)
+	if (vop_fix_dts || vop2->version == VOP_VERSION_RK3528)
 		return 0;
 
 	ofnode_for_each_subnode(vp_node, np_to_ofnode(port_parent_node)) {
@@ -3638,6 +4639,53 @@
 	return 0;
 }
 
+static int rockchip_vop2_mode_fixup(struct display_state *state)
+{
+	struct connector_state *conn_state = &state->conn_state;
+	struct drm_display_mode *mode = &conn_state->mode;
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2 *vop2 = cstate->private;
+
+	drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V | CRTC_STEREO_DOUBLE);
+
+	if (mode->flags & DRM_MODE_FLAG_DBLCLK || conn_state->output_if & VOP_OUTPUT_IF_BT656)
+		mode->crtc_clock *= 2;
+
+	/*
+	 * For RK3528, the path of CVBS output is like:
+	 * VOP BT656 ENCODER -> CVBS BT656 DECODER -> CVBS ENCODER -> CVBS VDAC
+	 * The vop2 dclk should be four times crtc_clock for CVBS sampling
+	 * clock needs.
+	 */
+	if (vop2->version == VOP_VERSION_RK3528 && conn_state->output_if & VOP_OUTPUT_IF_BT656)
+		mode->crtc_clock *= 4;
+
+	if (cstate->mcu_timing.mcu_pix_total) {
+		if (conn_state->output_mode == ROCKCHIP_OUT_MODE_S888)
+			/*
+			 * For serial output_mode rgb3x8, one pixel need 3 cycles.
+			 * So dclk should be three times mode clock.
+			 */
+			mode->crtc_clock *= 3;
+		else if (conn_state->output_mode == ROCKCHIP_OUT_MODE_S888_DUMMY)
+			/*
+			 * For serial output_mode argb4x8, one pixel need 4 cycles.
+			 * So dclk should be four times mode clock.
+			 */
+			mode->crtc_clock *= 4;
+	}
+
+	if (conn_state->secondary) {
+		mode->crtc_clock *= 2;
+		mode->crtc_hdisplay *= 2;
+		mode->crtc_hsync_start *= 2;
+		mode->crtc_hsync_end *= 2;
+		mode->crtc_htotal *= 2;
+	}
+
+	return 0;
+}
+
 #define FRAC_16_16(mult, div)	(((mult) << 16) / (div))
 
 static int rockchip_vop2_plane_check(struct display_state *state)
@@ -3665,10 +4713,526 @@
 	if (hscale < 0 || vscale < 0) {
 		printf("ERROR: VP%d %s: scale factor is out of range\n", cstate->crtc_id, win_data->name);
 		return -ERANGE;
+		}
+
+	return 0;
+}
+
+static int rockchip_vop2_apply_soft_te(struct display_state *state)
+{
+	__maybe_unused struct connector_state *conn_state = &state->conn_state;
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2 *vop2 = cstate->private;
+	u32 vp_offset = (cstate->crtc_id * 0x100);
+	int val = 0;
+	int ret = 0;
+
+	ret = readl_poll_timeout(vop2->regs + RK3568_VP0_MIPI_CTRL + vp_offset, val,
+				 (val >> EDPI_WMS_FS) & 0x1, 50 * 1000);
+	if (!ret) {
+#ifndef CONFIG_SPL_BUILD
+		ret = readx_poll_timeout(dm_gpio_get_value, conn_state->te_gpio, val,
+					 !val, 50 * 1000);
+		if (!ret) {
+			ret = readx_poll_timeout(dm_gpio_get_value, conn_state->te_gpio, val,
+						 val, 50 * 1000);
+			if (!ret) {
+				vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset,
+						EN_MASK, EDPI_WMS_FS, 1, false);
+			} else {
+				printf("ERROR: vp%d wait for active TE signal timeout\n",
+				       cstate->crtc_id);
+				return ret;
+			}
+		} else {
+			printf("ERROR: vp%d TE signal maybe always high\n", cstate->crtc_id);
+			return ret;
+		}
+#endif
+	} else {
+		printf("ERROR: vp%d wait vop2 frame start timeout in hold mode\n", cstate->crtc_id);
+		return ret;
 	}
 
 	return 0;
 }
+
+static int rockchip_vop2_regs_dump(struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2 *vop2 = cstate->private;
+	const struct vop2_data *vop2_data = vop2->data;
+	const struct vop2_dump_regs *regs = vop2_data->dump_regs;
+	u32 n, i, j;
+	u32 base;
+
+	if (!cstate->crtc->active)
+		return -EINVAL;
+
+	n = vop2_data->dump_regs_size;
+	for (i = 0; i < n; i++) {
+		base = regs[i].offset;
+		printf("\n%s:\n", regs[i].name);
+		for (j = 0; j < 68;) {
+			printf("%08lx:  %08x %08x %08x %08x\n", (uintptr_t)vop2->regs + base + j * 4,
+			       vop2_readl(vop2, base + (4 * j)),
+			       vop2_readl(vop2, base + (4 * (j + 1))),
+			       vop2_readl(vop2, base + (4 * (j + 2))),
+			       vop2_readl(vop2, base + (4 * (j + 3))));
+			j += 4;
+		}
+	}
+
+	return 0;
+}
+
+static int rockchip_vop2_active_regs_dump(struct display_state *state)
+{
+	struct crtc_state *cstate = &state->crtc_state;
+	struct vop2 *vop2 = cstate->private;
+	const struct vop2_data *vop2_data = vop2->data;
+	const struct vop2_dump_regs *regs = vop2_data->dump_regs;
+	u32 n, i, j;
+	u32 base;
+	bool enable_state;
+
+	if (!cstate->crtc->active)
+		return -EINVAL;
+
+	n = vop2_data->dump_regs_size;
+	for (i = 0; i < n; i++) {
+		if (regs[i].state_mask) {
+			enable_state = (vop2_readl(vop2, regs[i].state_base) >> regs[i].state_shift) &
+				       regs[i].state_mask;
+			if (enable_state != regs[i].enable_state)
+				continue;
+		}
+
+		base = regs[i].offset;
+		printf("\n%s:\n", regs[i].name);
+		for (j = 0; j < 68;) {
+			printf("%08lx:  %08x %08x %08x %08x\n", (uintptr_t)vop2->regs + base + j * 4,
+			       vop2_readl(vop2, base + (4 * j)),
+			       vop2_readl(vop2, base + (4 * (j + 1))),
+			       vop2_readl(vop2, base + (4 * (j + 2))),
+			       vop2_readl(vop2, base + (4 * (j + 3))));
+			j += 4;
+		}
+	}
+
+	return 0;
+}
+
+static struct vop2_dump_regs rk3528_dump_regs[] = {
+	{ RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 },
+	{ RK3528_OVL_SYS, "OVL_SYS", 0, 0, 0, 0 },
+	{ RK3528_OVL_PORT0_CTRL, "OVL_VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3528_OVL_PORT1_CTRL, "OVL_VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0, 1 },
+	{ RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_SMART0_CTRL0, "Esmart2", RK3568_SMART0_CTRL0, 0x1, 0, 1 },
+	{ RK3568_SMART1_CTRL0, "Esmart3", RK3568_SMART1_CTRL0, 0x1, 0, 1 },
+	{ RK3528_HDR_LUT_CTRL, "HDR", 0, 0, 0, 0 },
+	{ RK3528_ACM_CTRL, "ACM", RK3528_ACM_CTRL, 0x1, 0, 1},
+};
+
+static u8 rk3528_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = {
+	ROCKCHIP_VOP2_ESMART0,
+	ROCKCHIP_VOP2_ESMART1,
+	ROCKCHIP_VOP2_ESMART2,
+	ROCKCHIP_VOP2_ESMART3,
+};
+
+static struct vop2_plane_table rk3528_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = {
+	{ROCKCHIP_VOP2_CLUSTER0, CLUSTER_LAYER},
+	{ROCKCHIP_VOP2_ESMART0, ESMART_LAYER},
+	{ROCKCHIP_VOP2_ESMART1, ESMART_LAYER},
+	{ROCKCHIP_VOP2_ESMART2, ESMART_LAYER},
+	{ROCKCHIP_VOP2_ESMART3, ESMART_LAYER},
+};
+
+static struct vop2_vp_plane_mask rk3528_vp_plane_mask[VOP2_VP_MAX][VOP2_VP_MAX] = {
+	{ /* one display policy for hdmi */
+		{/* main display */
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
+			.attached_layers_nr = 4,
+			.attached_layers = {
+				  ROCKCHIP_VOP2_CLUSTER0,
+				  ROCKCHIP_VOP2_ESMART0,  ROCKCHIP_VOP2_ESMART1, ROCKCHIP_VOP2_ESMART2
+				},
+		},
+		{/* second display */},
+		{/* third  display */},
+		{/* fourth display */},
+	},
+
+	{ /* two display policy */
+		{/* main display */
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
+			.attached_layers_nr = 3,
+			.attached_layers = {
+				  ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART1
+				},
+		},
+
+		{/* second display */
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART3,
+			.attached_layers_nr = 2,
+			.attached_layers = {
+				  ROCKCHIP_VOP2_ESMART2, ROCKCHIP_VOP2_ESMART3
+				},
+		},
+		{/* third  display */},
+		{/* fourth display */},
+	},
+
+	{ /* one display policy for cvbs */
+		{/* main display */
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART3,
+			.attached_layers_nr = 2,
+			.attached_layers = {
+				  ROCKCHIP_VOP2_ESMART2, ROCKCHIP_VOP2_ESMART3
+				},
+		},
+		{/* second display */},
+		{/* third  display */},
+		{/* fourth display */},
+	},
+
+	{/* reserved */},
+};
+
+static struct vop2_win_data rk3528_win_data[5] = {
+	{
+		.name = "Esmart0",
+		.phys_id = ROCKCHIP_VOP2_ESMART0,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 8,
+		.layer_sel_win_id = { 1, 0xff, 0xff, 0xff },
+		.reg_offset = 0,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x06,
+		.axi_uv_id = 0x07,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG,	/* gt or avg */
+		.vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT,	/* gt only */
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+
+	{
+		.name = "Esmart1",
+		.phys_id = ROCKCHIP_VOP2_ESMART1,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 10,
+		.layer_sel_win_id = { 2, 0xff, 0xff, 0xff },
+		.reg_offset = 0x200,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x08,
+		.axi_uv_id = 0x09,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG,	/* gt or avg */
+		.vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT,	/* gt only */
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+
+	{
+		.name = "Esmart2",
+		.phys_id = ROCKCHIP_VOP2_ESMART2,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 12,
+		.layer_sel_win_id = { 3, 0, 0xff, 0xff },
+		.reg_offset = 0x400,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x0a,
+		.axi_uv_id = 0x0b,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG,	/* gt or avg */
+		.vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT,	/* gt only */
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+
+	{
+		.name = "Esmart3",
+		.phys_id = ROCKCHIP_VOP2_ESMART3,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 14,
+		.layer_sel_win_id = { 0xff, 1, 0xff, 0xff },
+		.reg_offset = 0x600,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x0c,
+		.axi_uv_id = 0x0d,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG,	/* gt or avg */
+		.vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT,	/* gt only */
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+
+	{
+		.name = "Cluster0",
+		.phys_id = ROCKCHIP_VOP2_CLUSTER0,
+		.type = CLUSTER_LAYER,
+		.win_sel_port_offset = 0,
+		.layer_sel_win_id = { 0, 0xff, 0xff, 0xff },
+		.reg_offset = 0,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x02,
+		.axi_uv_id = 0x03,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG,	/* gt or avg */
+		.vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG,	/* gt or avg */
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+};
+
+static struct vop2_vp_data rk3528_vp_data[2] = {
+	{
+		.feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN | VOP_FEATURE_POST_ACM |
+			   VOP_FEATURE_POST_CSC,
+		.max_output = {4096, 4096},
+		.layer_mix_dly = 6,
+		.hdr_mix_dly = 2,
+		.win_dly = 8,
+	},
+	{
+		.feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN,
+		.max_output = {1920, 1080},
+		.layer_mix_dly = 2,
+		.hdr_mix_dly = 0,
+		.win_dly = 8,
+	},
+};
+
+const struct vop2_data rk3528_vop = {
+	.version = VOP_VERSION_RK3528,
+	.nr_vps = 2,
+	.vp_data = rk3528_vp_data,
+	.win_data = rk3528_win_data,
+	.plane_mask = rk3528_vp_plane_mask[0],
+	.plane_table = rk3528_plane_table,
+	.vp_primary_plane_order = rk3528_vp_primary_plane_order,
+	.nr_layers = 5,
+	.nr_mixers = 3,
+	.nr_gammas = 2,
+	.esmart_lb_mode = VOP3_ESMART_4K_2K_2K_MODE,
+	.dump_regs = rk3528_dump_regs,
+	.dump_regs_size = ARRAY_SIZE(rk3528_dump_regs),
+};
+
+static struct vop2_dump_regs rk3562_dump_regs[] = {
+	{ RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 },
+	{ RK3528_OVL_SYS, "OVL_SYS", 0, 0, 0, 0 },
+	{ RK3528_OVL_PORT0_CTRL, "OVL_VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3528_OVL_PORT1_CTRL, "OVL_VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_SMART0_CTRL0, "Esmart2", RK3568_SMART0_CTRL0, 0x1, 0, 1 },
+	{ RK3568_SMART1_CTRL0, "Esmart3", RK3568_SMART1_CTRL0, 0x1, 0, 1 },
+};
+
+static u8 rk3562_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = {
+	ROCKCHIP_VOP2_ESMART0,
+	ROCKCHIP_VOP2_ESMART1,
+	ROCKCHIP_VOP2_ESMART2,
+	ROCKCHIP_VOP2_ESMART3,
+};
+
+static struct vop2_plane_table rk3562_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = {
+	{ROCKCHIP_VOP2_ESMART0, ESMART_LAYER},
+	{ROCKCHIP_VOP2_ESMART1, ESMART_LAYER},
+	{ROCKCHIP_VOP2_ESMART2, ESMART_LAYER},
+	{ROCKCHIP_VOP2_ESMART3, ESMART_LAYER},
+};
+
+static struct vop2_vp_plane_mask rk3562_vp_plane_mask[VOP2_VP_MAX][VOP2_VP_MAX] = {
+	{ /* one display policy for hdmi */
+		{/* main display */
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
+			.attached_layers_nr = 4,
+			.attached_layers = {
+				  ROCKCHIP_VOP2_ESMART0,  ROCKCHIP_VOP2_ESMART1,
+				  ROCKCHIP_VOP2_ESMART2,  ROCKCHIP_VOP2_ESMART3
+				},
+		},
+		{/* second display */},
+		{/* third  display */},
+		{/* fourth display */},
+	},
+
+	{ /* two display policy */
+		{/* main display */
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
+			.attached_layers_nr = 2,
+			.attached_layers = {
+				  ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART1
+				},
+		},
+
+		{/* second display */
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART2,
+			.attached_layers_nr = 2,
+			.attached_layers = {
+				  ROCKCHIP_VOP2_ESMART2, ROCKCHIP_VOP2_ESMART3
+				},
+		},
+		{/* third  display */},
+		{/* fourth display */},
+	},
+
+	{/* reserved */},
+};
+
+static struct vop2_win_data rk3562_win_data[4] = {
+	{
+		.name = "Esmart0",
+		.phys_id = ROCKCHIP_VOP2_ESMART0,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 8,
+		.layer_sel_win_id = { 0, 0, 0xff, 0xff },
+		.reg_offset = 0,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x02,
+		.axi_uv_id = 0x03,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+
+	{
+		.name = "Esmart1",
+		.phys_id = ROCKCHIP_VOP2_ESMART1,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 10,
+		.layer_sel_win_id = { 1, 1, 0xff, 0xff },
+		.reg_offset = 0x200,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x04,
+		.axi_uv_id = 0x05,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+
+	{
+		.name = "Esmart2",
+		.phys_id = ROCKCHIP_VOP2_ESMART2,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 12,
+		.layer_sel_win_id = { 2, 2, 0xff, 0xff },
+		.reg_offset = 0x400,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x06,
+		.axi_uv_id = 0x07,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+
+	{
+		.name = "Esmart3",
+		.phys_id = ROCKCHIP_VOP2_ESMART3,
+		.type = ESMART_LAYER,
+		.win_sel_port_offset = 14,
+		.layer_sel_win_id = { 3, 3, 0xff, 0xff },
+		.reg_offset = 0x600,
+		.axi_id = 0,
+		.axi_yrgb_id = 0x08,
+		.axi_uv_id = 0x0d,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.max_upscale_factor = 8,
+		.max_downscale_factor = 8,
+	},
+};
+
+static struct vop2_vp_data rk3562_vp_data[2] = {
+	{
+		.feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN,
+		.max_output = {2048, 4096},
+		.win_dly = 8,
+		.layer_mix_dly = 8,
+	},
+	{
+		.feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN,
+		.max_output = {2048, 1080},
+		.win_dly = 8,
+		.layer_mix_dly = 8,
+	},
+};
+
+const struct vop2_data rk3562_vop = {
+	.version = VOP_VERSION_RK3562,
+	.nr_vps = 2,
+	.vp_data = rk3562_vp_data,
+	.win_data = rk3562_win_data,
+	.plane_mask = rk3562_vp_plane_mask[0],
+	.plane_table = rk3562_plane_table,
+	.vp_primary_plane_order = rk3562_vp_primary_plane_order,
+	.nr_layers = 4,
+	.nr_mixers = 3,
+	.nr_gammas = 2,
+	.esmart_lb_mode = VOP3_ESMART_2K_2K_2K_2K_MODE,
+	.dump_regs = rk3562_dump_regs,
+	.dump_regs_size = ARRAY_SIZE(rk3562_dump_regs),
+};
+
+static struct vop2_dump_regs rk3568_dump_regs[] = {
+	{ RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 },
+	{ RK3568_OVL_CTRL, "OVL", 0, 0, 0, 0 },
+	{ RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP2_DSP_CTRL, "VP2", RK3568_VP2_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0, 1 },
+	{ RK3568_CLUSTER1_WIN0_CTRL0, "Cluster1", RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 0, 1 },
+	{ RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_SMART0_CTRL0, "Smart0", RK3568_SMART0_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_SMART1_CTRL0, "Smart1", RK3568_SMART1_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_HDR_LUT_CTRL, "HDR", 0, 0, 0, 0 },
+};
+
+static u8 rk3568_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = {
+	ROCKCHIP_VOP2_SMART0,
+	ROCKCHIP_VOP2_SMART1,
+	ROCKCHIP_VOP2_ESMART0,
+	ROCKCHIP_VOP2_ESMART1,
+};
+
 static struct vop2_plane_table rk356x_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = {
 	{ROCKCHIP_VOP2_CLUSTER0, CLUSTER_LAYER},
 	{ROCKCHIP_VOP2_CLUSTER1, CLUSTER_LAYER},
@@ -3748,8 +5312,12 @@
 		.phys_id = ROCKCHIP_VOP2_CLUSTER0,
 		.type = CLUSTER_LAYER,
 		.win_sel_port_offset = 0,
-		.layer_sel_win_id = 0,
+		.layer_sel_win_id = { 0, 0, 0, 0xff },
 		.reg_offset = 0,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 4,
 		.max_downscale_factor = 4,
 	},
@@ -3759,8 +5327,12 @@
 		.phys_id = ROCKCHIP_VOP2_CLUSTER1,
 		.type = CLUSTER_LAYER,
 		.win_sel_port_offset = 1,
-		.layer_sel_win_id = 1,
+		.layer_sel_win_id = { 1, 1, 1, 0xff },
 		.reg_offset = 0x200,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 4,
 		.max_downscale_factor = 4,
 	},
@@ -3770,8 +5342,12 @@
 		.phys_id = ROCKCHIP_VOP2_ESMART0,
 		.type = ESMART_LAYER,
 		.win_sel_port_offset = 4,
-		.layer_sel_win_id = 2,
+		.layer_sel_win_id = { 2, 2, 2, 0xff },
 		.reg_offset = 0,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -3781,8 +5357,12 @@
 		.phys_id = ROCKCHIP_VOP2_ESMART1,
 		.type = ESMART_LAYER,
 		.win_sel_port_offset = 5,
-		.layer_sel_win_id = 6,
+		.layer_sel_win_id = { 6, 6, 6, 0xff },
 		.reg_offset = 0x200,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -3792,8 +5372,12 @@
 		.phys_id = ROCKCHIP_VOP2_SMART0,
 		.type = SMART_LAYER,
 		.win_sel_port_offset = 6,
-		.layer_sel_win_id = 3,
+		.layer_sel_win_id = { 3, 3, 3, 0xff },
 		.reg_offset = 0x400,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -3803,8 +5387,12 @@
 		.phys_id = ROCKCHIP_VOP2_SMART1,
 		.type = SMART_LAYER,
 		.win_sel_port_offset = 7,
-		.layer_sel_win_id = 7,
+		.layer_sel_win_id = { 7, 7, 7, 0xff },
 		.reg_offset = 0x600,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -3835,9 +5423,23 @@
 	.win_data = rk3568_win_data,
 	.plane_mask = rk356x_vp_plane_mask[0],
 	.plane_table = rk356x_plane_table,
+	.vp_primary_plane_order = rk3568_vp_primary_plane_order,
 	.nr_layers = 6,
 	.nr_mixers = 5,
 	.nr_gammas = 1,
+	.dump_regs = rk3568_dump_regs,
+	.dump_regs_size = ARRAY_SIZE(rk3568_dump_regs),
+};
+
+static u8 rk3588_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = {
+	ROCKCHIP_VOP2_ESMART0,
+	ROCKCHIP_VOP2_ESMART1,
+	ROCKCHIP_VOP2_ESMART2,
+	ROCKCHIP_VOP2_ESMART3,
+	ROCKCHIP_VOP2_CLUSTER0,
+	ROCKCHIP_VOP2_CLUSTER1,
+	ROCKCHIP_VOP2_CLUSTER2,
+	ROCKCHIP_VOP2_CLUSTER3,
 };
 
 static struct vop2_plane_table rk3588_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = {
@@ -3851,10 +5453,28 @@
 	{ROCKCHIP_VOP2_ESMART3, ESMART_LAYER},
 };
 
+static struct vop2_dump_regs rk3588_dump_regs[] = {
+	{ RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 },
+	{ RK3568_OVL_CTRL, "OVL", 0, 0, 0, 0 },
+	{ RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_VP2_DSP_CTRL, "VP2", RK3568_VP2_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3588_VP3_DSP_CTRL, "VP3", RK3588_VP3_DSP_CTRL, 0x1, 31, 0 },
+	{ RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0, 1 },
+	{ RK3568_CLUSTER1_WIN0_CTRL0, "Cluster1", RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 0, 1 },
+	{ RK3588_CLUSTER2_WIN0_CTRL0, "Cluster2", RK3588_CLUSTER2_WIN0_CTRL0, 0x1, 0, 1 },
+	{ RK3588_CLUSTER3_WIN0_CTRL0, "Cluster3", RK3588_CLUSTER3_WIN0_CTRL0, 0x1, 0, 1 },
+	{ RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_SMART0_CTRL0, "Esmart2", RK3568_SMART0_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_SMART1_CTRL0, "Esmart3", RK3568_SMART1_REGION0_CTRL, 0x1, 0, 1 },
+	{ RK3568_HDR_LUT_CTRL, "HDR", 0, 0, 0, 0 },
+};
+
 static struct vop2_vp_plane_mask rk3588_vp_plane_mask[VOP2_VP_MAX][VOP2_VP_MAX] = {
 	{ /* one display policy */
 		{/* main display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER0,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
 			.attached_layers_nr = 8,
 			.attached_layers = {
 				  ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART2,
@@ -3869,7 +5489,7 @@
 
 	{ /* two display policy */
 		{/* main display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER0,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
 			.attached_layers_nr = 4,
 			.attached_layers = {
 				  ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0,
@@ -3878,7 +5498,7 @@
 		},
 
 		{/* second display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER2,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART2,
 			.attached_layers_nr = 4,
 			.attached_layers = {
 				  ROCKCHIP_VOP2_CLUSTER2, ROCKCHIP_VOP2_ESMART2,
@@ -3891,7 +5511,7 @@
 
 	{ /* three display policy */
 		{/* main display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER0,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
 			.attached_layers_nr = 3,
 			.attached_layers = {
 				  ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_CLUSTER1, ROCKCHIP_VOP2_ESMART0
@@ -3899,7 +5519,7 @@
 		},
 
 		{/* second display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER2,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART1,
 			.attached_layers_nr = 3,
 			.attached_layers = {
 				  ROCKCHIP_VOP2_CLUSTER2, ROCKCHIP_VOP2_CLUSTER3, ROCKCHIP_VOP2_ESMART1
@@ -3917,25 +5537,25 @@
 
 	{ /* four display policy */
 		{/* main display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER0,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART0,
 			.attached_layers_nr = 2,
 			.attached_layers = { ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0 },
 		},
 
 		{/* second display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER1,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART1,
 			.attached_layers_nr = 2,
 			.attached_layers = { ROCKCHIP_VOP2_CLUSTER1, ROCKCHIP_VOP2_ESMART1 },
 		},
 
 		{/* third  display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER2,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART2,
 			.attached_layers_nr = 2,
 			.attached_layers = { ROCKCHIP_VOP2_CLUSTER2, ROCKCHIP_VOP2_ESMART2 },
 		},
 
 		{/* fourth display */
-			.primary_plane_id = ROCKCHIP_VOP2_CLUSTER3,
+			.primary_plane_id = ROCKCHIP_VOP2_ESMART3,
 			.attached_layers_nr = 2,
 			.attached_layers = { ROCKCHIP_VOP2_CLUSTER3, ROCKCHIP_VOP2_ESMART3 },
 		},
@@ -3950,12 +5570,16 @@
 		.splice_win_id = ROCKCHIP_VOP2_CLUSTER1,
 		.type = CLUSTER_LAYER,
 		.win_sel_port_offset = 0,
-		.layer_sel_win_id = 0,
+		.layer_sel_win_id = { 0, 0, 0, 0 },
 		.reg_offset = 0,
 		.axi_id = 0,
 		.axi_yrgb_id = 2,
 		.axi_uv_id = 3,
 		.pd_id = VOP2_PD_CLUSTER0,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 4,
 		.max_downscale_factor = 4,
 	},
@@ -3965,12 +5589,16 @@
 		.phys_id = ROCKCHIP_VOP2_CLUSTER1,
 		.type = CLUSTER_LAYER,
 		.win_sel_port_offset = 1,
-		.layer_sel_win_id = 1,
+		.layer_sel_win_id = { 1, 1, 1, 1 },
 		.reg_offset = 0x200,
 		.axi_id = 0,
 		.axi_yrgb_id = 6,
 		.axi_uv_id = 7,
 		.pd_id = VOP2_PD_CLUSTER1,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 4,
 		.max_downscale_factor = 4,
 	},
@@ -3981,12 +5609,16 @@
 		.splice_win_id = ROCKCHIP_VOP2_CLUSTER3,
 		.type = CLUSTER_LAYER,
 		.win_sel_port_offset = 2,
-		.layer_sel_win_id = 4,
+		.layer_sel_win_id = { 4, 4, 4, 4 },
 		.reg_offset = 0x400,
 		.axi_id = 1,
 		.axi_yrgb_id = 2,
 		.axi_uv_id = 3,
 		.pd_id = VOP2_PD_CLUSTER2,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 4,
 		.max_downscale_factor = 4,
 	},
@@ -3996,12 +5628,16 @@
 		.phys_id = ROCKCHIP_VOP2_CLUSTER3,
 		.type = CLUSTER_LAYER,
 		.win_sel_port_offset = 3,
-		.layer_sel_win_id = 5,
+		.layer_sel_win_id = { 5, 5, 5, 5 },
 		.reg_offset = 0x600,
 		.axi_id = 1,
 		.axi_yrgb_id = 6,
 		.axi_uv_id = 7,
 		.pd_id = VOP2_PD_CLUSTER3,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 4,
 		.max_downscale_factor = 4,
 	},
@@ -4012,11 +5648,15 @@
 		.splice_win_id = ROCKCHIP_VOP2_ESMART1,
 		.type = ESMART_LAYER,
 		.win_sel_port_offset = 4,
-		.layer_sel_win_id = 2,
+		.layer_sel_win_id = { 2, 2, 2, 2 },
 		.reg_offset = 0,
 		.axi_id = 0,
 		.axi_yrgb_id = 0x0a,
 		.axi_uv_id = 0x0b,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -4026,12 +5666,16 @@
 		.phys_id = ROCKCHIP_VOP2_ESMART1,
 		.type = ESMART_LAYER,
 		.win_sel_port_offset = 5,
-		.layer_sel_win_id = 3,
+		.layer_sel_win_id = { 3, 3, 3, 3 },
 		.reg_offset = 0x200,
 		.axi_id = 0,
 		.axi_yrgb_id = 0x0c,
 		.axi_uv_id = 0x0d,
 		.pd_id = VOP2_PD_ESMART,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -4042,12 +5686,16 @@
 		.splice_win_id = ROCKCHIP_VOP2_ESMART3,
 		.type = ESMART_LAYER,
 		.win_sel_port_offset = 6,
-		.layer_sel_win_id = 6,
+		.layer_sel_win_id = { 6, 6, 6, 6 },
 		.reg_offset = 0x400,
 		.axi_id = 1,
 		.axi_yrgb_id = 0x0a,
 		.axi_uv_id = 0x0b,
 		.pd_id = VOP2_PD_ESMART,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -4057,12 +5705,16 @@
 		.phys_id = ROCKCHIP_VOP2_ESMART3,
 		.type = ESMART_LAYER,
 		.win_sel_port_offset = 7,
-		.layer_sel_win_id = 7,
+		.layer_sel_win_id = { 7, 7, 7, 7 },
 		.reg_offset = 0x600,
 		.axi_id = 1,
 		.axi_yrgb_id = 0x0c,
 		.axi_uv_id = 0x0d,
 		.pd_id = VOP2_PD_ESMART,
+		.hsu_filter_mode = VOP2_SCALE_UP_BIC,
+		.hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
+		.vsu_filter_mode = VOP2_SCALE_UP_BIL,
+		.vsd_filter_mode = VOP2_SCALE_DOWN_BIL,
 		.max_upscale_factor = 8,
 		.max_downscale_factor = 8,
 	},
@@ -4218,6 +5870,7 @@
 	.dsc = rk3588_dsc_data,
 	.dsc_error_ecw = dsc_ecw,
 	.dsc_error_buffer_flow = dsc_buffer_flow,
+	.vp_primary_plane_order = rk3588_vp_primary_plane_order,
 	.nr_layers = 8,
 	.nr_mixers = 7,
 	.nr_gammas = 4,
@@ -4225,6 +5878,8 @@
 	.nr_dscs = 2,
 	.nr_dsc_ecw = ARRAY_SIZE(dsc_ecw),
 	.nr_dsc_buffer_flow = ARRAY_SIZE(dsc_buffer_flow),
+	.dump_regs = rk3588_dump_regs,
+	.dump_regs_size = ARRAY_SIZE(rk3588_dump_regs),
 };
 
 const struct rockchip_crtc_funcs rockchip_vop2_funcs = {
@@ -4235,7 +5890,12 @@
 	.enable = rockchip_vop2_enable,
 	.disable = rockchip_vop2_disable,
 	.fixup_dts = rockchip_vop2_fixup_dts,
+	.send_mcu_cmd = rockchip_vop2_send_mcu_cmd,
 	.check = rockchip_vop2_check,
 	.mode_valid = rockchip_vop2_mode_valid,
+	.mode_fixup = rockchip_vop2_mode_fixup,
 	.plane_check = rockchip_vop2_plane_check,
+	.regs_dump = rockchip_vop2_regs_dump,
+	.active_regs_dump = rockchip_vop2_active_regs_dump,
+	.apply_soft_te = rockchip_vop2_apply_soft_te,
 };
diff --git a/u-boot/drivers/video/drm/rockchip_vop_reg.c b/u-boot/drivers/video/drm/rockchip_vop_reg.c
index 710ba20..4bfb85f 100644
--- a/u-boot/drivers/video/drm/rockchip_vop_reg.c
+++ b/u-boot/drivers/video/drm/rockchip_vop_reg.c
@@ -140,6 +140,11 @@
 
 	.dsp_out_yuv = VOP_REG_VER(RK3399_POST_SCL_CTRL, 0x1, 2, 3, 5, -1),
 	.dsp_data_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1f, 12),
+	.dsp_bg_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 12),
+	.dsp_rb_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 13),
+	.dsp_rg_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 14),
+	.dsp_delta_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 15),
+	.dsp_dummy_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 16),
 	.dsp_ccir656_avg = VOP_REG(RK3288_DSP_CTRL0, 0x1, 20),
 	.dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18),
 	.dsp_lut_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 0),
@@ -383,6 +388,11 @@
 	.dither_up = VOP_REG(RK3328_DSP_CTRL1, 0x1, 6),
 
 	.dsp_data_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1f, 12),
+	.dsp_bg_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 12),
+	.dsp_rb_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 13),
+	.dsp_rg_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 14),
+	.dsp_delta_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 15),
+	.dsp_dummy_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 16),
 	.dsp_ccir656_avg = VOP_REG(RK3328_DSP_CTRL0, 0x1, 20),
 	.dsp_blank = VOP_REG(RK3328_DSP_CTRL0, 0x3, 18),
 	.dsp_lut_en = VOP_REG(RK3328_DSP_CTRL1, 0x1, 0),
@@ -544,6 +554,9 @@
 	.dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2),
 	.dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x7, 6),
 	.dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9),
+	.dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9),
+	.dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11),
+	.dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12),
 	.dsp_ccir656_avg = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 5),
 	.dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15),
 	.dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14),
@@ -642,6 +655,9 @@
 	.dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2),
 	.dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x7, 6),
 	.dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9),
+	.dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9),
+	.dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11),
+	.dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12),
 	.dsp_ccir656_avg = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 5),
 	.dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15),
 	.dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14),
@@ -754,6 +770,9 @@
 	.dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 8),
 	.dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2),
 	.dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9),
+	.dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9),
+	.dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11),
+	.dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12),
 	.dsp_ccir656_avg = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 5),
 	.dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15),
 	.dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14),
@@ -826,6 +845,9 @@
 	.dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 8),
 	.dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2),
 	.dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9),
+	.dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9),
+	.dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11),
+	.dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12),
 	.dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15),
 	.dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14),
 	.dsp_outzero = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 3),
diff --git a/u-boot/drivers/video/drm/rohm-bu18rl82.c b/u-boot/drivers/video/drm/rohm-bu18rl82.c
index 020d369..db35848 100644
--- a/u-boot/drivers/video/drm/rohm-bu18rl82.c
+++ b/u-boot/drivers/video/drm/rohm-bu18rl82.c
@@ -47,6 +47,7 @@
 			       (BU18RL82_SWRST_REG | BU18RL82_SWRST_EXCREG | BU18RL82_SWRST_ALL));
 	if (ret < 0)
 		printf("failed to reset bu18rl82(%s) ret=%d\n", bus->name, ret);
+	mdelay(5);
 }
 
 static int bu18rl82_serdes_init_sequence_write(struct bu18rl82_priv *priv)
diff --git a/u-boot/drivers/video/drm/rohm-bu18tl82.c b/u-boot/drivers/video/drm/rohm-bu18tl82.c
index bda247e..04b44e5 100644
--- a/u-boot/drivers/video/drm/rohm-bu18tl82.c
+++ b/u-boot/drivers/video/drm/rohm-bu18tl82.c
@@ -7,6 +7,7 @@
 #include <dm.h>
 #include <errno.h>
 #include <i2c.h>
+#include <drm/drm_mipi_dsi.h>
 #include <video_bridge.h>
 #include <asm/unaligned.h>
 #include <linux/media-bus-format.h>
@@ -31,6 +32,7 @@
 	struct udevice *power_supply;
 	struct gpio_desc enable_gpio;
 	struct serdes_init_seq *serdes_init_seq;
+	bool sel_mipi;
 };
 
 static void bu18tl82_bridge_reset(struct rockchip_bridge *bridge)
@@ -216,6 +218,20 @@
 		return ret;
 	}
 
+	priv->sel_mipi = dev_read_bool(dev, "sel-mipi");
+	if (priv->sel_mipi) {
+		struct mipi_dsi_device *device = dev_get_platdata(dev);
+
+		device->dev = dev;
+		device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4);
+		device->format = dev_read_u32_default(dev, "dsi,format",
+						      MIPI_DSI_FMT_RGB888);
+		device->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
+				     MIPI_DSI_MODE_VIDEO_HBP | MIPI_DSI_MODE_LPM |
+				     MIPI_DSI_MODE_EOT_PACKET;
+		device->channel = dev_read_u32_default(dev, "reg", 0);
+	}
+
 	bridge = calloc(1, sizeof(*bridge));
 	if (!bridge)
 		return -ENOMEM;
@@ -250,4 +266,5 @@
 	.of_match = bu18tl82_of_match,
 	.probe = bu18tl82_probe,
 	.priv_auto_alloc_size = sizeof(struct bu18tl82_priv),
+	.platdata_auto_alloc_size = sizeof(struct mipi_dsi_device),
 };
diff --git a/u-boot/drivers/watchdog/rockchip_wdt.c b/u-boot/drivers/watchdog/rockchip_wdt.c
index f2962d9..0c2398f 100644
--- a/u-boot/drivers/watchdog/rockchip_wdt.c
+++ b/u-boot/drivers/watchdog/rockchip_wdt.c
@@ -86,7 +86,8 @@
 
 	printf("Rockchip watchdog timeout: %lld sec\n", timeout / 1000);
 
-	reset_deassert(&priv->rst);
+	if (priv->rst.dev)
+		reset_deassert(&priv->rst);
 
 	rockchip_wdt_reset(dev);
 	rockchip_wdt_settimeout(timeout, priv);
@@ -100,8 +101,10 @@
 {
 	struct rockchip_wdt_priv *priv = dev_get_priv(dev);
 
-	reset_assert(&priv->rst);
-	reset_deassert(&priv->rst);
+	if (priv->rst.dev) {
+		reset_assert(&priv->rst);
+		reset_deassert(&priv->rst);
+	}
 
 	printf("Rockchip watchdog stop\n");
 
@@ -133,7 +136,7 @@
 	ret = reset_get_by_name(dev, "reset", &priv->rst);
 	if (ret) {
 		pr_err("reset_get_by_name(reset) failed: %d\n", ret);
-		return ret;
+		priv->rst.dev = NULL;
 	}
 
 	ret = clk_get_by_index(dev, 0, &priv->clk);
diff --git a/u-boot/env/envf.c b/u-boot/env/envf.c
index b469bd2..fc55afd 100644
--- a/u-boot/env/envf.c
+++ b/u-boot/env/envf.c
@@ -44,16 +44,6 @@
 #endif
 
 #ifdef CONFIG_DM_MMC
-static int pmbr_part_valid(struct partition *part)
-{
-	if (part->sys_ind == EFI_PMBR_OSTYPE_EFI_GPT &&
-		get_unaligned_le32(&part->start_sect) == 1UL) {
-		return 1;
-	}
-
-	return 0;
-}
-
 static int is_pmbr_valid(legacy_mbr * mbr)
 {
 	int i = 0;
@@ -62,10 +52,10 @@
 		return 0;
 
 	for (i = 0; i < 4; i++) {
-		if (pmbr_part_valid(&mbr->partition_record[i])) {
+		if (mbr->partition_record[i].sys_ind == 0xc)
 			return 1;
-		}
 	}
+
 	return 0;
 }
 
@@ -76,10 +66,10 @@
 	/* Read legacy MBR from block 0 and validate it */
 	if ((blk_dread(dev_desc, 0, 1, (ulong *)legacymbr) != 1)
 		|| (is_pmbr_valid(legacymbr) != 1)) {
-		return -1;
+		return 0;
 	}
 
-	return 0;
+	return 1;
 }
 #endif
 
@@ -262,35 +252,6 @@
 	return envf_num;
 }
 
-#ifdef CONFIG_ENV_PARTITION
-static int envf_add_partition_bootargs(void)
-{
-	char *part_list;
-	char *bootargs;
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(part_type); i++) {
-		part_list = env_get(part_type[i]);
-		if (part_list)
-			break;
-	}
-	if (!part_list)
-		return -EINVAL;
-
-	bootargs = calloc(1, strlen(part_list) + strlen(part_type[i]) + 2);
-	if (!bootargs)
-		return -ENOMEM;
-
-	strcat(bootargs, part_type[i]);
-	strcat(bootargs, "=");
-	strcat(bootargs, part_list);
-	env_update("bootargs", bootargs);
-	free(bootargs);
-
-	return 0;
-}
-#endif
-
 static int envf_load(void)
 {
 	struct blk_desc *desc;
@@ -313,10 +274,6 @@
 			return -EINTR;
 		}
 	}
-
-#ifdef CONFIG_ENV_PARTITION
-	envf_add_partition_bootargs();
-#endif
 
 	return 0;
 }
diff --git a/u-boot/examples/standalone/Makefile b/u-boot/examples/standalone/Makefile
index c9d6206..cd870f6 100644
--- a/u-boot/examples/standalone/Makefile
+++ b/u-boot/examples/standalone/Makefile
@@ -10,6 +10,7 @@
 extra-$(CONFIG_SMC911X)            += smc911x_eeprom
 extra-$(CONFIG_SPI_FLASH_ATMEL)    += atmel_df_pow2
 extra-$(CONFIG_PPC)                += sched
+extra-$(CONFIG_ROCKCHIP_SPI)       += rkspi
 
 #
 # Some versions of make do not handle trailing white spaces properly;
diff --git a/u-boot/examples/standalone/README_rkspi.md b/u-boot/examples/standalone/README_rkspi.md
new file mode 100644
index 0000000..7cb986b
--- /dev/null
+++ b/u-boot/examples/standalone/README_rkspi.md
@@ -0,0 +1,126 @@
+# RK SPI Standalone Bin
+
+This is the readme for the Das U-Boot standalone program rkspi
+
+
+How To Use
+------------------------
+### Compile
+
+1.Define the standalone load address in includes/configs/rkxxxxx_common.h
+
+```shell
+#define CONFIG_STANDALONE_LOAD_ADDR    0x40000000
+```
+
+2.Enable rkspi in defconfig
+
+```
+CONFIG_ROCKCHIP_SPI=y
+```
+
+### Setting SPI hardware
+
+1.Setting the iomux and spiclk through:
+
+- u-boot shell command
+- define it in rkspi.c spi_hw_init
+
+Note:
+
+- spiclk is the clock for spi controller, output to IO after internal frequency division of the controller.
+
+### Load And Executable
+
+1. load the bin by serial or tftp, take tftp as example:
+
+```shell
+setenv ipaddr 172.16.12.157
+setenv serverip 172.16.12.167
+tftp 0x40000000 rkspi.bin		# 0x40000000 is define by CONFIG_STANDALONE_LOAD_ADDR
+```
+
+2. execute it
+
+```shell
+go 0x40000000		# 0x40000000 is define by CONFIG_STANDALONE_LOAD_ADDR
+```
+
+## Abort Codes
+
+### Introduction
+
+```c
+int rockchip_spi_probe(u8 bus, uintptr_t base_addr, u32 rsd, u32 clock_div, u32 mode);
+```
+
+- bus: spi bus
+- base_addr: spi register base address
+- rsd: read sample clock shift with spiclk which is controller working rate
+- clock_div: internal frequency division of the controller
+- mode: spi mode, support:
+
+```c
+#define SPI_CPHA	BIT(0)			/* clock phase */
+#define SPI_CPOL	BIT(1)			/* clock polarity */
+#define SPI_MODE_0	(0 | 0)			/* (original MicroWire) */
+#define SPI_MODE_1	(0 | SPI_CPHA)
+#define SPI_MODE_2	(SPI_CPOL | 0)
+#define SPI_MODE_3	(SPI_CPOL | SPI_CPHA)
+```
+
+
+
+```c
+int rockchip_spi_claim_bus(u8 bus);
+```
+
+- bus: spi bus
+
+
+
+```c
+void rockchip_spi_release_bus(u8 bus);
+```
+
+- bus: spi bus
+
+
+
+```c
+int rockchip_spi_xfer(u8 bus, u8 cs, unsigned int bitlen, const void *dout, void *din, unsigned long flags);
+```
+
+- bus: spi bus
+- cs: spi cs
+- bitlen: the transfer length in bits
+- dout: write buffer (if exits)
+- din: read buffer (if exits), if the dout and din both defined, spi work in duplex mode
+- flags: operation chip select, support:
+
+```c
+#define SPI_XFER_BEGIN		BIT(0)	/* Assert CS before transfer */
+#define SPI_XFER_END		BIT(1)	/* Deassert CS after transfer */
+#define SPI_XFER_ONCE		(SPI_XFER_BEGIN | SPI_XFER_END)
+```
+
+
+
+```c
+int rockchip_spi_write_then_read(u8 bus, u8 cs,
+				 const u8 *opcode, size_t n_opcode,
+				 const u8 *txbuf, u8 *rxbuf, size_t n_buf);
+```
+
+- bus: spi bus
+- cs: spi cs
+- opcode: command code
+- n_opcode: the numbers of command code in bytes
+- txbuf: write buffer (if exits)
+- rxbuf: read buffer (if exits), if the dout and din both defined, spi work in duplex mode
+- n_buf: the transfer length in bytes
+
+### Demo
+
+Is right in the main function of rkspi.
+
diff --git a/u-boot/examples/standalone/rkspi.c b/u-boot/examples/standalone/rkspi.c
new file mode 100644
index 0000000..e2e2bef
--- /dev/null
+++ b/u-boot/examples/standalone/rkspi.c
@@ -0,0 +1,454 @@
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <exports.h>
+
+#include "rkspi.h"
+
+/* Change to 1 to output registers at the start of each transaction */
+#define DEBUG_RK_SPI	0
+
+struct rockchip_spi_priv {
+	struct rockchip_spi *regs;
+	unsigned int mode;
+	u8 bits_per_word;		/* max 16 bits per word */
+	u8 n_bytes;
+	unsigned int clock_div;
+	uint cr0;
+	u32 rsd;			/* Rx sample delay cycles */
+};
+
+#define RK_SPI_BUS_MAX 5
+static struct rockchip_spi_priv spi_bus[RK_SPI_BUS_MAX];
+
+static inline struct rockchip_spi_priv *get_spi_bus(u8 bus)
+{
+	return &spi_bus[bus];
+}
+
+#define SPI_FIFO_DEPTH		32
+#define SPI_CR0_RSD_MAX		0x3
+
+static inline void writel(u32 val, void *addr)
+{
+	*(volatile u32 *)addr = val;
+}
+
+static inline u32 readl(void *addr)
+{
+	return *(volatile u32 *)addr;
+}
+
+static void rkspi_dump_regs(struct rockchip_spi *regs)
+{
+	debug("ctrl0: \t\t0x%08x\n", readl(&regs->ctrlr0));
+	debug("ctrl1: \t\t0x%08x\n", readl(&regs->ctrlr1));
+	debug("ssienr: \t\t0x%08x\n", readl(&regs->enr));
+	debug("ser: \t\t0x%08x\n", readl(&regs->ser));
+	debug("baudr: \t\t0x%08x\n", readl(&regs->baudr));
+	debug("txftlr: \t\t0x%08x\n", readl(&regs->txftlr));
+	debug("rxftlr: \t\t0x%08x\n", readl(&regs->rxftlr));
+	debug("txflr: \t\t0x%08x\n", readl(&regs->txflr));
+	debug("rxflr: \t\t0x%08x\n", readl(&regs->rxflr));
+	debug("sr: \t\t0x%08x\n", readl(&regs->sr));
+	debug("imr: \t\t0x%08x\n", readl(&regs->imr));
+	debug("isr: \t\t0x%08x\n", readl(&regs->isr));
+	debug("dmacr: \t\t0x%08x\n", readl(&regs->dmacr));
+	debug("dmatdlr: \t0x%08x\n", readl(&regs->dmatdlr));
+	debug("dmardlr: \t0x%08x\n", readl(&regs->dmardlr));
+}
+
+static void rkspi_enable_chip(struct rockchip_spi *regs, bool enable)
+{
+	writel(enable ? 1 : 0, &regs->enr);
+}
+
+static void rkspi_set_baudr(struct rockchip_spi_priv *priv, uint clk_div)
+{
+	writel(clk_div, &priv->regs->baudr);
+}
+
+static int rkspi_wait_till_not_busy(struct rockchip_spi *regs)
+{
+	unsigned long start;
+
+	start = get_timer(0);
+	while (readl(&regs->sr) & SR_BUSY) {
+		if (get_timer(start) > ROCKCHIP_SPI_TIMEOUT_MS) {
+			debug("RK SPI: Status keeps busy for 1000us after a read/write!\n");
+			return -ETIMEDOUT;
+		}
+	}
+
+	return 0;
+}
+
+static void spi_cs_activate(u8 bus, u8 cs)
+{
+	struct rockchip_spi_priv *priv = get_spi_bus(bus);
+	struct rockchip_spi *regs = priv->regs;
+
+	debug("activate cs%u\n", cs);
+	writel(1 << cs, &regs->ser);
+}
+
+static void spi_cs_deactivate(u8 bus, u8 cs)
+{
+	struct rockchip_spi_priv *priv = get_spi_bus(bus);
+	struct rockchip_spi *regs = priv->regs;
+
+	debug("deactivate cs%u\n", cs);
+	writel(0, &regs->ser);
+}
+
+int rockchip_spi_probe(u8 bus, uintptr_t base_addr, u32 rsd, u32 clock_div, u32 mode)
+{
+	struct rockchip_spi_priv *priv;
+
+	if (bus >= RK_SPI_BUS_MAX) {
+		printf("%s bus %d is out of max num(%d)\n", __func__, bus, RK_SPI_BUS_MAX);
+		return -1;
+	}
+
+	debug("%s: probe\n", __func__);
+
+	priv = &spi_bus[bus];
+
+	priv->regs = (struct rockchip_spi *)base_addr;
+	priv->rsd = rsd;
+	priv->mode = mode;
+	if (clock_div % 2 || clock_div < 2) {
+		printf("%s div should be even num, and at least 2\n", __func__);
+
+		return -1;
+	}
+	priv->clock_div = clock_div;
+	priv->bits_per_word = 8;
+
+	return 0;
+}
+
+int rockchip_spi_claim_bus(u8 bus)
+{
+	struct rockchip_spi_priv *priv = get_spi_bus(bus);
+	struct rockchip_spi *regs = priv->regs;
+	u8 spi_dfs, spi_tf;
+	uint ctrlr0;
+
+	/* Disable the SPI hardware */
+	rkspi_enable_chip(regs, 0);
+
+	switch (priv->bits_per_word) {
+	case 8:
+		priv->n_bytes = 1;
+		spi_dfs = DFS_8BIT;
+		spi_tf = HALF_WORD_OFF;
+		break;
+	case 16:
+		priv->n_bytes = 2;
+		spi_dfs = DFS_16BIT;
+		spi_tf = HALF_WORD_ON;
+		break;
+	default:
+		debug("%s: unsupported bits: %dbits\n", __func__,
+		      priv->bits_per_word);
+		return -EPROTONOSUPPORT;
+	}
+
+	rkspi_set_baudr(priv, priv->clock_div);
+
+	/* Operation Mode */
+	ctrlr0 = OMOD_MASTER << OMOD_SHIFT;
+
+	/* Data Frame Size */
+	ctrlr0 |= spi_dfs << DFS_SHIFT;
+
+	/* set SPI mode 0..3 */
+	if (priv->mode & SPI_CPOL)
+		ctrlr0 |= SCOL_HIGH << SCOL_SHIFT;
+	if (priv->mode & SPI_CPHA)
+		ctrlr0 |= SCPH_TOGSTA << SCPH_SHIFT;
+
+	/* Chip Select Mode */
+	ctrlr0 |= CSM_KEEP << CSM_SHIFT;
+
+	/* SSN to Sclk_out delay */
+	ctrlr0 |= SSN_DELAY_ONE << SSN_DELAY_SHIFT;
+
+	/* Serial Endian Mode */
+	ctrlr0 |= SEM_LITTLE << SEM_SHIFT;
+
+	/* First Bit Mode */
+	ctrlr0 |= FBM_MSB << FBM_SHIFT;
+
+	/* Byte and Halfword Transform */
+	ctrlr0 |= spi_tf << HALF_WORD_TX_SHIFT;
+
+	/* Rxd Sample Delay */
+	ctrlr0 |= priv->rsd << RXDSD_SHIFT;
+
+	/* Frame Format */
+	ctrlr0 |= FRF_SPI << FRF_SHIFT;
+
+	/* Save static configuration */
+	priv->cr0 = ctrlr0;
+
+	writel(ctrlr0, &regs->ctrlr0);
+
+	return 0;
+}
+
+int rockchip_spi_config(struct rockchip_spi_priv *priv, const void *dout)
+{
+	struct rockchip_spi *regs = priv->regs;
+	uint ctrlr0 = priv->cr0;
+	u32 tmod;
+
+	if (dout)
+		tmod = TMOD_TR;
+	else
+		tmod = TMOD_RO;
+
+	ctrlr0 |= (tmod & TMOD_MASK) << TMOD_SHIFT;
+	writel(ctrlr0, &regs->ctrlr0);
+
+	return 0;
+}
+
+void rockchip_spi_release_bus(u8 bus)
+{
+	struct rockchip_spi_priv *priv = get_spi_bus(bus);
+
+	rkspi_enable_chip(priv->regs, false);
+}
+
+int rockchip_spi_xfer(u8 bus, u8 cs, unsigned int bitlen, const void *dout, void *din, unsigned long flags)
+{
+	struct rockchip_spi_priv *priv = get_spi_bus(bus);
+	struct rockchip_spi *regs = priv->regs;
+	int len = bitlen >> 3;
+	const u8 *out = dout;
+	u8 *in = din;
+	int toread, towrite;
+	int ret;
+
+	rockchip_spi_config(priv, dout);
+
+	debug("%s: dout=%p, din=%p, len=%x, flags=%lx\n", __func__, dout, din,
+	      len, flags);
+	if (DEBUG_RK_SPI)
+		rkspi_dump_regs(regs);
+
+	/* Assert CS before transfer */
+	if (flags & SPI_XFER_BEGIN)
+		spi_cs_activate(bus, cs);
+
+	while (len > 0) {
+		int todo = min(len, 0xffff);
+
+		rkspi_enable_chip(regs, false);
+		writel(todo - 1, &regs->ctrlr1);
+		rkspi_enable_chip(regs, true);
+
+		toread = todo;
+		towrite = todo;
+		while (toread || towrite) {
+			u32 status = readl(&regs->sr);
+
+			if (towrite && !(status & SR_TF_FULL)) {
+				if (out)
+					writel(out ? *out++ : 0, regs->txdr);
+				towrite--;
+			}
+			if (toread && !(status & SR_RF_EMPT)) {
+				u32 byte = readl(regs->rxdr);
+
+				if (in)
+					*in++ = byte;
+				toread--;
+			}
+		}
+		ret = rkspi_wait_till_not_busy(regs);
+		if (ret)
+			break;
+		len -= todo;
+	}
+
+	/* Deassert CS after transfer */
+	if (flags & SPI_XFER_END)
+		spi_cs_deactivate(bus, cs);
+
+	rkspi_enable_chip(regs, false);
+
+	return ret;
+}
+
+int rockchip_spi_write_then_read(u8 bus, u8 cs, const u8 *opcode,
+				 size_t n_opcode, const u8 *txbuf, u8 *rxbuf,
+			size_t n_buf)
+{
+	unsigned long flags = SPI_XFER_BEGIN;
+	int ret;
+
+	if (n_buf == 0)
+		flags |= SPI_XFER_END;
+
+	ret = rockchip_spi_xfer(bus, cs, n_opcode * 8, opcode, NULL, flags);
+	if (ret) {
+		debug("spi: failed to send command (%zu bytes): %d\n",
+		      n_opcode, ret);
+	} else if (n_buf != 0) {
+		ret = rockchip_spi_xfer(bus, cs, n_buf * 8, txbuf, rxbuf, SPI_XFER_END);
+		if (ret)
+			debug("spi: failed to transfer %zu bytes of data: %d\n",
+			      n_buf, ret);
+	}
+
+	return ret;
+}
+
+void dbg_print_hex(char *s, void *buf, u32 width, u32 len)
+{
+	u32 i, j;
+	unsigned char *p8 = (unsigned char *)buf;
+	unsigned short *p16 = (unsigned short *)buf;
+	u32 *p32 = (u32 *)buf;
+
+	j = 0;
+
+	for (i = 0; i < len; i++) {
+		if (j == 0)
+			printf("%s %p + 0x%x:", s, buf, i * width);
+
+		if (width == 4)
+			printf("0x%08x,", p32[i]);
+		else if (width == 2)
+			printf("0x%04x,", p16[i]);
+		else
+			printf("0x%02x,", p8[i]);
+
+		if (++j >= (16 / width)) {
+			j = 0;
+			printf("\n");
+		}
+	}
+
+	printf("\n");
+}
+
+static void spi_hw_init(void)
+{
+	/* Setting the clock and iomux */
+	/* todo */
+}
+
+int main(int argc, char * const argv[])
+{
+	int i;
+
+	/* Print the ABI version */
+	app_startup(argv);
+	printf("Example expects ABI version %d\n", XF_VERSION);
+	printf("Actual U-Boot ABI version %d\n", (int)get_version());
+
+	printf("rk_spi standalone version\n");
+
+	printf("argc = %d\n", argc);
+
+	for (i = 0; i <= argc; ++i) {
+		printf("argv[%d] = \"%s\"\n",
+		       i,
+			argv[i] ? argv[i] : "<NULL>");
+	}
+
+	/*
+	 * spi test demo
+	 */
+#if 1
+	u8 bus, cs;
+	unsigned char *pread, *pwrite;
+	u32 test_size = 0x100;
+	int ret;
+
+	pread = malloc(test_size);
+	if (!pread)
+		printf("%s pread malloc fail\n", __func__);
+	pwrite = malloc(test_size);
+	if (!pwrite) {
+		printf("%s pwrite malloc fail\n", __func__);
+		free(pwrite);
+
+		return -1;
+	}
+
+	for (i = 0; i < test_size; i++)
+		pwrite[i] = i;
+
+	bus = 4;
+	cs = 0;
+
+	spi_hw_init();
+
+	rockchip_spi_probe(bus, 0xfecb0000, 0, 20, SPI_MODE_3);
+	rockchip_spi_claim_bus(bus);
+
+	/*
+	 * SPI write
+	 */
+	ret = rockchip_spi_xfer(bus, cs, test_size * 8, pwrite, NULL, SPI_XFER_ONCE);
+	if (ret) {
+		printf("rockchip_spi_xfer fail ret=%d\n", ret);
+
+		return ret;
+	}
+
+	/*
+	 * SPI read
+	 */
+	rockchip_spi_xfer(bus, cs, test_size * 8, NULL, pread, SPI_XFER_ONCE);
+	if (ret) {
+		printf("rockchip_spi_xfer fail ret=%d\n", ret);
+
+		return ret;
+	}
+	dbg_print_hex("spi_read:", pread, 4, test_size / 4);
+
+	/*
+	 * SPI duplex
+	 */
+	rockchip_spi_xfer(bus, cs, test_size * 8, pwrite, pread, SPI_XFER_ONCE);
+	if (ret) {
+		printf("rockchip_spi_xfer fail ret=%d\n", ret);
+
+		return ret;
+	}
+	dbg_print_hex("spi_duplex:", pread, 4, test_size / 4);
+
+	/*
+	 * SPI write then read
+	 */
+	rockchip_spi_write_then_read(bus, cs, pwrite, 1, NULL, pread, test_size);
+	if (ret) {
+		printf("rockchip_spi_xfer fail ret=%d\n", ret);
+
+		return ret;
+	}
+	dbg_print_hex("spi_write_then_read:", pread, 4, test_size / 4);
+
+	rockchip_spi_release_bus(bus);
+#endif
+
+	printf("Hit any key to exit ... ");
+	while (!tstc())
+		;
+	/* consume input */
+	(void)getc();
+
+	printf("\n\n");
+
+	return 0;
+}
diff --git a/u-boot/examples/standalone/rkspi.h b/u-boot/examples/standalone/rkspi.h
new file mode 100644
index 0000000..a836cfc
--- /dev/null
+++ b/u-boot/examples/standalone/rkspi.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef _DRIVER_SPI_H_
+#define _DRIVER_SPI_H_
+
+struct rockchip_spi {
+	u32 ctrlr0;
+	u32 ctrlr1;
+	u32 enr;
+	u32 ser;
+	u32 baudr;
+	u32 txftlr;
+	u32 rxftlr;
+	u32 txflr;
+	u32 rxflr;
+	u32 sr;
+	u32 ipr;
+	u32 imr;
+	u32 isr;
+	u32 risr;
+	u32 icr;
+	u32 dmacr;
+	u32 dmatdlr;
+	u32 dmardlr;		/* 0x44 */
+	u32 reserved[0xef];
+	u32 txdr[0x100];	/* 0x400 */
+	u32 rxdr[0x100];	/* 0x800 */
+};
+
+/* CTRLR0 */
+enum {
+	DFS_SHIFT	= 0,	/* Data Frame Size */
+	DFS_MASK	= 3,
+	DFS_4BIT	= 0,
+	DFS_8BIT,
+	DFS_16BIT,
+	DFS_RESV,
+
+	CFS_SHIFT	= 2,	/* Control Frame Size */
+	CFS_MASK	= 0xf,
+
+	SCPH_SHIFT	= 6,	/* Serial Clock Phase */
+	SCPH_MASK	= 1,
+	SCPH_TOGMID	= 0,	/* SCLK toggles in middle of first data bit */
+	SCPH_TOGSTA,		/* SCLK toggles at start of first data bit */
+
+	SCOL_SHIFT	= 7,	/* Serial Clock Polarity */
+	SCOL_MASK	= 1,
+	SCOL_LOW	= 0,	/* Inactive state of serial clock is low */
+	SCOL_HIGH,		/* Inactive state of serial clock is high */
+
+	CSM_SHIFT	= 8,	/* Chip Select Mode */
+	CSM_MASK	= 0x3,
+	CSM_KEEP	= 0,	/* ss_n stays low after each frame  */
+	CSM_HALF,		/* ss_n high for half sclk_out cycles */
+	CSM_ONE,		/* ss_n high for one sclk_out cycle */
+	CSM_RESV,
+
+	SSN_DELAY_SHIFT	= 10,	/* SSN to Sclk_out delay */
+	SSN_DELAY_MASK	= 1,
+	SSN_DELAY_HALF	= 0,	/* 1/2 sclk_out cycle */
+	SSN_DELAY_ONE	= 1,	/* 1 sclk_out cycle */
+
+	SEM_SHIFT	= 11,	/* Serial Endian Mode */
+	SEM_MASK	= 1,
+	SEM_LITTLE	= 0,	/* little endian */
+	SEM_BIG,		/* big endian */
+
+	FBM_SHIFT	= 12,	/* First Bit Mode */
+	FBM_MASK	= 1,
+	FBM_MSB		= 0,	/* first bit is MSB */
+	FBM_LSB,		/* first bit in LSB */
+
+	HALF_WORD_TX_SHIFT = 13,	/* Byte and Halfword Transform */
+	HALF_WORD_MASK	= 1,
+	HALF_WORD_ON	= 0,	/* apb 16bit write/read, spi 8bit write/read */
+	HALF_WORD_OFF,		/* apb 8bit write/read, spi 8bit write/read */
+
+	RXDSD_SHIFT	= 14,	/* Rxd Sample Delay, in cycles */
+	RXDSD_MASK	= 3,
+
+	FRF_SHIFT	= 16,	/* Frame Format */
+	FRF_MASK	= 3,
+	FRF_SPI		= 0,	/* Motorola SPI */
+	FRF_SSP,			/* Texas Instruments SSP*/
+	FRF_MICROWIRE,		/* National Semiconductors Microwire */
+	FRF_RESV,
+
+	TMOD_SHIFT	= 18,	/* Transfer Mode */
+	TMOD_MASK	= 3,
+	TMOD_TR		= 0,	/* xmit & recv */
+	TMOD_TO,		/* xmit only */
+	TMOD_RO,		/* recv only */
+	TMOD_RESV,
+
+	OMOD_SHIFT	= 20,	/* Operation Mode */
+	OMOD_MASK	= 1,
+	OMOD_MASTER	= 0,	/* Master Mode */
+	OMOD_SLAVE,		/* Slave Mode */
+};
+
+/* SR */
+enum {
+	SR_MASK		= 0x7f,
+	SR_BUSY		= 1 << 0,
+	SR_TF_FULL	= 1 << 1,
+	SR_TF_EMPT	= 1 << 2,
+	SR_RF_EMPT	= 1 << 3,
+	SR_RF_FULL	= 1 << 4,
+};
+
+#define ROCKCHIP_SPI_TIMEOUT_MS		1000
+
+#define SPI_XFER_BEGIN		BIT(0)	/* Assert CS before transfer */
+#define SPI_XFER_END		BIT(1)	/* Deassert CS after transfer */
+#define SPI_XFER_ONCE		(SPI_XFER_BEGIN | SPI_XFER_END)
+
+/* SPI mode flags */
+#define SPI_CPHA	BIT(0)			/* clock phase */
+#define SPI_CPOL	BIT(1)			/* clock polarity */
+#define SPI_MODE_0	(0 | 0)			/* (original MicroWire) */
+#define SPI_MODE_1	(0 | SPI_CPHA)
+#define SPI_MODE_2	(SPI_CPOL | 0)
+#define SPI_MODE_3	(SPI_CPOL | SPI_CPHA)
+
+int rockchip_spi_probe(u8 bus, uintptr_t base_addr, u32 rsd, u32 clock_div, u32 mode);
+int rockchip_spi_claim_bus(u8 bus);
+void rockchip_spi_release_bus(u8 bus);
+int rockchip_spi_xfer(u8 bus, u8 cs, unsigned int bitlen, const void *dout, void *din, unsigned long flags);
+int rockchip_spi_write_then_read(u8 bus, u8 cs,
+				 const u8 *opcode, size_t n_opcode,
+				 const u8 *txbuf, u8 *rxbuf, size_t n_buf);
+
+#endif
diff --git a/u-boot/fs/ubifs/debug.h b/u-boot/fs/ubifs/debug.h
index 0d8ed57..87a13f2 100644
--- a/u-boot/fs/ubifs/debug.h
+++ b/u-boot/fs/ubifs/debug.h
@@ -166,40 +166,22 @@
 		 dbg_snprintf_key(c, key, __tmp_key_buf, DBG_KEY_BUF_LEN));    \
 } while (0)
 #else
-#define ubifs_assert(expr) do {                                                \
-	if (unlikely(!(expr))) {                                               \
-		pr_debug("UBIFS assert failed in %s at %u\n",                  \
-		       __func__, __LINE__);                                    \
-		dump_stack();                                                  \
-	}                                                                      \
-} while (0)
 
-#define ubifs_assert_cmt_locked(c) do {                                        \
-	if (unlikely(down_write_trylock(&(c)->commit_sem))) {                  \
-		up_write(&(c)->commit_sem);                                    \
-		pr_debug("commit lock is not locked!\n");                      \
-		ubifs_assert(0);                                               \
-	}                                                                      \
-} while (0)
+#include <log.h>
+#define ubifs_assert(expr) assert(expr)
+#define ubifs_assert_cmt_locked(c) do { } while (0)
 
 #define ubifs_dbg_msg(type, fmt, ...) \
 	pr_debug("UBIFS DBG " type ": " fmt "\n",                              \
 		 ##__VA_ARGS__)
 
 #define DBG_KEY_BUF_LEN 48
-#if defined CONFIG_MTD_DEBUG
 #define ubifs_dbg_msg_key(type, key, fmt, ...) do {                            \
 	char __tmp_key_buf[DBG_KEY_BUF_LEN];                                   \
 	pr_debug("UBIFS DBG " type ": " fmt "%s\n",                            \
 		 ##__VA_ARGS__,                                                \
 		 dbg_snprintf_key(c, key, __tmp_key_buf, DBG_KEY_BUF_LEN));    \
 } while (0)
-#else
-#define ubifs_dbg_msg_key(type, key, fmt, ...) do {                            \
-	pr_debug("UBIFS DBG\n");                                               \
-} while (0)
-
-#endif
 
 #endif
 
diff --git a/u-boot/fs/ubifs/io.c b/u-boot/fs/ubifs/io.c
index 51a95bb..cad7587 100644
--- a/u-boot/fs/ubifs/io.c
+++ b/u-boot/fs/ubifs/io.c
@@ -111,7 +111,7 @@
 int ubifs_leb_write(struct ubifs_info *c, int lnum, const void *buf, int offs,
 		    int len)
 {
-	int err;
+	int err = 0;
 
 	ubifs_assert(!c->ro_media && !c->ro_mount);
 	if (c->ro_error)
@@ -133,7 +133,7 @@
 
 int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len)
 {
-	int err;
+	int err = 0;
 
 	ubifs_assert(!c->ro_media && !c->ro_mount);
 	if (c->ro_error)
@@ -155,7 +155,7 @@
 
 int ubifs_leb_unmap(struct ubifs_info *c, int lnum)
 {
-	int err;
+	int err = 0;
 
 	ubifs_assert(!c->ro_media && !c->ro_mount);
 	if (c->ro_error)
@@ -176,7 +176,7 @@
 
 int ubifs_leb_map(struct ubifs_info *c, int lnum)
 {
-	int err;
+	int err = 0;
 
 	ubifs_assert(!c->ro_media && !c->ro_mount);
 	if (c->ro_error)
diff --git a/u-boot/fs/ubifs/super.c b/u-boot/fs/ubifs/super.c
index effa8d9..b7f39cc 100644
--- a/u-boot/fs/ubifs/super.c
+++ b/u-boot/fs/ubifs/super.c
@@ -1749,6 +1749,8 @@
 	kfree(c->bottom_up_buf);
 	ubifs_debugging_exit(c);
 #ifdef __UBOOT__
+	ubi_close_volume(c->ubi);
+	mutex_unlock(&c->umount_mutex);
 	/* Finally free U-Boot's global copy of superblock */
 	if (ubifs_sb != NULL) {
 		free(ubifs_sb->s_fs_info);
@@ -2050,9 +2052,9 @@
 	ubifs_umount(c);
 #ifndef __UBOOT__
 	bdi_destroy(&c->bdi);
-#endif
 	ubi_close_volume(c->ubi);
 	mutex_unlock(&c->umount_mutex);
+#endif
 }
 #endif
 
@@ -2319,6 +2321,9 @@
 
 out_umount:
 	ubifs_umount(c);
+#ifdef __UBOOT__
+	goto out;
+#endif
 out_unlock:
 	mutex_unlock(&c->umount_mutex);
 #ifndef __UBOOT__
@@ -2356,7 +2361,9 @@
 		return ERR_PTR(err);
 	}
 
+#ifndef __UBOOT__
 	INIT_HLIST_NODE(&s->s_instances);
+#endif
 	INIT_LIST_HEAD(&s->s_inodes);
 	s->s_time_gran = 1000000000;
 	s->s_flags = flags;
@@ -2425,14 +2432,12 @@
 #ifndef __UBOOT__
 	strlcpy(s->s_id, type->name, sizeof(s->s_id));
 	list_add_tail(&s->s_list, &super_blocks);
-#else
-	strncpy(s->s_id, type->name, sizeof(s->s_id));
-#endif
 	hlist_add_head(&s->s_instances, &type->fs_supers);
-#ifndef __UBOOT__
 	spin_unlock(&sb_lock);
 	get_filesystem(type);
 	register_shrinker(&s->s_shrink);
+#else
+	strncpy(s->s_id, type->name, sizeof(s->s_id));
 #endif
 	return s;
 }
@@ -2457,7 +2462,7 @@
 	 */
 	ubi = open_ubi(name, UBI_READONLY);
 	if (IS_ERR(ubi)) {
-		pr_err("UBIFS error (pid: %d): cannot open \"%s\", error %d",
+		pr_err("UBIFS error (pid: %d): cannot open \"%s\", error %d\n",
 		       current->pid, name, (int)PTR_ERR(ubi));
 		return ERR_CAST(ubi);
 	}
@@ -2599,7 +2604,7 @@
 	 * UBIFS_BLOCK_SIZE. It is assumed that both are powers of 2.
 	 */
 	if (PAGE_CACHE_SIZE < UBIFS_BLOCK_SIZE) {
-		pr_err("UBIFS error (pid %d): VFS page cache size is %u bytes, but UBIFS requires at least 4096 bytes",
+		pr_err("UBIFS error (pid %d): VFS page cache size is %u bytes, but UBIFS requires at least 4096 bytes\n",
 		       current->pid, (unsigned int)PAGE_CACHE_SIZE);
 		return -EINVAL;
 	}
@@ -2628,7 +2633,7 @@
 
 	err = register_filesystem(&ubifs_fs_type);
 	if (err) {
-		pr_err("UBIFS error (pid %d): cannot register file system, error %d",
+		pr_err("UBIFS error (pid %d): cannot register file system, error %d\n",
 		       current->pid, err);
 		goto out_dbg;
 	}
diff --git a/u-boot/fs/ubifs/tnc.c b/u-boot/fs/ubifs/tnc.c
index f6316a3..77811ca 100644
--- a/u-boot/fs/ubifs/tnc.c
+++ b/u-boot/fs/ubifs/tnc.c
@@ -46,6 +46,11 @@
 	NOT_ON_MEDIA = 3,
 };
 
+static int try_read_node(const struct ubifs_info *c, void *buf, int type,
+			 int len, int lnum, int offs);
+static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
+			      struct ubifs_zbranch *zbr, void *node);
+
 /**
  * insert_old_idx - record an index node obsoleted since the last commit start.
  * @c: UBIFS file-system description object
@@ -398,7 +403,19 @@
 		return 0;
 	}
 
-	err = ubifs_tnc_read_node(c, zbr, node);
+	if (c->replaying) {
+		err = fallible_read_node(c, &zbr->key, zbr, node);
+		/*
+		 * When the node was not found, return -ENOENT, 0 otherwise.
+		 * Negative return codes stay as-is.
+		 */
+		if (err == 0)
+			err = -ENOENT;
+		else if (err == 1)
+			err = 0;
+	} else {
+		err = ubifs_tnc_read_node(c, zbr, node);
+	}
 	if (err)
 		return err;
 
@@ -2766,7 +2783,11 @@
 	if (nm->name) {
 		if (err) {
 			/* Handle collisions */
-			err = resolve_collision(c, key, &znode, &n, nm);
+			if (c->replaying)
+				err = fallible_resolve_collision(c, key, &znode, &n,
+								 nm, 0);
+			else
+				err = resolve_collision(c, key, &znode, &n, nm);
 			dbg_tnc("rc returned %d, znode %p, n %d",
 				err, znode, n);
 			if (unlikely(err < 0))
diff --git a/u-boot/fs/ubifs/ubifs.c b/u-boot/fs/ubifs/ubifs.c
index 739df5d..a9ca923 100644
--- a/u-boot/fs/ubifs/ubifs.c
+++ b/u-boot/fs/ubifs/ubifs.c
@@ -126,6 +126,7 @@
 {
 	struct ubifs_compressor *compr = ubifs_compressors[tfm->compressor];
 	int err;
+	size_t tmp_len = *dlen;
 
 	if (compr->compr_type == UBIFS_COMPR_NONE) {
 		memcpy(dst, src, slen);
@@ -133,11 +134,12 @@
 		return 0;
 	}
 
-	err = compr->decompress(src, slen, dst, (size_t *)dlen);
+	err = compr->decompress(src, slen, dst, &tmp_len);
 	if (err)
 		ubifs_err(c, "cannot decompress %d bytes, compressor %s, "
 			  "error %d", slen, compr->name, err);
 
+	*dlen = tmp_len;
 	return err;
 
 	return 0;
@@ -466,14 +468,10 @@
 		dbg_gen("cannot find next direntry, error %d", err);
 
 out_free:
-	if (file->private_data)
-		kfree(file->private_data);
-	if (file)
-		free(file);
-	if (dentry)
-		free(dentry);
-	if (dir)
-		free(dir);
+	kfree(file->private_data);
+	free(file);
+	free(dentry);
+	free(dir);
 
 	return ret;
 }
@@ -801,6 +799,8 @@
 
 				if (last_block_size)
 					dlen = last_block_size;
+				else if (ret)
+					dlen = UBIFS_BLOCK_SIZE;
 				else
 					dlen = le32_to_cpu(dn->size);
 
diff --git a/u-boot/fs/ubifs/ubifs.h b/u-boot/fs/ubifs/ubifs.h
index 1d89465..7fc6e41 100644
--- a/u-boot/fs/ubifs/ubifs.h
+++ b/u-boot/fs/ubifs/ubifs.h
@@ -317,8 +317,8 @@
 	struct backing_dev_info *s_bdi;
 #endif
 	struct mtd_info		*s_mtd;
-	struct hlist_node	s_instances;
 #ifndef __UBOOT__
+	struct hlist_node	s_instances;
 	struct quota_info	s_dquot;	/* Diskquota specific options */
 #endif
 
@@ -611,16 +611,20 @@
 /* misc.h */
 #define mutex_lock_nested(...)
 #define mutex_unlock_nested(...)
-#define mutex_is_locked(...)	0
+#define mutex_is_locked(...)	1
 #endif
 
 /* Version of this UBIFS implementation */
 #define UBIFS_VERSION 1
 
 /* Normal UBIFS messages */
+#ifdef CONFIG_UBIFS_SILENCE_MSG
+#define ubifs_msg(c, fmt, ...)
+#else
 #define ubifs_msg(c, fmt, ...)                                      \
 	pr_notice("UBIFS (ubi%d:%d): " fmt "\n",                    \
 		  (c)->vi.ubi_num, (c)->vi.vol_id, ##__VA_ARGS__)
+#endif
 /* UBIFS error messages */
 #ifndef __UBOOT__
 #define ubifs_err(c, fmt, ...)                                      \
diff --git a/u-boot/include/android_ab.h b/u-boot/include/android_ab.h
index aa621ca..15be4b8 100644
--- a/u-boot/include/android_ab.h
+++ b/u-boot/include/android_ab.h
@@ -47,7 +47,7 @@
 int read_misc_virtual_ab_message(struct misc_virtual_ab_message *message);
 int write_misc_virtual_ab_message(struct misc_virtual_ab_message *message);
 
-void ab_update_root_uuid(void);
+void ab_update_root_partition(void);
 int ab_get_slot_suffix(char *slot_suffix);
 int ab_is_support_dynamic_partition(struct blk_desc *dev_desc);
 int ab_decrease_tries(void);
diff --git a/u-boot/include/android_avb/avb_ops_user.h b/u-boot/include/android_avb/avb_ops_user.h
index 36a98da..28e807b 100755
--- a/u-boot/include/android_avb/avb_ops_user.h
+++ b/u-boot/include/android_avb/avb_ops_user.h
@@ -63,6 +63,22 @@
 /* Frees an AvbOps instance previously allocated with avb_ops_device_new(). */
 void avb_ops_user_free(AvbOps* ops);
 
+struct preloaded_partition {
+	uint8_t *addr;
+	size_t size; // 0 means the partition hasn't yet been preloaded
+};
+
+struct AvbOpsData {
+	struct AvbOps *ops;
+	const char *iface;
+	const char *devnum;
+	const char *slot_suffix;
+	struct preloaded_partition boot;
+	struct preloaded_partition vendor_boot;
+	struct preloaded_partition init_boot;
+	struct preloaded_partition resource;
+};
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/u-boot/include/android_image.h b/u-boot/include/android_image.h
index 8af0998..8ebd10d 100644
--- a/u-boot/include/android_image.h
+++ b/u-boot/include/android_image.h
@@ -13,8 +13,10 @@
 
 #define ANDROID_PARTITION_BOOT "boot"
 #define ANDROID_PARTITION_VENDOR_BOOT "vendor_boot"
+#define ANDROID_PARTITION_INIT_BOOT "init_boot"
 #define ANDROID_PARTITION_MISC "misc"
 #define ANDROID_PARTITION_OEM  "oem"
+#define ANDROID_PARTITION_RESOURCE  "resource"
 #define ANDROID_PARTITION_RECOVERY  "recovery"
 #define ANDROID_PARTITION_SYSTEM "system"
 #define ANDROID_PARTITION_VBMETA "vbmeta"
@@ -117,7 +119,6 @@
      * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34
      * into this structure to compatible with boot_img_hdr_v012.
      */
-    u32 boot_ramdisk_size;   /* size in bytes */
     u32 vendor_ramdisk_size; /* size in bytes */
     u32 vendor_page_size;
     u32 vendor_header_version;
@@ -135,6 +136,9 @@
     u32 vendor_ramdisk_table_entry_size;
     u32 vendor_bootconfig_size; /* size in bytes for bootconfig image */
 
+    void *init_boot_buf;
+    void *vendor_boot_buf;
+
     /*
      * Don't define 'char total_cmdline[TOTAL_BOOT_ARGS_SIZE]' to avoid
      * this structrue is over size than page_size.
diff --git a/u-boot/include/asm-generic/atomic-long.h b/u-boot/include/asm-generic/atomic-long.h
index d0469ef..32f288b 100644
--- a/u-boot/include/asm-generic/atomic-long.h
+++ b/u-boot/include/asm-generic/atomic-long.h
@@ -66,6 +66,7 @@
 	atomic64_sub(i, v);
 }
 
+#ifndef __UBOOT__
 static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
 {
 	atomic64_t *v = (atomic64_t *)l;
@@ -135,6 +136,7 @@
 	(atomic64_cmpxchg((atomic64_t *)(l), (old), (new)))
 #define atomic_long_xchg(v, new) \
 	(atomic64_xchg((atomic64_t *)(v), (new)))
+#endif  /*  __UBOOT__ */
 
 #else  /*  BITS_PER_LONG == 64  */
 
diff --git a/u-boot/include/asm-generic/u-boot.h b/u-boot/include/asm-generic/u-boot.h
index 17493cb..43775c5 100644
--- a/u-boot/include/asm-generic/u-boot.h
+++ b/u-boot/include/asm-generic/u-boot.h
@@ -87,8 +87,6 @@
 	ulong	        bi_arch_number;	/* unique id for this board */
 	ulong	        bi_boot_params;	/* where this board expects params */
 
-	/* same as android image header 'os_version' */
-	unsigned int	bi_andr_version;
 #ifdef CONFIG_NR_DRAM_BANKS
 	struct {			/* RAM configuration */
 		u64 start;
diff --git a/u-boot/include/boot_rkimg.h b/u-boot/include/boot_rkimg.h
index cb57818..eb8b1ef 100644
--- a/u-boot/include/boot_rkimg.h
+++ b/u-boot/include/boot_rkimg.h
@@ -19,6 +19,7 @@
 	BOOT_MODE_PANIC,
 	BOOT_MODE_WATCHDOG,
 	BOOT_MODE_DFU,
+	BOOT_MODE_QUIESCENT,
 	BOOT_MODE_UNDEFINE,
 };
 
diff --git a/u-boot/include/charset.h b/u-boot/include/charset.h
index 39279f7..0d06b03 100644
--- a/u-boot/include/charset.h
+++ b/u-boot/include/charset.h
@@ -9,6 +9,9 @@
 #ifndef __CHARSET_H_
 #define __CHARSET_H_
 
+#include <linux/kernel.h>
+#include <linux/types.h>
+
 #define MAX_UTF8_PER_UTF16 4
 
 /**
diff --git a/u-boot/include/configs/evb_rk3528.h b/u-boot/include/configs/evb_rk3528.h
new file mode 100644
index 0000000..f315482
--- /dev/null
+++ b/u-boot/include/configs/evb_rk3528.h
@@ -0,0 +1,26 @@
+/*
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * Copyright (c) 2020 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef __CONFIGS_RK3528_EVB_H
+#define __CONFIGS_RK3528_EVB_H
+
+#include <configs/rk3528_common.h>
+
+#ifndef CONFIG_SPL_BUILD
+
+#undef ROCKCHIP_DEVICE_SETTINGS
+#define ROCKCHIP_DEVICE_SETTINGS \
+		"stdin=serial,usbkbd\0" \
+		"stdout=serial,vidconsole\0" \
+		"stderr=serial,vidconsole\0"
+
+#define CONFIG_SYS_MMC_ENV_DEV		0
+
+#undef CONFIG_BOOTCOMMAND
+#define CONFIG_BOOTCOMMAND RKIMG_BOOTCOMMAND
+#endif
+
+#endif /* __CONFIGS_RK3528_EVB_H */
diff --git a/u-boot/include/configs/evb_rk3562.h b/u-boot/include/configs/evb_rk3562.h
new file mode 100644
index 0000000..8f555ac
--- /dev/null
+++ b/u-boot/include/configs/evb_rk3562.h
@@ -0,0 +1,26 @@
+/*
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef __CONFIGS_RK3562_EVB_H
+#define __CONFIGS_RK3562_EVB_H
+
+#include <configs/rk3562_common.h>
+
+#ifndef CONFIG_SPL_BUILD
+
+#undef ROCKCHIP_DEVICE_SETTINGS
+#define ROCKCHIP_DEVICE_SETTINGS \
+		"stdin=serial,usbkbd\0" \
+		"stdout=serial,vidconsole\0" \
+		"stderr=serial,vidconsole\0"
+
+#define CONFIG_SYS_MMC_ENV_DEV		0
+
+#undef CONFIG_BOOTCOMMAND
+#define CONFIG_BOOTCOMMAND RKIMG_BOOTCOMMAND
+#endif
+
+#endif /* __CONFIGS_RK3562_EVB_H */
diff --git a/u-boot/include/configs/rk3288_common.h b/u-boot/include/configs/rk3288_common.h
index 1ffa23e..be29922 100644
--- a/u-boot/include/configs/rk3288_common.h
+++ b/u-boot/include/configs/rk3288_common.h
@@ -59,7 +59,7 @@
 #define ENV_MEM_LAYOUT_SETTINGS \
 	"scriptaddr=0x00000000\0" \
 	"pxefile_addr_r=0x00100000\0" \
-	"fdt_addr_r=0x08300000\0" \
+	"fdt_addr_r=0x08100000\0" \
 	"kernel_addr_r=0x02008000\0" \
 	"ramdisk_addr_r=0x0a200000\0"
 
diff --git a/u-boot/include/configs/rk3528_common.h b/u-boot/include/configs/rk3528_common.h
new file mode 100644
index 0000000..ad81095
--- /dev/null
+++ b/u-boot/include/configs/rk3528_common.h
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier:     GPL-2.0+ */
+/*
+ * (C) Copyright 2020 Rockchip Electronics Co., Ltd
+ *
+ */
+
+#ifndef __CONFIG_RK3528_COMMON_H
+#define __CONFIG_RK3528_COMMON_H
+
+#include "rockchip-common.h"
+
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_TEXT_BASE		0x00000000
+#define CONFIG_SPL_MAX_SIZE		0x00040000
+#define CONFIG_SPL_BSS_START_ADDR	0x03fe0000
+#define CONFIG_SPL_BSS_MAX_SIZE		0x00010000
+#define CONFIG_SPL_STACK		0x03fe0000
+
+#define CONFIG_SYS_MALLOC_LEN		(32 << 20)
+#define CONFIG_SYS_CBSIZE		1024
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
+#ifdef CONFIG_SUPPORT_USBPLUG
+#define CONFIG_SYS_TEXT_BASE		0x00000000
+#else
+#define CONFIG_SYS_TEXT_BASE		0x00200000
+#endif
+
+#define CONFIG_SYS_INIT_SP_ADDR		0x00c00000
+#define CONFIG_SYS_LOAD_ADDR		0x00c00800
+#define CONFIG_SYS_BOOTM_LEN		(64 << 20)	/* 64M */
+#define COUNTER_FREQUENCY		24000000
+
+#define GICD_BASE			0xfed01000
+#define GICC_BASE			0xfed02000
+
+#ifdef CONFIG_SPL_DM_VIDEO
+#undef CONFIG_SPL_MAX_SIZE
+#undef CONFIG_SPL_BSS_MAX_SIZE
+#define CONFIG_SPL_MAX_SIZE		0x00140000
+#define CONFIG_SPL_BSS_MAX_SIZE		0x00080000
+#endif
+
+#ifdef CONFIG_ARM_SMP
+#define SMP_CPU1			0x1
+#define SMP_CPU1_STACK			0x04fe0000
+#define SMP_CPU2			0x2
+#define SMP_CPU2_STACK			0x05fe0000
+#endif
+
+/* secure otp */
+#define OTP_UBOOT_ROLLBACK_OFFSET	0x350
+#define OTP_UBOOT_ROLLBACK_WORDS	2	/* 64 bits, 2 words */
+#define OTP_ALL_ONES_NUM_BITS		32
+#define OTP_SECURE_BOOT_ENABLE_ADDR	0x20
+#define OTP_SECURE_BOOT_ENABLE_SIZE	1
+#define OTP_RSA_HASH_ADDR		0x180
+#define OTP_RSA_HASH_SIZE		32
+
+/* MMC/SD IP block */
+#define CONFIG_BOUNCE_BUFFER
+
+#define CONFIG_SYS_SDRAM_BASE		0
+#define SDRAM_MAX_SIZE			0xfc000000
+#define CONFIG_PREBOOT
+#define CONFIG_SYS_NONCACHED_MEMORY	(1 << 20)	/* 1 MiB */
+
+#define CONFIG_SPL_LOAD_FIT_ADDRESS	0x2000000
+
+#ifndef CONFIG_SPL_BUILD
+/* usb mass storage */
+#define CONFIG_USB_FUNCTION_MASS_STORAGE
+#define CONFIG_ROCKUSB_G_DNL_PID	0x350c
+
+#ifdef CONFIG_ARM64
+#define ENV_MEM_LAYOUT_SETTINGS \
+	"scriptaddr=0x00c00000\0" \
+	"pxefile_addr_r=0x00e00000\0" \
+	"fdt_addr_r=0x08300000\0" \
+	"kernel_addr_r=0x00280000\0" \
+	"kernel_addr_c=0x04080000\0" \
+	"ramdisk_addr_r=0x0a200000\0"
+#else
+#define ENV_MEM_LAYOUT_SETTINGS \
+	"scriptaddr=0x00000000\0" \
+	"pxefile_addr_r=0x00100000\0" \
+	"fdt_addr_r=0x08300000\0" \
+	"kernel_addr_c=0x02008000\0" \
+	"kernel_addr_r=0x00208000\0" \
+	"ramdisk_addr_r=0x0a200000\0"
+#endif
+
+#include <config_distro_bootcmd.h>
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	ENV_MEM_LAYOUT_SETTINGS \
+	"partitions=" PARTS_RKIMG \
+	ROCKCHIP_DEVICE_SETTINGS \
+	RKIMG_DET_BOOTDEV \
+	BOOTENV
+#endif
+
+/* rockchip ohci host driver */
+#define CONFIG_USB_OHCI_NEW
+#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS	1
+
+#define CONFIG_LIB_HW_RAND
+
+#endif
diff --git a/u-boot/include/configs/rk3562_common.h b/u-boot/include/configs/rk3562_common.h
new file mode 100644
index 0000000..b076f90
--- /dev/null
+++ b/u-boot/include/configs/rk3562_common.h
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier:     GPL-2.0+ */
+/*
+ * (C) Copyright 2022 Rockchip Electronics Co., Ltd
+ *
+ */
+
+#ifndef __CONFIG_RK3562_COMMON_H
+#define __CONFIG_RK3562_COMMON_H
+
+#include "rockchip-common.h"
+
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_TEXT_BASE		0x00000000
+#define CONFIG_SPL_MAX_SIZE		0x00040000
+#define CONFIG_SPL_BSS_START_ADDR	0x03fe0000
+#define CONFIG_SPL_BSS_MAX_SIZE		0x00010000
+#define CONFIG_SPL_STACK		0x03fe0000
+
+#define CONFIG_SYS_MALLOC_LEN		(32 << 20)
+#define CONFIG_SYS_CBSIZE		1024
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
+#ifdef CONFIG_SUPPORT_USBPLUG
+#define CONFIG_SYS_TEXT_BASE		0x00000000
+#else
+#define CONFIG_SYS_TEXT_BASE		0x00200000
+#endif
+
+#define CONFIG_SYS_INIT_SP_ADDR		0x00c00000
+#define CONFIG_SYS_LOAD_ADDR		0x00c00800
+#define CONFIG_SYS_BOOTM_LEN		(64 << 20)	/* 64M */
+#define COUNTER_FREQUENCY		24000000
+
+#define GICD_BASE			0xfe901000
+#define GICC_BASE			0xfe902000
+
+/* secure otp */
+#define OTP_UBOOT_ROLLBACK_OFFSET	0x350
+#define OTP_UBOOT_ROLLBACK_WORDS	2	/* 64 bits, 2 words */
+#define OTP_ALL_ONES_NUM_BITS		32
+#define OTP_SECURE_BOOT_ENABLE_ADDR	0x20
+#define OTP_SECURE_BOOT_ENABLE_SIZE	1
+#define OTP_RSA_HASH_ADDR		0x180
+#define OTP_RSA_HASH_SIZE		32
+
+/* MMC/SD IP block */
+#define CONFIG_BOUNCE_BUFFER
+
+#define CONFIG_SYS_SDRAM_BASE		0
+#define SDRAM_MAX_SIZE			0xfc000000
+#define CONFIG_PREBOOT
+#define CONFIG_SYS_NONCACHED_MEMORY	(1 << 20)	/* 1 MiB */
+
+#define CONFIG_SPL_LOAD_FIT_ADDRESS	0x2000000
+
+#ifndef CONFIG_SPL_BUILD
+/* usb mass storage */
+#define CONFIG_USB_FUNCTION_MASS_STORAGE
+#define CONFIG_ROCKUSB_G_DNL_PID	0x350d
+
+#define ENV_MEM_LAYOUT_SETTINGS \
+	"scriptaddr=0x00c00000\0" \
+	"pxefile_addr_r=0x00e00000\0" \
+	"fdt_addr_r=0x08300000\0" \
+	"kernel_addr_r=0x00400000\0" \
+	"kernel_addr_c=0x04080000\0" \
+	"ramdisk_addr_r=0x0a200000\0"
+
+#include <config_distro_bootcmd.h>
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+	ENV_MEM_LAYOUT_SETTINGS \
+	"partitions=" PARTS_RKIMG \
+	ROCKCHIP_DEVICE_SETTINGS \
+	RKIMG_DET_BOOTDEV \
+	BOOTENV
+#endif
+
+/* rockchip ohci host driver */
+#define CONFIG_USB_OHCI_NEW
+#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS	1
+#define CONFIG_LIB_HW_RAND
+
+#endif
diff --git a/u-boot/include/configs/rk3588_common.h b/u-boot/include/configs/rk3588_common.h
index 5bb057a..1399468 100644
--- a/u-boot/include/configs/rk3588_common.h
+++ b/u-boot/include/configs/rk3588_common.h
@@ -15,14 +15,18 @@
 #define CONFIG_SPL_BSS_START_ADDR	0x03fe0000
 #define CONFIG_SPL_BSS_MAX_SIZE		0x00010000
 #define CONFIG_SPL_STACK		0x03fe0000
+#ifdef CONFIG_SPL_LOAD_FIT_ADDRESS
+#undef CONFIG_SPL_LOAD_FIT_ADDRESS
+#endif
+#define CONFIG_SPL_LOAD_FIT_ADDRESS	0x10000000
 
 #define CONFIG_SYS_MALLOC_LEN		(32 << 20)
 #define CONFIG_SYS_CBSIZE		1024
 #define CONFIG_SKIP_LOWLEVEL_INIT
 #define CONFIG_SYS_TEXT_BASE		0x00200000
 
-#define CONFIG_SYS_INIT_SP_ADDR		0x00400000
-#define CONFIG_SYS_LOAD_ADDR		0x00400800
+#define CONFIG_SYS_INIT_SP_ADDR		0x00600000
+#define CONFIG_SYS_LOAD_ADDR		0x00600800
 #define CONFIG_SYS_BOOTM_LEN		(64 << 20)	/* 64M */
 #define COUNTER_FREQUENCY		24000000
 
diff --git a/u-boot/include/configs/rockchip-common.h b/u-boot/include/configs/rockchip-common.h
index 870da94..002dcd6 100644
--- a/u-boot/include/configs/rockchip-common.h
+++ b/u-boot/include/configs/rockchip-common.h
@@ -158,7 +158,7 @@
 		"setenv devtype spinand; setenv devnum 0;" \
 	"elif rksfc dev 1; then " \
 		"setenv devtype spinor; setenv devnum 1;" \
-	"else" \
+	"else;" \
 		"setenv devtype ramdisk; setenv devnum 0;" \
 	"fi; \0"
 
diff --git a/u-boot/include/configs/rv1106_common.h b/u-boot/include/configs/rv1106_common.h
index 4974d55..1a03803 100644
--- a/u-boot/include/configs/rv1106_common.h
+++ b/u-boot/include/configs/rv1106_common.h
@@ -12,7 +12,6 @@
 #define COUNTER_FREQUENCY		24000000
 #define CONFIG_SYS_MALLOC_LEN		(16 << 20)
 #define CONFIG_SYS_CBSIZE		1024
-#define CONFIG_SKIP_LOWLEVEL_INIT
 #define CONFIG_SYS_NS16550_MEM32
 
 #define CONFIG_SYS_TEXT_BASE		0x00200000
diff --git a/u-boot/include/configs/rv1126_common.h b/u-boot/include/configs/rv1126_common.h
index ac173a9..8f7e94e 100644
--- a/u-boot/include/configs/rv1126_common.h
+++ b/u-boot/include/configs/rv1126_common.h
@@ -12,7 +12,6 @@
 #define COUNTER_FREQUENCY		24000000
 #define CONFIG_SYS_MALLOC_LEN		(32 << 20)
 #define CONFIG_SYS_CBSIZE		1024
-#define CONFIG_SKIP_LOWLEVEL_INIT
 #define CONFIG_SYS_NS16550_MEM32
 
 #ifdef CONFIG_SUPPORT_USBPLUG
@@ -106,6 +105,7 @@
 #endif
 #endif
 
+#define CONFIG_LIB_HW_RAND
 #define CONFIG_PREBOOT
 
 #endif
diff --git a/u-boot/include/configs/woodburn_common.h b/u-boot/include/configs/woodburn_common.h
index 9794f2d..1c66615 100644
--- a/u-boot/include/configs/woodburn_common.h
+++ b/u-boot/include/configs/woodburn_common.h
@@ -168,10 +168,6 @@
 #define CONFIG_MXC_NAND_HWECC
 #define CONFIG_SYS_NAND_LARGEPAGE
 
-#if 0
-#define CONFIG_MTD_DEBUG
-#define CONFIG_MTD_DEBUG_VERBOSE	7
-#endif
 #define CONFIG_SYS_NAND_ONFI_DETECTION
 
 /*
diff --git a/u-boot/include/dm/fdtaddr.h b/u-boot/include/dm/fdtaddr.h
index c46f0e9..9265677 100644
--- a/u-boot/include/dm/fdtaddr.h
+++ b/u-boot/include/dm/fdtaddr.h
@@ -35,6 +35,18 @@
 void *devfdt_get_addr_ptr(struct udevice *dev);
 
 /**
+ * devfdt_remap_addr_index() - Return indexed pointer to the memory-mapped
+ *                                 I/O address of the reg property of a device
+ * @index: the 'reg' property can hold a list of <addr, size> pairs
+ *         and @index is used to select which one is required
+ *
+ * @dev: Pointer to a device
+ *
+ * Return: Pointer to addr, or NULL if there is no such property
+ */
+void *devfdt_remap_addr_index(struct udevice *dev, int index);
+
+/**
  * devfdt_map_physmem() - Read device address from reg property of the
  *                     device node and map the address into CPU address
  *                     space.
diff --git a/u-boot/include/dm/read.h b/u-boot/include/dm/read.h
index 5f3738f..7c1d2f6 100644
--- a/u-boot/include/dm/read.h
+++ b/u-boot/include/dm/read.h
@@ -271,6 +271,18 @@
 int dev_read_addr_cells(struct udevice *dev);
 
 /**
+ * dev_remap_addr_index() - Get the indexed reg property of a device
+ *                               as a memory-mapped I/O pointer
+ *
+ * @dev: Device to read from
+ * @index: the 'reg' property can hold a list of <addr, size> pairs
+ *         and @index is used to select which one is required
+ *
+ * Return: pointer or NULL if not found
+ */
+void *dev_remap_addr_index(struct udevice *dev, int index);
+
+/**
  * dev_read_size_cells() - Get the number of size cells for a device's node
  *
  * This walks back up the tree to find the closest #size-cells property
@@ -588,6 +600,11 @@
 	return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev));
 }
 
+static inline void *dev_remap_addr_index(struct udevice *dev, int index)
+{
+	return devfdt_remap_addr_index(dev, index);
+}
+
 static inline int dev_read_size_cells(struct udevice *dev)
 {
 	/* NOTE: this call should walk up the parent stack */
diff --git a/u-boot/include/dm/uclass-id.h b/u-boot/include/dm/uclass-id.h
index b4c0c64..c2e12d4 100644
--- a/u-boot/include/dm/uclass-id.h
+++ b/u-boot/include/dm/uclass-id.h
@@ -89,6 +89,7 @@
 	UCLASS_THERMAL,		/* Thermal sensor */
 	UCLASS_TIMER,		/* Timer device */
 	UCLASS_TPM,		/* Trusted Platform Module TIS interface */
+	UCLASS_UFS,             /* Universal Flash Storage */
 	UCLASS_USB,		/* USB bus */
 	UCLASS_USB_DEV_GENERIC,	/* USB generic device */
 	UCLASS_USB_HUB,		/* USB hub */
diff --git a/u-boot/include/drm_modes.h b/u-boot/include/drm_modes.h
index eda5c94..a79dfdf 100644
--- a/u-boot/include/drm_modes.h
+++ b/u-boot/include/drm_modes.h
@@ -38,7 +38,6 @@
 #define DRM_MODE_FLAG_PIXMUX			(1 << 11)
 #define DRM_MODE_FLAG_DBLCLK			(1 << 12)
 #define DRM_MODE_FLAG_CLKDIV2			(1 << 13)
-#define DRM_MODE_FLAG_PPIXDATA			BIT(31)
 /*
  * When adding a new stereo mode don't forget to adjust DRM_MODE_FLAGS_3D_MAX
  * (define not exposed to user space).
@@ -212,6 +211,95 @@
 	bool invalid;
 };
 
+/**
+ * enum drm_mode_status - hardware support status of a mode
+ * @MODE_OK: Mode OK
+ * @MODE_HSYNC: hsync out of range
+ * @MODE_VSYNC: vsync out of range
+ * @MODE_H_ILLEGAL: mode has illegal horizontal timings
+ * @MODE_V_ILLEGAL: mode has illegal vertical timings
+ * @MODE_BAD_WIDTH: requires an unsupported linepitch
+ * @MODE_NOMODE: no mode with a matching name
+ * @MODE_NO_INTERLACE: interlaced mode not supported
+ * @MODE_NO_DBLESCAN: doublescan mode not supported
+ * @MODE_NO_VSCAN: multiscan mode not supported
+ * @MODE_MEM: insufficient video memory
+ * @MODE_VIRTUAL_X: mode width too large for specified virtual size
+ * @MODE_VIRTUAL_Y: mode height too large for specified virtual size
+ * @MODE_MEM_VIRT: insufficient video memory given virtual size
+ * @MODE_NOCLOCK: no fixed clock available
+ * @MODE_CLOCK_HIGH: clock required is too high
+ * @MODE_CLOCK_LOW: clock required is too low
+ * @MODE_CLOCK_RANGE: clock/mode isn't in a ClockRange
+ * @MODE_BAD_HVALUE: horizontal timing was out of range
+ * @MODE_BAD_VVALUE: vertical timing was out of range
+ * @MODE_BAD_VSCAN: VScan value out of range
+ * @MODE_HSYNC_NARROW: horizontal sync too narrow
+ * @MODE_HSYNC_WIDE: horizontal sync too wide
+ * @MODE_HBLANK_NARROW: horizontal blanking too narrow
+ * @MODE_HBLANK_WIDE: horizontal blanking too wide
+ * @MODE_VSYNC_NARROW: vertical sync too narrow
+ * @MODE_VSYNC_WIDE: vertical sync too wide
+ * @MODE_VBLANK_NARROW: vertical blanking too narrow
+ * @MODE_VBLANK_WIDE: vertical blanking too wide
+ * @MODE_PANEL: exceeds panel dimensions
+ * @MODE_INTERLACE_WIDTH: width too large for interlaced mode
+ * @MODE_ONE_WIDTH: only one width is supported
+ * @MODE_ONE_HEIGHT: only one height is supported
+ * @MODE_ONE_SIZE: only one resolution is supported
+ * @MODE_NO_REDUCED: monitor doesn't accept reduced blanking
+ * @MODE_NO_STEREO: stereo modes not supported
+ * @MODE_NO_420: ycbcr 420 modes not supported
+ * @MODE_STALE: mode has become stale
+ * @MODE_BAD: unspecified reason
+ * @MODE_ERROR: error condition
+ *
+ * This enum is used to filter out modes not supported by the driver/hardware
+ * combination.
+ */
+enum drm_mode_status {
+	MODE_OK = 0,
+	MODE_HSYNC,
+	MODE_VSYNC,
+	MODE_H_ILLEGAL,
+	MODE_V_ILLEGAL,
+	MODE_BAD_WIDTH,
+	MODE_NOMODE,
+	MODE_NO_INTERLACE,
+	MODE_NO_DBLESCAN,
+	MODE_NO_VSCAN,
+	MODE_MEM,
+	MODE_VIRTUAL_X,
+	MODE_VIRTUAL_Y,
+	MODE_MEM_VIRT,
+	MODE_NOCLOCK,
+	MODE_CLOCK_HIGH,
+	MODE_CLOCK_LOW,
+	MODE_CLOCK_RANGE,
+	MODE_BAD_HVALUE,
+	MODE_BAD_VVALUE,
+	MODE_BAD_VSCAN,
+	MODE_HSYNC_NARROW,
+	MODE_HSYNC_WIDE,
+	MODE_HBLANK_NARROW,
+	MODE_HBLANK_WIDE,
+	MODE_VSYNC_NARROW,
+	MODE_VSYNC_WIDE,
+	MODE_VBLANK_NARROW,
+	MODE_VBLANK_WIDE,
+	MODE_PANEL,
+	MODE_INTERLACE_WIDTH,
+	MODE_ONE_WIDTH,
+	MODE_ONE_HEIGHT,
+	MODE_ONE_SIZE,
+	MODE_NO_REDUCED,
+	MODE_NO_STEREO,
+	MODE_NO_420,
+	MODE_STALE = -3,
+	MODE_BAD = -2,
+	MODE_ERROR = -1
+};
+
 /*
  * Subsystem independent description of a videomode.
  * Can be generated from struct display_timing.
@@ -233,12 +321,16 @@
 };
 
 struct drm_display_mode *drm_mode_create(void);
+void drm_mode_copy(struct drm_display_mode *dst,
+		   const struct drm_display_mode *src);
 void drm_mode_destroy(struct drm_display_mode *mode);
 bool drm_mode_match(const struct drm_display_mode *mode1,
 		    const struct drm_display_mode *mode2,
 		    unsigned int match_flags);
 bool drm_mode_equal(const struct drm_display_mode *mode1,
 		    const struct drm_display_mode *mode2);
+void drm_display_mode_from_videomode(const struct videomode *vm,
+				     struct drm_display_mode *dmode);
 void drm_display_mode_to_videomode(const struct drm_display_mode *dmode,
 				   struct videomode *vm);
 
diff --git a/u-boot/include/dt-bindings/clock/rk3528-cru.h b/u-boot/include/dt-bindings/clock/rk3528-cru.h
new file mode 100644
index 0000000..807f19c
--- /dev/null
+++ b/u-boot/include/dt-bindings/clock/rk3528-cru.h
@@ -0,0 +1,754 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
+ * Author: Joseph Chen <chenjh@rock-chips.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3528_H
+#define _DT_BINDINGS_CLK_ROCKCHIP_RK3528_H
+
+/* cru-clocks indices */
+
+/* core clocks */
+#define PLL_APLL                       1
+#define PLL_CPLL                       2
+#define PLL_GPLL                       3
+#define PLL_PPLL                       4
+#define PLL_DPLL                       5
+#define ARMCLK                         6
+
+#define XIN_OSC0_HALF                  8
+#define CLK_MATRIX_50M_SRC             9
+#define CLK_MATRIX_100M_SRC            10
+#define CLK_MATRIX_150M_SRC            11
+#define CLK_MATRIX_200M_SRC            12
+#define CLK_MATRIX_250M_SRC            13
+#define CLK_MATRIX_300M_SRC            14
+#define CLK_MATRIX_339M_SRC            15
+#define CLK_MATRIX_400M_SRC            16
+#define CLK_MATRIX_500M_SRC            17
+#define CLK_MATRIX_600M_SRC            18
+#define CLK_UART0_SRC                  19
+#define CLK_UART0_FRAC                 20
+#define SCLK_UART0                     21
+#define CLK_UART1_SRC                  22
+#define CLK_UART1_FRAC                 23
+#define SCLK_UART1                     24
+#define CLK_UART2_SRC                  25
+#define CLK_UART2_FRAC                 26
+#define SCLK_UART2                     27
+#define CLK_UART3_SRC                  28
+#define CLK_UART3_FRAC                 29
+#define SCLK_UART3                     30
+#define CLK_UART4_SRC                  31
+#define CLK_UART4_FRAC                 32
+#define SCLK_UART4                     33
+#define CLK_UART5_SRC                  34
+#define CLK_UART5_FRAC                 35
+#define SCLK_UART5                     36
+#define CLK_UART6_SRC                  37
+#define CLK_UART6_FRAC                 38
+#define SCLK_UART6                     39
+#define CLK_UART7_SRC                  40
+#define CLK_UART7_FRAC                 41
+#define SCLK_UART7                     42
+#define CLK_I2S0_2CH_SRC               43
+#define CLK_I2S0_2CH_FRAC              44
+#define MCLK_I2S0_2CH_SAI_SRC          45
+#define CLK_I2S3_8CH_SRC               46
+#define CLK_I2S3_8CH_FRAC              47
+#define MCLK_I2S3_8CH_SAI_SRC          48
+#define CLK_I2S1_8CH_SRC               49
+#define CLK_I2S1_8CH_FRAC              50
+#define MCLK_I2S1_8CH_SAI_SRC          51
+#define CLK_I2S2_2CH_SRC               52
+#define CLK_I2S2_2CH_FRAC              53
+#define MCLK_I2S2_2CH_SAI_SRC          54
+#define CLK_SPDIF_SRC                  55
+#define CLK_SPDIF_FRAC                 56
+#define MCLK_SPDIF_SRC                 57
+#define DCLK_VOP_SRC0                  58
+#define DCLK_VOP_SRC1                  59
+#define CLK_HSM                        60
+#define CLK_CORE_SRC_ACS               63
+#define CLK_CORE_SRC_PVTMUX            65
+#define CLK_CORE_SRC                   66
+#define CLK_CORE                       67
+#define ACLK_M_CORE_BIU                68
+#define CLK_CORE_PVTPLL_SRC            69
+#define PCLK_DBG                       70
+#define SWCLKTCK                       71
+#define CLK_SCANHS_CORE                72
+#define CLK_SCANHS_ACLKM_CORE          73
+#define CLK_SCANHS_PCLK_DBG            74
+#define CLK_SCANHS_PCLK_CPU_BIU        76
+#define PCLK_CPU_ROOT                  77
+#define PCLK_CORE_GRF                  78
+#define PCLK_DAPLITE_BIU               79
+#define PCLK_CPU_BIU                   80
+#define CLK_REF_PVTPLL_CORE            81
+#define ACLK_BUS_VOPGL_ROOT            85
+#define ACLK_BUS_VOPGL_BIU             86
+#define ACLK_BUS_H_ROOT                87
+#define ACLK_BUS_H_BIU                 88
+#define ACLK_BUS_ROOT                  89
+#define HCLK_BUS_ROOT                  90
+#define PCLK_BUS_ROOT                  91
+#define ACLK_BUS_M_ROOT                92
+#define ACLK_SYSMEM_BIU                93
+#define CLK_TIMER_ROOT                 95
+#define ACLK_BUS_BIU                   96
+#define HCLK_BUS_BIU                   97
+#define PCLK_BUS_BIU                   98
+#define PCLK_DFT2APB                   99
+#define PCLK_BUS_GRF                   100
+#define ACLK_BUS_M_BIU                 101
+#define ACLK_GIC                       102
+#define ACLK_SPINLOCK                  103
+#define ACLK_DMAC                      104
+#define PCLK_TIMER                     105
+#define CLK_TIMER0                     106
+#define CLK_TIMER1                     107
+#define CLK_TIMER2                     108
+#define CLK_TIMER3                     109
+#define CLK_TIMER4                     110
+#define CLK_TIMER5                     111
+#define PCLK_JDBCK_DAP                 112
+#define CLK_JDBCK_DAP                  113
+#define PCLK_WDT_NS                    114
+#define TCLK_WDT_NS                    115
+#define HCLK_TRNG_NS                   116
+#define PCLK_UART0                     117
+#define CLK_CORE_CRYPTO                119
+#define CLK_PKA_CRYPTO                 120
+#define ACLK_CRYPTO                    121
+#define HCLK_CRYPTO                    122
+#define PCLK_DMA2DDR                   123
+#define ACLK_DMA2DDR                   124
+#define PCLK_PWM0                      126
+#define CLK_PWM0                       127
+#define CLK_CAPTURE_PWM0               128
+#define PCLK_PWM1                      129
+#define CLK_PWM1                       130
+#define CLK_CAPTURE_PWM1               131
+#define PCLK_SCR                       134
+#define ACLK_DCF                       135
+#define PCLK_INTMUX                    138
+#define CLK_PPLL_I                     141
+#define CLK_PPLL_MUX                   142
+#define CLK_PPLL_100M_MATRIX           143
+#define CLK_PPLL_50M_MATRIX            144
+#define CLK_REF_PCIE_INNER_PHY         145
+#define CLK_REF_PCIE_100M_PHY          146
+#define ACLK_VPU_L_ROOT                147
+#define CLK_GMAC1_VPU_25M              148
+#define CLK_PPLL_125M_MATRIX           149
+#define ACLK_VPU_ROOT                  150
+#define HCLK_VPU_ROOT                  151
+#define PCLK_VPU_ROOT                  152
+#define ACLK_VPU_BIU                   153
+#define HCLK_VPU_BIU                   154
+#define PCLK_VPU_BIU                   155
+#define ACLK_VPU                       156
+#define HCLK_VPU                       157
+#define PCLK_CRU_PCIE                  158
+#define PCLK_VPU_GRF                   159
+#define HCLK_SFC                       160
+#define SCLK_SFC                       161
+#define CCLK_SRC_EMMC                  163
+#define HCLK_EMMC                      164
+#define ACLK_EMMC                      165
+#define BCLK_EMMC                      166
+#define TCLK_EMMC                      167
+#define PCLK_GPIO1                     168
+#define DBCLK_GPIO1                    169
+#define ACLK_VPU_L_BIU                 172
+#define PCLK_VPU_IOC                   173
+#define HCLK_SAI_I2S0                  174
+#define MCLK_SAI_I2S0                  175
+#define HCLK_SAI_I2S2                  176
+#define MCLK_SAI_I2S2                  177
+#define PCLK_ACODEC                    178
+#define MCLK_ACODEC_TX                 179
+#define PCLK_GPIO3                     186
+#define DBCLK_GPIO3                    187
+#define PCLK_SPI1                      189
+#define CLK_SPI1                       190
+#define SCLK_IN_SPI1                   191
+#define PCLK_UART2                     192
+#define PCLK_UART5                     194
+#define PCLK_UART6                     196
+#define PCLK_UART7                     198
+#define PCLK_I2C3                      200
+#define CLK_I2C3                       201
+#define PCLK_I2C5                      202
+#define CLK_I2C5                       203
+#define PCLK_I2C6                      204
+#define CLK_I2C6                       205
+#define ACLK_MAC_VPU                   206
+#define PCLK_MAC_VPU                   207
+#define CLK_GMAC1_RMII_VPU             209
+#define CLK_GMAC1_SRC_VPU              210
+#define PCLK_PCIE                      215
+#define CLK_PCIE_AUX                   216
+#define ACLK_PCIE                      217
+#define HCLK_PCIE_SLV                  218
+#define HCLK_PCIE_DBI                  219
+#define PCLK_PCIE_PHY                  220
+#define PCLK_PIPE_GRF                  221
+#define CLK_PIPE_USB3OTG_COMBO         230
+#define CLK_UTMI_USB3OTG               232
+#define CLK_PCIE_PIPE_PHY              235
+#define CCLK_SRC_SDIO0                 240
+#define HCLK_SDIO0                     241
+#define CCLK_SRC_SDIO1                 244
+#define HCLK_SDIO1                     245
+#define CLK_TS_0                       246
+#define CLK_TS_1                       247
+#define PCLK_CAN2                      250
+#define CLK_CAN2                       251
+#define PCLK_CAN3                      252
+#define CLK_CAN3                       253
+#define PCLK_SARADC                    256
+#define CLK_SARADC                     257
+#define PCLK_TSADC                     258
+#define CLK_TSADC                      259
+#define CLK_TSADC_TSEN                 260
+#define ACLK_USB3OTG                   261
+#define CLK_REF_USB3OTG                262
+#define CLK_SUSPEND_USB3OTG            263
+#define ACLK_GPU_ROOT                  269
+#define PCLK_GPU_ROOT                  270
+#define ACLK_GPU_BIU                   271
+#define PCLK_GPU_BIU                   272
+#define ACLK_GPU                       273
+#define CLK_GPU_PVTPLL_SRC             274
+#define ACLK_GPU_MALI                  275
+#define HCLK_RKVENC_ROOT               281
+#define ACLK_RKVENC_ROOT               282
+#define PCLK_RKVENC_ROOT               283
+#define HCLK_RKVENC_BIU                284
+#define ACLK_RKVENC_BIU                285
+#define PCLK_RKVENC_BIU                286
+#define HCLK_RKVENC                    287
+#define ACLK_RKVENC                    288
+#define CLK_CORE_RKVENC                289
+#define HCLK_SAI_I2S1                  290
+#define MCLK_SAI_I2S1                  291
+#define PCLK_I2C1                      292
+#define CLK_I2C1                       293
+#define PCLK_I2C0                      294
+#define CLK_I2C0                       295
+#define CLK_UART_JTAG                  296
+#define PCLK_SPI0                      297
+#define CLK_SPI0                       298
+#define SCLK_IN_SPI0                   299
+#define PCLK_GPIO4                     300
+#define DBCLK_GPIO4                    301
+#define PCLK_RKVENC_IOC                302
+#define HCLK_SPDIF                     308
+#define MCLK_SPDIF                     309
+#define HCLK_PDM                       310
+#define MCLK_PDM                       311
+#define PCLK_UART1                     315
+#define PCLK_UART3                     317
+#define PCLK_RKVENC_GRF                319
+#define PCLK_CAN0                      320
+#define CLK_CAN0                       321
+#define PCLK_CAN1                      322
+#define CLK_CAN1                       323
+#define ACLK_VO_ROOT                   324
+#define HCLK_VO_ROOT                   325
+#define PCLK_VO_ROOT                   326
+#define ACLK_VO_BIU                    327
+#define HCLK_VO_BIU                    328
+#define PCLK_VO_BIU                    329
+#define HCLK_RGA2E                     330
+#define ACLK_RGA2E                     331
+#define CLK_CORE_RGA2E                 332
+#define HCLK_VDPP                      333
+#define ACLK_VDPP                      334
+#define CLK_CORE_VDPP                  335
+#define PCLK_VO_GRF                    336
+#define PCLK_CRU                       337
+#define ACLK_VOP_ROOT                  338
+#define ACLK_VOP_BIU                   339
+#define HCLK_VOP                       340
+#define DCLK_VOP0                      341
+#define DCLK_VOP1                      342
+#define ACLK_VOP                       343
+#define PCLK_HDMI                      344
+#define CLK_SFR_HDMI                   345
+#define CLK_CEC_HDMI                   346
+#define CLK_SPDIF_HDMI                 347
+#define CLK_HDMIPHY_TMDSSRC            348
+#define CLK_HDMIPHY_PREP               349
+#define PCLK_HDMIPHY                   352
+#define HCLK_HDCP_KEY                  354
+#define ACLK_HDCP                      355
+#define HCLK_HDCP                      356
+#define PCLK_HDCP                      357
+#define HCLK_CVBS                      358
+#define DCLK_CVBS                      359
+#define DCLK_4X_CVBS                   360
+#define ACLK_JPEG_DECODER              361
+#define HCLK_JPEG_DECODER              362
+#define ACLK_VO_L_ROOT                 375
+#define ACLK_VO_L_BIU                  376
+#define ACLK_MAC_VO                    377
+#define PCLK_MAC_VO                    378
+#define CLK_GMAC0_SRC                  379
+#define CLK_GMAC0_RMII_50M             380
+#define CLK_GMAC0_TX                   381
+#define CLK_GMAC0_RX                   382
+#define ACLK_JPEG_ROOT                 385
+#define ACLK_JPEG_BIU                  386
+#define HCLK_SAI_I2S3                  387
+#define MCLK_SAI_I2S3                  388
+#define CLK_MACPHY                     398
+#define PCLK_VCDCPHY                   399
+#define PCLK_GPIO2                     404
+#define DBCLK_GPIO2                    405
+#define PCLK_VO_IOC                    406
+#define CCLK_SRC_SDMMC0                407
+#define HCLK_SDMMC0                    408
+#define PCLK_OTPC_NS                   411
+#define CLK_SBPI_OTPC_NS               412
+#define CLK_USER_OTPC_NS               413
+#define CLK_HDMIHDP0                   415
+#define HCLK_USBHOST                   416
+#define HCLK_USBHOST_ARB               417
+#define CLK_USBHOST_OHCI               418
+#define CLK_USBHOST_UTMI               419
+#define PCLK_UART4                     420
+#define PCLK_I2C4                      422
+#define CLK_I2C4                       423
+#define PCLK_I2C7                      424
+#define CLK_I2C7                       425
+#define PCLK_USBPHY                    426
+#define CLK_REF_USBPHY                 427
+#define HCLK_RKVDEC_ROOT               433
+#define ACLK_RKVDEC_ROOT_NDFT          434
+#define PCLK_DDRPHY_CRU                435
+#define HCLK_RKVDEC_BIU                436
+#define ACLK_RKVDEC_BIU                437
+#define ACLK_RKVDEC                    439
+#define HCLK_RKVDEC                    440
+#define CLK_HEVC_CA_RKVDEC             441
+#define ACLK_RKVDEC_PVTMUX_ROOT        442
+#define CLK_RKVDEC_PVTPLL_SRC          443
+#define PCLK_DDR_ROOT                  449
+#define PCLK_DDR_BIU                   450
+#define PCLK_DDRC                      451
+#define PCLK_DDRMON                    452
+#define CLK_TIMER_DDRMON               453
+#define PCLK_MSCH_BIU                  454
+#define PCLK_DDR_GRF                   455
+#define PCLK_DDR_HWLP                  456
+#define PCLK_DDRPHY                    457
+#define CLK_MSCH_BIU                   463
+#define ACLK_DDR_UPCTL                 464
+#define CLK_DDR_UPCTL                  465
+#define CLK_DDRMON                     466
+#define ACLK_DDR_SCRAMBLE              467
+#define ACLK_SPLIT                     468
+#define CLK_DDRC_SRC                   470
+#define CLK_DDR_PHY                    471
+#define PCLK_OTPC_S                    472
+#define CLK_SBPI_OTPC_S                473
+#define CLK_USER_OTPC_S                474
+#define PCLK_KEYREADER                 475
+#define PCLK_BUS_SGRF                  476
+#define PCLK_STIMER                    477
+#define CLK_STIMER0                    478
+#define CLK_STIMER1                    479
+#define PCLK_WDT_S                     480
+#define TCLK_WDT_S                     481
+#define HCLK_TRNG_S                    482
+#define PCLK_KLAD                      483
+#define HCLK_CRYPTO_S                  484
+#define HCLK_KLAD                      485
+#define HCLK_BOOTROM                   486
+#define PCLK_DCF                       487
+#define ACLK_SYSMEM                    488
+#define HCLK_TSP                       489
+#define ACLK_TSP                       490
+#define CLK_CORE_TSP                   491
+#define CLK_OTPC_ARB                   492
+#define PCLK_OTP_MASK                  493
+#define CLK_PMC_OTP                    494
+#define PCLK_PMU_ROOT                  495
+#define HCLK_PMU_ROOT                  496
+#define PCLK_I2C2                      497
+#define CLK_I2C2                       498
+#define HCLK_PMU_BIU                   500
+#define PCLK_PMU_BIU                   501
+#define FCLK_MCU                       502
+#define RTC_CLK_MCU                    504
+#define PCLK_OSCCHK                    505
+#define CLK_PMU_MCU_JTAG               506
+#define PCLK_PMU                       508
+#define PCLK_GPIO0                     509
+#define DBCLK_GPIO0                    510
+#define XIN_OSC0_DIV                   511
+#define CLK_DEEPSLOW                   512
+#define CLK_DDR_FAIL_SAFE              513
+#define PCLK_PMU_HP_TIMER              514
+#define CLK_PMU_HP_TIMER               515
+#define CLK_PMU_32K_HP_TIMER           516
+#define PCLK_PMU_IOC                   517
+#define PCLK_PMU_CRU                   518
+#define PCLK_PMU_GRF                   519
+#define PCLK_PMU_WDT                   520
+#define TCLK_PMU_WDT                   521
+#define PCLK_PMU_MAILBOX               522
+#define PCLK_SCRKEYGEN                 524
+#define CLK_SCRKEYGEN                  525
+#define CLK_PVTM_OSCCHK                526
+#define CLK_REFOUT                     530
+#define CLK_PVTM_PMU                   532
+#define PCLK_PVTM_PMU                  533
+#define PCLK_PMU_SGRF                  534
+#define HCLK_PMU_SRAM                  535
+#define CLK_UART0                      536
+#define CLK_UART1                      537
+#define CLK_UART2                      538
+#define CLK_UART3                      539
+#define CLK_UART4                      540
+#define CLK_UART5                      541
+#define CLK_UART6                      542
+#define CLK_UART7                      543
+#define MCLK_I2S0_2CH_SAI_SRC_PRE      544
+#define MCLK_I2S1_8CH_SAI_SRC_PRE      545
+#define MCLK_I2S2_2CH_SAI_SRC_PRE      546
+#define MCLK_I2S3_8CH_SAI_SRC_PRE      547
+#define MCLK_SDPDIF_SRC_PRE            548
+#define CLK_NR_CLKS                    (MCLK_SDPDIF_SRC_PRE + 1)
+
+/* grf-clocks indices */
+#define SCLK_SDMMC_DRV                 1
+#define SCLK_SDMMC_SAMPLE              2
+#define SCLK_SDIO0_DRV                 3
+#define SCLK_SDIO0_SAMPLE              4
+#define SCLK_SDIO1_DRV                 5
+#define SCLK_SDIO1_SAMPLE              6
+#define CLK_NR_GRF_CLKS                (SCLK_SDIO1_SAMPLE + 1)
+
+/* scmi-clocks indices */
+#define SCMI_PCLK_KEYREADER            0
+#define SCMI_HCLK_KLAD                 1
+#define SCMI_PCLK_KLAD                 2
+#define SCMI_HCLK_TRNG_S               3
+#define SCMI_HCLK_CRYPTO_S             4
+#define SCMI_PCLK_WDT_S                5
+#define SCMI_TCLK_WDT_S                6
+#define SCMI_PCLK_STIMER               7
+#define SCMI_CLK_STIMER0               8
+#define SCMI_CLK_STIMER1               9
+#define SCMI_PCLK_OTP_MASK             10
+#define SCMI_PCLK_OTPC_S               11
+#define SCMI_CLK_SBPI_OTPC_S           12
+#define SCMI_CLK_USER_OTPC_S           13
+#define SCMI_CLK_PMC_OTP               14
+#define SCMI_CLK_OTPC_ARB              15
+#define SCMI_CLK_CORE_TSP              16
+#define SCMI_ACLK_TSP                  17
+#define SCMI_HCLK_TSP                  18
+#define SCMI_PCLK_DCF                  19
+#define SCMI_CLK_DDR                   20
+#define SCMI_CLK_CPU                   21
+#define SCMI_CLK_GPU                   22
+#define SCMI_CORE_CRYPTO               23
+#define SCMI_ACLK_CRYPTO               24
+#define SCMI_PKA_CRYPTO                25
+#define SCMI_HCLK_CRYPTO               26
+#define SCMI_CORE_CRYPTO_S             27
+#define SCMI_ACLK_CRYPTO_S             28
+#define SCMI_PKA_CRYPTO_S              29
+#define SCMI_CORE_KLAD                 30
+#define SCMI_ACLK_KLAD                 31
+#define SCMI_HCLK_TRNG                 32
+
+// CRU_SOFTRST_CON03(Offset:0xA0C)
+#define SRST_NCOREPORESET0             0x00000030
+#define SRST_NCOREPORESET1             0x00000031
+#define SRST_NCOREPORESET2             0x00000032
+#define SRST_NCOREPORESET3             0x00000033
+#define SRST_NCORESET0                 0x00000034
+#define SRST_NCORESET1                 0x00000035
+#define SRST_NCORESET2                 0x00000036
+#define SRST_NCORESET3                 0x00000037
+#define SRST_NL2RESET                  0x00000038
+#define SRST_ARESETN_M_CORE_BIU        0x00000039
+#define SRST_RESETN_CORE_CRYPTO        0x0000003A
+
+// CRU_SOFTRST_CON05(Offset:0xA14)
+#define SRST_PRESETN_DBG               0x0000005D
+#define SRST_POTRESETN_DBG             0x0000005E
+#define SRST_NTRESETN_DBG              0x0000005F
+
+// CRU_SOFTRST_CON06(Offset:0xA18)
+#define SRST_PRESETN_CORE_GRF          0x00000062
+#define SRST_PRESETN_DAPLITE_BIU       0x00000063
+#define SRST_PRESETN_CPU_BIU           0x00000064
+#define SRST_RESETN_REF_PVTPLL_CORE    0x00000067
+
+// CRU_SOFTRST_CON08(Offset:0xA20)
+#define SRST_ARESETN_BUS_VOPGL_BIU     0x00000081
+#define SRST_ARESETN_BUS_H_BIU         0x00000083
+#define SRST_ARESETN_SYSMEM_BIU        0x00000088
+#define SRST_ARESETN_BUS_BIU           0x0000008A
+#define SRST_HRESETN_BUS_BIU           0x0000008B
+#define SRST_PRESETN_BUS_BIU           0x0000008C
+#define SRST_PRESETN_DFT2APB           0x0000008D
+#define SRST_PRESETN_BUS_GRF           0x0000008F
+
+// CRU_SOFTRST_CON09(Offset:0xA24)
+#define SRST_ARESETN_BUS_M_BIU         0x00000090
+#define SRST_ARESETN_GIC               0x00000091
+#define SRST_ARESETN_SPINLOCK          0x00000092
+#define SRST_ARESETN_DMAC              0x00000094
+#define SRST_PRESETN_TIMER             0x00000095
+#define SRST_RESETN_TIMER0             0x00000096
+#define SRST_RESETN_TIMER1             0x00000097
+#define SRST_RESETN_TIMER2             0x00000098
+#define SRST_RESETN_TIMER3             0x00000099
+#define SRST_RESETN_TIMER4             0x0000009A
+#define SRST_RESETN_TIMER5             0x0000009B
+#define SRST_PRESETN_JDBCK_DAP         0x0000009C
+#define SRST_RESETN_JDBCK_DAP          0x0000009D
+#define SRST_PRESETN_WDT_NS            0x0000009F
+
+// CRU_SOFTRST_CON10(Offset:0xA28)
+#define SRST_TRESETN_WDT_NS            0x000000A0
+#define SRST_HRESETN_TRNG_NS           0x000000A3
+#define SRST_PRESETN_UART0             0x000000A7
+#define SRST_SRESETN_UART0             0x000000A8
+#define SRST_RESETN_PKA_CRYPTO         0x000000AA
+#define SRST_ARESETN_CRYPTO            0x000000AB
+#define SRST_HRESETN_CRYPTO            0x000000AC
+#define SRST_PRESETN_DMA2DDR           0x000000AD
+#define SRST_ARESETN_DMA2DDR           0x000000AE
+
+// CRU_SOFTRST_CON11(Offset:0xA2C)
+#define SRST_PRESETN_PWM0              0x000000B4
+#define SRST_RESETN_PWM0               0x000000B5
+#define SRST_PRESETN_PWM1              0x000000B7
+#define SRST_RESETN_PWM1               0x000000B8
+#define SRST_PRESETN_SCR               0x000000BA
+#define SRST_ARESETN_DCF               0x000000BB
+#define SRST_PRESETN_INTMUX            0x000000BC
+
+// CRU_SOFTRST_CON25(Offset:0xA64)
+#define SRST_ARESETN_VPU_BIU           0x00000196
+#define SRST_HRESETN_VPU_BIU           0x00000197
+#define SRST_PRESETN_VPU_BIU           0x00000198
+#define SRST_ARESETN_VPU               0x00000199
+#define SRST_HRESETN_VPU               0x0000019A
+#define SRST_PRESETN_CRU_PCIE          0x0000019B
+#define SRST_PRESETN_VPU_GRF           0x0000019C
+#define SRST_HRESETN_SFC               0x0000019D
+#define SRST_SRESETN_SFC               0x0000019E
+#define SRST_CRESETN_EMMC              0x0000019F
+
+// CRU_SOFTRST_CON26(Offset:0xA68)
+#define SRST_HRESETN_EMMC              0x000001A0
+#define SRST_ARESETN_EMMC              0x000001A1
+#define SRST_BRESETN_EMMC              0x000001A2
+#define SRST_TRESETN_EMMC              0x000001A3
+#define SRST_PRESETN_GPIO1             0x000001A4
+#define SRST_DBRESETN_GPIO1            0x000001A5
+#define SRST_ARESETN_VPU_L_BIU         0x000001A6
+#define SRST_PRESETN_VPU_IOC           0x000001A8
+#define SRST_HRESETN_SAI_I2S0          0x000001A9
+#define SRST_MRESETN_SAI_I2S0          0x000001AA
+#define SRST_HRESETN_SAI_I2S2          0x000001AB
+#define SRST_MRESETN_SAI_I2S2          0x000001AC
+#define SRST_PRESETN_ACODEC            0x000001AD
+
+// CRU_SOFTRST_CON27(Offset:0xA6C)
+#define SRST_PRESETN_GPIO3             0x000001B0
+#define SRST_DBRESETN_GPIO3            0x000001B1
+#define SRST_PRESETN_SPI1              0x000001B4
+#define SRST_RESETN_SPI1               0x000001B5
+#define SRST_PRESETN_UART2             0x000001B7
+#define SRST_SRESETN_UART2             0x000001B8
+#define SRST_PRESETN_UART5             0x000001B9
+#define SRST_SRESETN_UART5             0x000001BA
+#define SRST_PRESETN_UART6             0x000001BB
+#define SRST_SRESETN_UART6             0x000001BC
+#define SRST_PRESETN_UART7             0x000001BD
+#define SRST_SRESETN_UART7             0x000001BE
+#define SRST_PRESETN_I2C3              0x000001BF
+
+// CRU_SOFTRST_CON28(Offset:0xA70)
+#define SRST_RESETN_I2C3               0x000001C0
+#define SRST_PRESETN_I2C5              0x000001C1
+#define SRST_RESETN_I2C5               0x000001C2
+#define SRST_PRESETN_I2C6              0x000001C3
+#define SRST_RESETN_I2C6               0x000001C4
+#define SRST_ARESETN_MAC               0x000001C5
+
+// CRU_SOFTRST_CON30(Offset:0xA78)
+#define SRST_PRESETN_PCIE              0x000001E1
+#define SRST_RESETN_PCIE_PIPE_PHY      0x000001E2
+#define SRST_RESETN_PCIE_POWER_UP      0x000001E3
+#define SRST_PRESETN_PCIE_PHY          0x000001E6
+#define SRST_PRESETN_PIPE_GRF          0x000001E7
+
+// CRU_SOFTRST_CON32(Offset:0xA80)
+#define SRST_HRESETN_SDIO0             0x00000202
+#define SRST_HRESETN_SDIO1             0x00000204
+#define SRST_RESETN_TS_0               0x00000205
+#define SRST_RESETN_TS_1               0x00000206
+#define SRST_PRESETN_CAN2              0x00000207
+#define SRST_RESETN_CAN2               0x00000208
+#define SRST_PRESETN_CAN3              0x00000209
+#define SRST_RESETN_CAN3               0x0000020A
+#define SRST_PRESETN_SARADC            0x0000020B
+#define SRST_RESETN_SARADC             0x0000020C
+#define SRST_RESETN_SARADC_PHY         0x0000020D
+#define SRST_PRESETN_TSADC             0x0000020E
+#define SRST_RESETN_TSADC              0x0000020F
+
+// CRU_SOFTRST_CON33(Offset:0xA84)
+#define SRST_ARESETN_USB3OTG           0x00000211
+
+// CRU_SOFTRST_CON34(Offset:0xA88)
+#define SRST_ARESETN_GPU_BIU           0x00000223
+#define SRST_PRESETN_GPU_BIU           0x00000225
+#define SRST_ARESETN_GPU               0x00000228
+#define SRST_RESETN_REF_PVTPLL_GPU     0x00000229
+
+// CRU_SOFTRST_CON36(Offset:0xA90)
+#define SRST_HRESETN_RKVENC_BIU        0x00000243
+#define SRST_ARESETN_RKVENC_BIU        0x00000244
+#define SRST_PRESETN_RKVENC_BIU        0x00000245
+#define SRST_HRESETN_RKVENC            0x00000246
+#define SRST_ARESETN_RKVENC            0x00000247
+#define SRST_RESETN_CORE_RKVENC        0x00000248
+#define SRST_HRESETN_SAI_I2S1          0x00000249
+#define SRST_MRESETN_SAI_I2S1          0x0000024A
+#define SRST_PRESETN_I2C1              0x0000024B
+#define SRST_RESETN_I2C1               0x0000024C
+#define SRST_PRESETN_I2C0              0x0000024D
+#define SRST_RESETN_I2C0               0x0000024E
+
+// CRU_SOFTRST_CON37(Offset:0xA94)
+#define SRST_PRESETN_SPI0              0x00000252
+#define SRST_RESETN_SPI0               0x00000253
+#define SRST_PRESETN_GPIO4             0x00000258
+#define SRST_DBRESETN_GPIO4            0x00000259
+#define SRST_PRESETN_RKVENC_IOC        0x0000025A
+#define SRST_HRESETN_SPDIF             0x0000025E
+#define SRST_MRESETN_SPDIF             0x0000025F
+
+// CRU_SOFTRST_CON38(Offset:0xA98)
+#define SRST_HRESETN_PDM               0x00000260
+#define SRST_MRESETN_PDM               0x00000261
+#define SRST_PRESETN_UART1             0x00000262
+#define SRST_SRESETN_UART1             0x00000263
+#define SRST_PRESETN_UART3             0x00000264
+#define SRST_SRESETN_UART3             0x00000265
+#define SRST_PRESETN_RKVENC_GRF        0x00000266
+#define SRST_PRESETN_CAN0              0x00000267
+#define SRST_RESETN_CAN0               0x00000268
+#define SRST_PRESETN_CAN1              0x00000269
+#define SRST_RESETN_CAN1               0x0000026A
+
+// CRU_SOFTRST_CON39(Offset:0xA9C)
+#define SRST_ARESETN_VO_BIU            0x00000273
+#define SRST_HRESETN_VO_BIU            0x00000274
+#define SRST_PRESETN_VO_BIU            0x00000275
+#define SRST_HRESETN_RGA2E             0x00000277
+#define SRST_ARESETN_RGA2E             0x00000278
+#define SRST_RESETN_CORE_RGA2E         0x00000279
+#define SRST_HRESETN_VDPP              0x0000027A
+#define SRST_ARESETN_VDPP              0x0000027B
+#define SRST_RESETN_CORE_VDPP          0x0000027C
+#define SRST_PRESETN_VO_GRF            0x0000027D
+#define SRST_PRESETN_CRU               0x0000027F
+
+// CRU_SOFTRST_CON40(Offset:0xAA0)
+#define SRST_ARESETN_VOP_BIU           0x00000281
+#define SRST_HRESETN_VOP               0x00000282
+#define SRST_DRESETN_VOP0              0x00000283
+#define SRST_DRESETN_VOP1              0x00000284
+#define SRST_ARESETN_VOP               0x00000285
+#define SRST_PRESETN_HDMI              0x00000286
+#define SRST_HDMI_RESETN               0x00000287
+#define SRST_PRESETN_HDMIPHY           0x0000028E
+#define SRST_HRESETN_HDCP_KEY          0x0000028F
+
+// CRU_SOFTRST_CON41(Offset:0xAA4)
+#define SRST_ARESETN_HDCP              0x00000290
+#define SRST_HRESETN_HDCP              0x00000291
+#define SRST_PRESETN_HDCP              0x00000292
+#define SRST_HRESETN_CVBS              0x00000293
+#define SRST_DRESETN_CVBS_VOP          0x00000294
+#define SRST_DRESETN_4X_CVBS_VOP       0x00000295
+#define SRST_ARESETN_JPEG_DECODER      0x00000296
+#define SRST_HRESETN_JPEG_DECODER      0x00000297
+#define SRST_ARESETN_VO_L_BIU          0x00000299
+#define SRST_ARESETN_MAC_VO            0x0000029A
+
+// CRU_SOFTRST_CON42(Offset:0xAA8)
+#define SRST_ARESETN_JPEG_BIU          0x000002A0
+#define SRST_HRESETN_SAI_I2S3          0x000002A1
+#define SRST_MRESETN_SAI_I2S3          0x000002A2
+#define SRST_RESETN_MACPHY             0x000002A3
+#define SRST_PRESETN_VCDCPHY           0x000002A4
+#define SRST_PRESETN_GPIO2             0x000002A5
+#define SRST_DBRESETN_GPIO2            0x000002A6
+#define SRST_PRESETN_VO_IOC            0x000002A7
+#define SRST_HRESETN_SDMMC0            0x000002A9
+#define SRST_PRESETN_OTPC_NS           0x000002AB
+#define SRST_RESETN_SBPI_OTPC_NS       0x000002AC
+#define SRST_RESETN_USER_OTPC_NS       0x000002AD
+
+// CRU_SOFTRST_CON43(Offset:0xAAC)
+#define SRST_RESETN_HDMIHDP0           0x000002B2
+#define SRST_HRESETN_USBHOST           0x000002B3
+#define SRST_HRESETN_USBHOST_ARB       0x000002B4
+#define SRST_RESETN_HOST_UTMI          0x000002B6
+#define SRST_PRESETN_UART4             0x000002B7
+#define SRST_SRESETN_UART4             0x000002B8
+#define SRST_PRESETN_I2C4              0x000002B9
+#define SRST_RESETN_I2C4               0x000002BA
+#define SRST_PRESETN_I2C7              0x000002BB
+#define SRST_RESETN_I2C7               0x000002BC
+#define SRST_PRESETN_USBPHY            0x000002BD
+#define SRST_RESETN_USBPHY_POR         0x000002BE
+#define SRST_RESETN_USBPHY_OTG         0x000002BF
+
+// CRU_SOFTRST_CON44(Offset:0xAB0)
+#define SRST_RESETN_USBPHY_HOST        0x000002C0
+#define SRST_PRESETN_DDRPHY_CRU        0x000002C4
+#define SRST_HRESETN_RKVDEC_BIU        0x000002C6
+#define SRST_ARESETN_RKVDEC_BIU        0x000002C7
+#define SRST_ARESETN_RKVDEC            0x000002C8
+#define SRST_HRESETN_RKVDEC            0x000002C9
+#define SRST_RESETN_HEVC_CA_RKVDEC     0x000002CB
+#define SRST_RESETN_REF_PVTPLL_RKVDEC  0x000002CC
+
+// CRU_SOFTRST_CON45(Offset:0xAB4)
+#define SRST_PRESETN_DDR_BIU           0x000002D1
+#define SRST_PRESETN_DDRC              0x000002D2
+#define SRST_PRESETN_DDRMON            0x000002D3
+#define SRST_RESETN_TIMER_DDRMON       0x000002D4
+#define SRST_PRESETN_MSCH_BIU          0x000002D5
+#define SRST_PRESETN_DDR_GRF           0x000002D6
+#define SRST_PRESETN_DDR_HWLP          0x000002D8
+#define SRST_PRESETN_DDRPHY            0x000002D9
+#define SRST_RESETN_MSCH_BIU           0x000002DA
+#define SRST_ARESETN_DDR_UPCTL         0x000002DB
+#define SRST_RESETN_DDR_UPCTL          0x000002DC
+#define SRST_RESETN_DDRMON             0x000002DD
+#define SRST_ARESETN_DDR_SCRAMBLE      0x000002DE
+#define SRST_ARESETN_SPLIT             0x000002DF
+
+// CRU_SOFTRST_CON46(Offset:0xAB8)
+#define SRST_RESETN_DDR_PHY            0x000002E0
+
+#endif
+
diff --git a/u-boot/include/dt-bindings/clock/rk3562-cru.h b/u-boot/include/dt-bindings/clock/rk3562-cru.h
new file mode 100644
index 0000000..3bdbed5
--- /dev/null
+++ b/u-boot/include/dt-bindings/clock/rk3562-cru.h
@@ -0,0 +1,733 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
+ * Author: Finley Xiao <finley.xiao@rock-chips.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3562_H
+#define _DT_BINDINGS_CLK_ROCKCHIP_RK3562_H
+
+/* cru-clocks indices */
+
+/* cru plls */
+#define PLL_APLL			1
+#define PLL_GPLL			2
+#define PLL_VPLL			3
+#define PLL_HPLL			4
+#define PLL_CPLL			5
+#define PLL_DPLL			6
+
+/* cru clocks */
+#define ARMCLK				8
+#define CLK_GPU				9
+#define ACLK_RKNN			10
+#define CLK_DDR				11
+#define CLK_MATRIX_50M_SRC		12
+#define CLK_MATRIX_100M_SRC		13
+#define CLK_MATRIX_125M_SRC		14
+#define CLK_MATRIX_200M_SRC		15
+#define CLK_MATRIX_300M_SRC		16
+#define ACLK_TOP			17
+#define ACLK_TOP_VIO			18
+#define CLK_CAM0_OUT2IO			19
+#define CLK_CAM1_OUT2IO			20
+#define CLK_CAM2_OUT2IO			21
+#define CLK_CAM3_OUT2IO			22
+#define ACLK_BUS			23
+#define HCLK_BUS			24
+#define PCLK_BUS			25
+#define PCLK_I2C1			26
+#define PCLK_I2C2			27
+#define PCLK_I2C3			28
+#define PCLK_I2C4			29
+#define PCLK_I2C5			30
+#define CLK_I2C				31
+#define CLK_I2C1			32
+#define CLK_I2C2			33
+#define CLK_I2C3			34
+#define CLK_I2C4			35
+#define CLK_I2C5			36
+#define DCLK_BUS_GPIO			37
+#define DCLK_BUS_GPIO3			38
+#define DCLK_BUS_GPIO4			39
+#define PCLK_TIMER			40
+#define CLK_TIMER0			41
+#define CLK_TIMER1			42
+#define CLK_TIMER2			43
+#define CLK_TIMER3			44
+#define CLK_TIMER4			45
+#define CLK_TIMER5			46
+#define PCLK_STIMER			47
+#define CLK_STIMER0			48
+#define CLK_STIMER1			49
+#define PCLK_WDTNS			50
+#define CLK_WDTNS			51
+#define PCLK_GRF			52
+#define PCLK_SGRF			53
+#define PCLK_MAILBOX			54
+#define PCLK_INTC			55
+#define ACLK_BUS_GIC400			56
+#define ACLK_BUS_SPINLOCK		57
+#define ACLK_DCF			58
+#define PCLK_DCF			59
+#define FCLK_BUS_CM0_CORE		60
+#define CLK_BUS_CM0_RTC			61
+#define HCLK_ICACHE			62
+#define HCLK_DCACHE			63
+#define PCLK_TSADC			64
+#define CLK_TSADC			65
+#define CLK_TSADC_TSEN			66
+#define PCLK_DFT2APB			67
+#define CLK_SARADC_VCCIO156		68
+#define PCLK_GMAC			69
+#define ACLK_GMAC			70
+#define CLK_GMAC_125M_CRU_I		71
+#define CLK_GMAC_50M_CRU_I		72
+#define CLK_GMAC_50M_O			73
+#define CLK_GMAC_ETH_OUT2IO		74
+#define PCLK_APB2ASB_VCCIO156		75
+#define PCLK_TO_VCCIO156		76
+#define PCLK_DSIPHY			77
+#define PCLK_DSITX			78
+#define PCLK_CPU_EMA_DET		79
+#define PCLK_HASH			80
+#define PCLK_TOPCRU			81
+#define PCLK_ASB2APB_VCCIO156		82
+#define PCLK_IOC_VCCIO156		83
+#define PCLK_GPIO3_VCCIO156		84
+#define PCLK_GPIO4_VCCIO156		85
+#define PCLK_SARADC_VCCIO156		86
+#define PCLK_MAC100			87
+#define ACLK_MAC100			89
+#define CLK_MAC100_50M_MATRIX		90
+#define HCLK_CORE			91
+#define PCLK_DDR			92
+#define CLK_MSCH_BRG_BIU		93
+#define PCLK_DDR_HWLP			94
+#define PCLK_DDR_UPCTL			95
+#define PCLK_DDR_PHY			96
+#define PCLK_DDR_DFICTL			97
+#define PCLK_DDR_DMA2DDR		98
+#define PCLK_DDR_MON			99
+#define TMCLK_DDR_MON			100
+#define PCLK_DDR_GRF			101
+#define PCLK_DDR_CRU			102
+#define PCLK_SUBDDR_CRU			103
+#define CLK_GPU_PRE			104
+#define ACLK_GPU_PRE			105
+#define CLK_GPU_BRG			107
+#define CLK_NPU_PRE			108
+#define HCLK_NPU_PRE			109
+#define HCLK_RKNN			111
+#define ACLK_PERI			112
+#define HCLK_PERI			113
+#define PCLK_PERI			114
+#define PCLK_PERICRU			115
+#define HCLK_SAI0			116
+#define CLK_SAI0_SRC			117
+#define CLK_SAI0_FRAC			118
+#define CLK_SAI0			119
+#define MCLK_SAI0			120
+#define MCLK_SAI0_OUT2IO		121
+#define HCLK_SAI1			122
+#define CLK_SAI1_SRC			123
+#define CLK_SAI1_FRAC			124
+#define CLK_SAI1			125
+#define MCLK_SAI1			126
+#define MCLK_SAI1_OUT2IO		127
+#define HCLK_SAI2			128
+#define CLK_SAI2_SRC			129
+#define CLK_SAI2_FRAC			130
+#define CLK_SAI2			131
+#define MCLK_SAI2			132
+#define MCLK_SAI2_OUT2IO		133
+#define HCLK_DSM			134
+#define CLK_DSM				135
+#define HCLK_PDM			136
+#define MCLK_PDM			137
+#define HCLK_SPDIF			138
+#define CLK_SPDIF_SRC			139
+#define CLK_SPDIF_FRAC			140
+#define CLK_SPDIF			141
+#define MCLK_SPDIF			142
+#define HCLK_SDMMC0			143
+#define CCLK_SDMMC0			144
+#define HCLK_SDMMC1			145
+#define CCLK_SDMMC1			146
+#define SCLK_SDMMC0_DRV			147
+#define SCLK_SDMMC0_SAMPLE		148
+#define SCLK_SDMMC1_DRV			149
+#define SCLK_SDMMC1_SAMPLE		150
+#define HCLK_EMMC			151
+#define ACLK_EMMC			152
+#define CCLK_EMMC			153
+#define BCLK_EMMC			154
+#define TMCLK_EMMC			155
+#define SCLK_SFC			156
+#define HCLK_SFC			157
+#define HCLK_USB2HOST			158
+#define HCLK_USB2HOST_ARB		159
+#define PCLK_SPI1			160
+#define CLK_SPI1			161
+#define SCLK_IN_SPI1			162
+#define PCLK_SPI2			163
+#define CLK_SPI2			164
+#define SCLK_IN_SPI2			165
+#define PCLK_UART1			166
+#define PCLK_UART2			167
+#define PCLK_UART3			168
+#define PCLK_UART4			169
+#define PCLK_UART5			170
+#define PCLK_UART6			171
+#define PCLK_UART7			172
+#define PCLK_UART8			173
+#define PCLK_UART9			174
+#define CLK_UART1_SRC			175
+#define CLK_UART1_FRAC			176
+#define CLK_UART1			177
+#define SCLK_UART1			178
+#define CLK_UART2_SRC			179
+#define CLK_UART2_FRAC			180
+#define CLK_UART2			181
+#define SCLK_UART2			182
+#define CLK_UART3_SRC			183
+#define CLK_UART3_FRAC			184
+#define CLK_UART3			185
+#define SCLK_UART3			186
+#define CLK_UART4_SRC			187
+#define CLK_UART4_FRAC			188
+#define CLK_UART4			189
+#define SCLK_UART4			190
+#define CLK_UART5_SRC			191
+#define CLK_UART5_FRAC			192
+#define CLK_UART5			193
+#define SCLK_UART5			194
+#define CLK_UART6_SRC			195
+#define CLK_UART6_FRAC			196
+#define CLK_UART6			197
+#define SCLK_UART6			198
+#define CLK_UART7_SRC			199
+#define CLK_UART7_FRAC			200
+#define CLK_UART7			201
+#define SCLK_UART7			202
+#define CLK_UART8_SRC			203
+#define CLK_UART8_FRAC			204
+#define CLK_UART8			205
+#define SCLK_UART8			206
+#define CLK_UART9_SRC			207
+#define CLK_UART9_FRAC			208
+#define CLK_UART9			209
+#define SCLK_UART9			210
+#define PCLK_PWM1_PERI			211
+#define CLK_PWM1_PERI			212
+#define CLK_CAPTURE_PWM1_PERI		213
+#define PCLK_PWM2_PERI			214
+#define CLK_PWM2_PERI			215
+#define CLK_CAPTURE_PWM2_PERI		216
+#define PCLK_PWM3_PERI			217
+#define CLK_PWM3_PERI			218
+#define CLK_CAPTURE_PWM3_PERI		219
+#define PCLK_CAN0			220
+#define CLK_CAN0			221
+#define PCLK_CAN1			222
+#define CLK_CAN1			223
+#define ACLK_CRYPTO			224
+#define HCLK_CRYPTO			225
+#define PCLK_CRYPTO			226
+#define CLK_CORE_CRYPTO			227
+#define CLK_PKA_CRYPTO			228
+#define HCLK_KLAD			229
+#define PCLK_KEY_READER			230
+#define HCLK_RK_RNG_NS			231
+#define HCLK_RK_RNG_S			232
+#define HCLK_TRNG_NS			233
+#define HCLK_TRNG_S			234
+#define HCLK_CRYPTO_S			235
+#define PCLK_PERI_WDT			236
+#define TCLK_PERI_WDT			237
+#define ACLK_SYSMEM			238
+#define HCLK_BOOTROM			239
+#define PCLK_PERI_GRF			240
+#define ACLK_DMAC			241
+#define ACLK_RKDMAC			242
+#define PCLK_OTPC_NS			243
+#define CLK_SBPI_OTPC_NS		244
+#define CLK_USER_OTPC_NS		245
+#define PCLK_OTPC_S			246
+#define CLK_SBPI_OTPC_S			247
+#define CLK_USER_OTPC_S			248
+#define CLK_OTPC_ARB			249
+#define PCLK_OTPPHY			250
+#define PCLK_USB2PHY			251
+#define PCLK_PIPEPHY			252
+#define PCLK_SARADC			253
+#define CLK_SARADC			254
+#define PCLK_IOC_VCCIO234		255
+#define PCLK_PERI_GPIO1			256
+#define PCLK_PERI_GPIO2			257
+#define DCLK_PERI_GPIO			258
+#define DCLK_PERI_GPIO1			259
+#define DCLK_PERI_GPIO2			260
+#define ACLK_PHP			261
+#define PCLK_PHP			262
+#define ACLK_PCIE20_MST			263
+#define ACLK_PCIE20_SLV			264
+#define ACLK_PCIE20_DBI			265
+#define PCLK_PCIE20			266
+#define CLK_PCIE20_AUX			267
+#define ACLK_USB3OTG			268
+#define CLK_USB3OTG_SUSPEND		269
+#define CLK_USB3OTG_REF			270
+#define CLK_PIPEPHY_REF_FUNC		271
+#define CLK_200M_PMU			272
+#define CLK_RTC_32K			273
+#define CLK_RTC32K_FRAC			274
+#define BUSCLK_PDPMU0			275
+#define PCLK_PMU0_CRU			276
+#define PCLK_PMU0_PMU			277
+#define CLK_PMU0_PMU			278
+#define PCLK_PMU0_HP_TIMER		279
+#define CLK_PMU0_HP_TIMER		280
+#define CLK_PMU0_32K_HP_TIMER		281
+#define PCLK_PMU0_PVTM			282
+#define CLK_PMU0_PVTM			283
+#define PCLK_IOC_PMUIO			284
+#define PCLK_PMU0_GPIO0			285
+#define DBCLK_PMU0_GPIO0		286
+#define PCLK_PMU0_GRF			287
+#define PCLK_PMU0_SGRF			288
+#define CLK_DDR_FAIL_SAFE		289
+#define PCLK_PMU0_SCRKEYGEN		290
+#define PCLK_PMU1_CRU			291
+#define HCLK_PMU1_MEM			292
+#define PCLK_PMU0_I2C0			293
+#define CLK_PMU0_I2C0			294
+#define PCLK_PMU1_UART0			295
+#define CLK_PMU1_UART0_SRC		296
+#define CLK_PMU1_UART0_FRAC		297
+#define CLK_PMU1_UART0			298
+#define SCLK_PMU1_UART0			299
+#define PCLK_PMU1_SPI0			300
+#define CLK_PMU1_SPI0			301
+#define SCLK_IN_PMU1_SPI0		302
+#define PCLK_PMU1_PWM0			303
+#define CLK_PMU1_PWM0			304
+#define CLK_CAPTURE_PMU1_PWM0		305
+#define CLK_PMU1_WIFI			306
+#define FCLK_PMU1_CM0_CORE		307
+#define CLK_PMU1_CM0_RTC		308
+#define PCLK_PMU1_WDTNS			309
+#define CLK_PMU1_WDTNS			310
+#define PCLK_PMU1_MAILBOX		311
+#define CLK_PIPEPHY_DIV			312
+#define CLK_PIPEPHY_XIN24M		313
+#define CLK_PIPEPHY_REF			314
+#define CLK_24M_SSCSRC			315
+#define CLK_USB2PHY_XIN24M		316
+#define CLK_USB2PHY_REF			317
+#define CLK_MIPIDSIPHY_XIN24M		318
+#define CLK_MIPIDSIPHY_REF		319
+#define ACLK_RGA_PRE			320
+#define HCLK_RGA_PRE			321
+#define ACLK_RGA			322
+#define HCLK_RGA			323
+#define CLK_RGA_CORE			324
+#define ACLK_JDEC			325
+#define HCLK_JDEC			326
+#define ACLK_VDPU_PRE			327
+#define CLK_RKVDEC_HEVC_CA		328
+#define HCLK_VDPU_PRE			329
+#define ACLK_RKVDEC			330
+#define HCLK_RKVDEC			331
+#define CLK_RKVENC_CORE			332
+#define ACLK_VEPU_PRE			333
+#define HCLK_VEPU_PRE			334
+#define ACLK_RKVENC			335
+#define HCLK_RKVENC			336
+#define ACLK_VI				337
+#define HCLK_VI				338
+#define PCLK_VI				339
+#define ACLK_ISP			340
+#define HCLK_ISP			341
+#define CLK_ISP				342
+#define ACLK_VICAP			343
+#define HCLK_VICAP			344
+#define DCLK_VICAP			345
+#define CSIRX0_CLK_DATA			346
+#define CSIRX1_CLK_DATA			347
+#define CSIRX2_CLK_DATA			348
+#define CSIRX3_CLK_DATA			349
+#define PCLK_CSIHOST0			350
+#define PCLK_CSIHOST1			351
+#define PCLK_CSIHOST2			352
+#define PCLK_CSIHOST3			353
+#define PCLK_CSIPHY0			354
+#define PCLK_CSIPHY1			355
+#define ACLK_VO_PRE			356
+#define HCLK_VO_PRE			357
+#define ACLK_VOP			358
+#define HCLK_VOP			359
+#define DCLK_VOP			360
+#define DCLK_VOP1			361
+#define ACLK_CRYPTO_S			362
+#define PCLK_CRYPTO_S			363
+#define CLK_CORE_CRYPTO_S		364
+#define CLK_PKA_CRYPTO_S		365
+
+#define CLK_NR_CLKS			(CLK_PKA_CRYPTO_S + 1)
+
+/* soft-reset indices */
+
+/********Name=SOFTRST_CON01,Offset=0x404********/
+#define SRST_A_TOP_BIU			16
+#define SRST_A_TOP_VIO_BIU		17
+#define SRST_REF_PVTPLL_LOGIC		18
+/********Name=SOFTRST_CON03,Offset=0x40C********/
+#define SRST_NCOREPORESET0		48
+#define SRST_NCOREPORESET1		49
+#define SRST_NCOREPORESET2		50
+#define SRST_NCOREPORESET3		51
+#define SRST_NCORESET0			52
+#define SRST_NCORESET1			53
+#define SRST_NCORESET2			54
+#define SRST_NCORESET3			55
+#define SRST_NL2RESET			56
+/********Name=SOFTRST_CON04,Offset=0x410********/
+#define SRST_DAP			73
+#define SRST_P_DBG_DAPLITE		74
+#define SRST_REF_PVTPLL_CORE		77
+/********Name=SOFTRST_CON05,Offset=0x414********/
+#define SRST_A_CORE_BIU			80
+#define SRST_P_CORE_BIU			81
+#define SRST_H_CORE_BIU			82
+/********Name=SOFTRST_CON06,Offset=0x418********/
+#define SRST_A_NPU_BIU			98
+#define SRST_H_NPU_BIU			99
+#define SRST_A_RKNN			100
+#define SRST_H_RKNN			101
+#define SRST_REF_PVTPLL_NPU		102
+/********Name=SOFTRST_CON08,Offset=0x420********/
+#define SRST_A_GPU_BIU			131
+#define SRST_GPU			132
+#define SRST_REF_PVTPLL_GPU		133
+#define SRST_GPU_BRG_BIU		134
+/********Name=SOFTRST_CON09,Offset=0x424********/
+#define SRST_RKVENC_CORE		144
+#define SRST_A_VEPU_BIU			147
+#define SRST_H_VEPU_BIU			148
+#define SRST_A_RKVENC			149
+#define SRST_H_RKVENC			150
+/********Name=SOFTRST_CON10,Offset=0x428********/
+#define SRST_RKVDEC_HEVC_CA		162
+#define SRST_A_VDPU_BIU			165
+#define SRST_H_VDPU_BIU			166
+#define SRST_A_RKVDEC			167
+#define SRST_H_RKVDEC			168
+/********Name=SOFTRST_CON11,Offset=0x42C********/
+#define SRST_A_VI_BIU			179
+#define SRST_H_VI_BIU			180
+#define SRST_P_VI_BIU			181
+#define SRST_ISP			184
+#define SRST_A_VICAP			185
+#define SRST_H_VICAP			186
+#define SRST_D_VICAP			187
+#define SRST_I0_VICAP			188
+#define SRST_I1_VICAP			189
+#define SRST_I2_VICAP			190
+#define SRST_I3_VICAP			191
+/********Name=SOFTRST_CON12,Offset=0x430********/
+#define SRST_P_CSIHOST0			192
+#define SRST_P_CSIHOST1			193
+#define SRST_P_CSIHOST2			194
+#define SRST_P_CSIHOST3			195
+#define SRST_P_CSIPHY0			196
+#define SRST_P_CSIPHY1			197
+/********Name=SOFTRST_CON13,Offset=0x434********/
+#define SRST_A_VO_BIU			211
+#define SRST_H_VO_BIU			212
+#define SRST_A_VOP			214
+#define SRST_H_VOP			215
+#define SRST_D_VOP			216
+#define SRST_D_VOP1			217
+/********Name=SOFTRST_CON14,Offset=0x438********/
+#define SRST_A_RGA_BIU			227
+#define SRST_H_RGA_BIU			228
+#define SRST_A_RGA			230
+#define SRST_H_RGA			231
+#define SRST_RGA_CORE			232
+#define SRST_A_JDEC			233
+#define SRST_H_JDEC			234
+/********Name=SOFTRST_CON15,Offset=0x43C********/
+#define SRST_B_EBK_BIU			242
+#define SRST_P_EBK_BIU			243
+#define SRST_AHB2AXI_EBC		244
+#define SRST_H_EBC			245
+#define SRST_D_EBC			246
+#define SRST_H_EINK			247
+#define SRST_P_EINK			248
+/********Name=SOFTRST_CON16,Offset=0x440********/
+#define SRST_P_PHP_BIU			258
+#define SRST_A_PHP_BIU			259
+#define SRST_P_PCIE20			263
+#define SRST_PCIE20_POWERUP		264
+#define SRST_USB3OTG			266
+/********Name=SOFTRST_CON17,Offset=0x444********/
+#define SRST_PIPEPHY			275
+/********Name=SOFTRST_CON18,Offset=0x448********/
+#define SRST_A_BUS_BIU			291
+#define SRST_H_BUS_BIU			292
+#define SRST_P_BUS_BIU			293
+/********Name=SOFTRST_CON19,Offset=0x44C********/
+#define SRST_P_I2C1			304
+#define SRST_P_I2C2			305
+#define SRST_P_I2C3			306
+#define SRST_P_I2C4			307
+#define SRST_P_I2C5			308
+#define SRST_I2C1			310
+#define SRST_I2C2			311
+#define SRST_I2C3			312
+#define SRST_I2C4			313
+#define SRST_I2C5			314
+/********Name=SOFTRST_CON20,Offset=0x450********/
+#define SRST_BUS_GPIO3			325
+#define SRST_BUS_GPIO4			326
+/********Name=SOFTRST_CON21,Offset=0x454********/
+#define SRST_P_TIMER			336
+#define SRST_TIMER0			337
+#define SRST_TIMER1			338
+#define SRST_TIMER2			339
+#define SRST_TIMER3			340
+#define SRST_TIMER4			341
+#define SRST_TIMER5			342
+#define SRST_P_STIMER			343
+#define SRST_STIMER0			344
+#define SRST_STIMER1			345
+/********Name=SOFTRST_CON22,Offset=0x458********/
+#define SRST_P_WDTNS			352
+#define SRST_WDTNS			353
+#define SRST_P_GRF			354
+#define SRST_P_SGRF			355
+#define SRST_P_MAILBOX			356
+#define SRST_P_INTC			357
+#define SRST_A_BUS_GIC400		358
+#define SRST_A_BUS_GIC400_DEBUG		359
+/********Name=SOFTRST_CON23,Offset=0x45C********/
+#define SRST_A_BUS_SPINLOCK		368
+#define SRST_A_DCF			369
+#define SRST_P_DCF			370
+#define SRST_F_BUS_CM0_CORE		371
+#define SRST_T_BUS_CM0_JTAG		373
+#define SRST_H_ICACHE			376
+#define SRST_H_DCACHE			377
+/********Name=SOFTRST_CON24,Offset=0x460********/
+#define SRST_P_TSADC			384
+#define SRST_TSADC			385
+#define SRST_TSADCPHY			386
+#define SRST_P_DFT2APB			388
+/********Name=SOFTRST_CON25,Offset=0x464********/
+#define SRST_A_GMAC			401
+#define SRST_P_APB2ASB_VCCIO156		405
+#define SRST_P_DSIPHY			408
+#define SRST_P_DSITX			409
+#define SRST_P_CPU_EMA_DET		410
+#define SRST_P_HASH			411
+#define SRST_P_TOPCRU			415
+/********Name=SOFTRST_CON26,Offset=0x468********/
+#define SRST_P_ASB2APB_VCCIO156		416
+#define SRST_P_IOC_VCCIO156		417
+#define SRST_P_GPIO3_VCCIO156		418
+#define SRST_P_GPIO4_VCCIO156		419
+#define SRST_P_SARADC_VCCIO156		420
+#define SRST_SARADC_VCCIO156		421
+#define SRST_SARADC_VCCIO156_PHY	422
+/********Name=SOFTRST_CON27,Offset=0x46c********/
+#define SRST_A_MAC100			433
+
+/* (0x10200 - 0x400) / 4 * 16 = 260096 */
+/********Name=PMU0SOFTRST_CON00,Offset=0x10200********/
+#define SRST_P_PMU0_CRU			260096
+#define SRST_P_PMU0_PMU			260097
+#define SRST_PMU0_PMU			260098
+#define SRST_P_PMU0_HP_TIMER		260099
+#define SRST_PMU0_HP_TIMER		260100
+#define SRST_PMU0_32K_HP_TIMER		260101
+#define SRST_P_PMU0_PVTM		260102
+#define SRST_PMU0_PVTM			260103
+#define SRST_P_IOC_PMUIO		260104
+#define SRST_P_PMU0_GPIO0		260105
+#define SRST_PMU0_GPIO0			260106
+#define SRST_P_PMU0_GRF			260107
+#define SRST_P_PMU0_SGRF		260108
+/********Name=PMU0SOFTRST_CON01,Offset=0x10204********/
+#define SRST_DDR_FAIL_SAFE		260112
+#define SRST_P_PMU0_SCRKEYGEN		260113
+/********Name=PMU0SOFTRST_CON02,Offset=0x10208********/
+#define SRST_P_PMU0_I2C0		260136
+#define SRST_PMU0_I2C0			260137
+
+/* (0x18200 - 0x400) / 4 * 16 = 391168 */
+/********Name=PMU1SOFTRST_CON00,Offset=0x18200********/
+#define SRST_P_PMU1_CRU			391168
+#define SRST_H_PMU1_MEM			391170
+#define SRST_H_PMU1_BIU			391171
+#define SRST_P_PMU1_BIU			391172
+#define SRST_P_PMU1_UART0		391175
+#define SRST_S_PMU1_UART0		391178
+/********Name=PMU1SOFTRST_CON01,Offset=0x18204********/
+#define SRST_P_PMU1_SPI0		391184
+#define SRST_PMU1_SPI0			391185
+#define SRST_P_PMU1_PWM0		391187
+#define SRST_PMU1_PWM0			391188
+/********Name=PMU1SOFTRST_CON02,Offset=0x18208********/
+#define SRST_F_PMU1_CM0_CORE		391200
+#define SRST_T_PMU1_CM0_JTAG		391202
+#define SRST_P_PMU1_WDTNS		391203
+#define SRST_PMU1_WDTNS			391204
+#define SRST_PMU1_MAILBOX		391208
+
+/* (0x20200 - 0x400) / 4 * 16 = 522240 */
+/********Name=DDRSOFTRST_CON00,Offset=0x20200********/
+#define SRST_MSCH_BRG_BIU		522244
+#define SRST_P_MSCH_BIU			522245
+#define SRST_P_DDR_HWLP			522246
+#define SRST_P_DDR_PHY			522248
+#define SRST_P_DDR_DFICTL		522249
+#define SRST_P_DDR_DMA2DDR		522250
+/********Name=DDRSOFTRST_CON01,Offset=0x20204********/
+#define SRST_P_DDR_MON			522256
+#define SRST_TM_DDR_MON			522257
+#define SRST_P_DDR_GRF			522258
+#define SRST_P_DDR_CRU			522259
+#define SRST_P_SUBDDR_CRU		522260
+
+/* (0x28200 - 0x400) / 4 * 16 = 653312 */
+/********Name=SUBDDRSOFTRST_CON00,Offset=0x28200********/
+#define SRST_MSCH_BIU			653313
+#define SRST_DDR_PHY			653316
+#define SRST_DDR_DFICTL			653317
+#define SRST_DDR_SCRAMBLE		653318
+#define SRST_DDR_MON			653319
+#define SRST_A_DDR_SPLIT		653320
+#define SRST_DDR_DMA2DDR		653321
+
+/* (0x30400 - 0x400) / 4 * 16 = 786432 */
+/********Name=PERISOFTRST_CON01,Offset=0x30404********/
+#define SRST_A_PERI_BIU			786451
+#define SRST_H_PERI_BIU			786452
+#define SRST_P_PERI_BIU			786453
+#define SRST_P_PERICRU			786454
+/********Name=PERISOFTRST_CON02,Offset=0x30408********/
+#define SRST_H_SAI0_8CH			786464
+#define SRST_M_SAI0_8CH			786467
+#define SRST_H_SAI1_8CH			786469
+#define SRST_M_SAI1_8CH			786472
+#define SRST_H_SAI2_2CH			786474
+#define SRST_M_SAI2_2CH			786477
+/********Name=PERISOFTRST_CON03,Offset=0x3040C********/
+#define SRST_H_DSM			786481
+#define SRST_DSM			786482
+#define SRST_H_PDM			786484
+#define SRST_M_PDM			786485
+#define SRST_H_SPDIF			786488
+#define SRST_M_SPDIF			786491
+/********Name=PERISOFTRST_CON04,Offset=0x30410********/
+#define SRST_H_SDMMC0			786496
+#define SRST_H_SDMMC1			786498
+#define SRST_H_EMMC			786504
+#define SRST_A_EMMC			786505
+#define SRST_C_EMMC			786506
+#define SRST_B_EMMC			786507
+#define SRST_T_EMMC			786508
+#define SRST_S_SFC			786509
+#define SRST_H_SFC			786510
+/********Name=PERISOFTRST_CON05,Offset=0x30414********/
+#define SRST_H_USB2HOST			786512
+#define SRST_H_USB2HOST_ARB		786513
+#define SRST_USB2HOST_UTMI		786514
+/********Name=PERISOFTRST_CON06,Offset=0x30418********/
+#define SRST_P_SPI1			786528
+#define SRST_SPI1			786529
+#define SRST_P_SPI2			786531
+#define SRST_SPI2			786532
+/********Name=PERISOFTRST_CON07,Offset=0x3041C********/
+#define SRST_P_UART1			786544
+#define SRST_P_UART2			786545
+#define SRST_P_UART3			786546
+#define SRST_P_UART4			786547
+#define SRST_P_UART5			786548
+#define SRST_P_UART6			786549
+#define SRST_P_UART7			786550
+#define SRST_P_UART8			786551
+#define SRST_P_UART9			786552
+#define SRST_S_UART1			786555
+#define SRST_S_UART2			786558
+/********Name=PERISOFTRST_CON08,Offset=0x30420********/
+#define SRST_S_UART3			786561
+#define SRST_S_UART4			786564
+#define SRST_S_UART5			786567
+#define SRST_S_UART6			786570
+#define SRST_S_UART7			786573
+/********Name=PERISOFTRST_CON09,Offset=0x30424********/
+#define SRST_S_UART8			786576
+#define SRST_S_UART9			786579
+/********Name=PERISOFTRST_CON10,Offset=0x30428********/
+#define SRST_P_PWM1_PERI		786592
+#define SRST_PWM1_PERI			786593
+#define SRST_P_PWM2_PERI		786595
+#define SRST_PWM2_PERI			786596
+#define SRST_P_PWM3_PERI		786598
+#define SRST_PWM3_PERI			786599
+/********Name=PERISOFTRST_CON11,Offset=0x3042C********/
+#define SRST_P_CAN0			786608
+#define SRST_CAN0			786609
+#define SRST_P_CAN1			786610
+#define SRST_CAN1			786611
+/********Name=PERISOFTRST_CON12,Offset=0x30430********/
+#define SRST_A_CRYPTO			786624
+#define SRST_H_CRYPTO			786625
+#define SRST_P_CRYPTO			786626
+#define SRST_CORE_CRYPTO		786627
+#define SRST_PKA_CRYPTO			786628
+#define SRST_H_KLAD			786629
+#define SRST_P_KEY_READER		786630
+#define SRST_H_RK_RNG_NS		786631
+#define SRST_H_RK_RNG_S			786632
+#define SRST_H_TRNG_NS			786633
+#define SRST_H_TRNG_S			786634
+#define SRST_H_CRYPTO_S			786635
+/********Name=PERISOFTRST_CON13,Offset=0x30434********/
+#define SRST_P_PERI_WDT			786640
+#define SRST_T_PERI_WDT			786641
+#define SRST_A_SYSMEM			786642
+#define SRST_H_BOOTROM			786643
+#define SRST_P_PERI_GRF			786644
+#define SRST_A_DMAC			786645
+#define SRST_A_RKDMAC			786646
+/********Name=PERISOFTRST_CON14,Offset=0x30438********/
+#define SRST_P_OTPC_NS			786656
+#define SRST_SBPI_OTPC_NS		786657
+#define SRST_USER_OTPC_NS		786658
+#define SRST_P_OTPC_S			786659
+#define SRST_SBPI_OTPC_S		786660
+#define SRST_USER_OTPC_S		786661
+#define SRST_OTPC_ARB			786662
+#define SRST_P_OTPPHY			786663
+#define SRST_OTP_NPOR			786664
+/********Name=PERISOFTRST_CON15,Offset=0x3043C********/
+#define SRST_P_USB2PHY			786672
+#define SRST_USB2PHY_POR		786676
+#define SRST_USB2PHY_OTG		786677
+#define SRST_USB2PHY_HOST		786678
+#define SRST_P_PIPEPHY			786679
+/********Name=PERISOFTRST_CON16,Offset=0x30440********/
+#define SRST_P_SARADC			786692
+#define SRST_SARADC			786693
+#define SRST_SARADC_PHY			786694
+#define SRST_P_IOC_VCCIO234		786700
+/********Name=PERISOFTRST_CON17,Offset=0x30444********/
+#define SRST_P_PERI_GPIO1		786704
+#define SRST_P_PERI_GPIO2		786705
+#define SRST_PERI_GPIO1			786706
+#define SRST_PERI_GPIO2			786707
+
+#endif
diff --git a/u-boot/include/dt-bindings/display/rockchip-tve.h b/u-boot/include/dt-bindings/display/rockchip-tve.h
new file mode 100644
index 0000000..d72d692
--- /dev/null
+++ b/u-boot/include/dt-bindings/display/rockchip-tve.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+
+#ifndef _DT_BINDINGS_ROCKCHIP_TVE_H
+#define _DT_BINDINGS_ROCKCHIP_TVE_H
+
+/* tve dclk upsample mode */
+#define	DCLK_UPSAMPLEx1		0
+#define	DCLK_UPSAMPLEx2		1
+#define	DCLK_UPSAMPLEx4		2
+
+#endif
diff --git a/u-boot/include/dt-bindings/power/rk3528-power.h b/u-boot/include/dt-bindings/power/rk3528-power.h
new file mode 100644
index 0000000..4f7c978
--- /dev/null
+++ b/u-boot/include/dt-bindings/power/rk3528-power.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+#ifndef __DT_BINDINGS_POWER_RK3528_POWER_H__
+#define __DT_BINDINGS_POWER_RK3528_POWER_H__
+
+/*
+ * RK3528 idle id Summary.
+ */
+#define RK3528_PD_PMU		0
+#define RK3528_PD_BUS		1
+#define RK3528_PD_DDR		2
+#define RK3528_PD_MSCH		3
+#define RK3528_PD_GPU		4
+#define RK3528_PD_RKVDEC	5
+#define RK3528_PD_RKVENC	6
+#define RK3528_PD_VO		7
+#define RK3528_PD_VPU		8
+
+#endif
diff --git a/u-boot/include/dt-bindings/power/rk3562-power.h b/u-boot/include/dt-bindings/power/rk3562-power.h
new file mode 100644
index 0000000..ed57c40
--- /dev/null
+++ b/u-boot/include/dt-bindings/power/rk3562-power.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __DT_BINDINGS_POWER_RK3562_POWER_H__
+#define __DT_BINDINGS_POWER_RK3562_POWER_H__
+
+/* VD_CORE */
+#define RK3562_PD_CPU_0		0
+#define RK3562_PD_CPU_1		1
+#define RK3562_PD_CPU_2		2
+#define RK3562_PD_CPU_3		3
+#define RK3562_PD_CORE_ALIVE	4
+
+/* VD_PMU */
+#define RK3562_PD_PMU		5
+#define RK3562_PD_PMU_ALIVE	6
+
+/* VD_NPU */
+#define RK3562_PD_NPU		7
+
+/* VD_GPU */
+#define RK3562_PD_GPU		8
+
+/* VD_LOGIC */
+#define RK3562_PD_DDR		9
+#define RK3562_PD_VEPU		10
+#define RK3562_PD_VDPU		11
+#define RK3562_PD_VI		12
+#define RK3562_PD_VO		13
+#define RK3562_PD_RGA		14
+#define RK3562_PD_EBK		15
+#define RK3562_PD_PHP		16
+#define RK3562_PD_LOGIC_ALIVE	17
+
+#endif
diff --git a/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h b/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h
index 1436e1d..ec4e5dd 100644
--- a/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h
+++ b/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h
@@ -20,5 +20,7 @@
 #define BOOT_CHARGING		(REBOOT_FLAG + 11)
 /* enter usb mass storage mode */
 #define BOOT_UMS		(REBOOT_FLAG + 12)
+/* reboot system quiescent */
+#define BOOT_QUIESCENT		(REBOOT_FLAG + 14)
 
 #endif
diff --git a/u-boot/include/dt-bindings/suspend/rockchip-rk3528.h b/u-boot/include/dt-bindings/suspend/rockchip-rk3528.h
new file mode 100644
index 0000000..7f81bf8
--- /dev/null
+++ b/u-boot/include/dt-bindings/suspend/rockchip-rk3528.h
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Header providing constants for Rockchip suspend bindings.
+ *
+ * Copyright (C) 2022, Rockchip Electronics Co., Ltd
+ * Author: XiaoDong.Huang
+ */
+
+#ifndef __DT_BINDINGS_RK3528_PM_H__
+#define __DT_BINDINGS_RK3528_PM_H__
+/******************************bits ops************************************/
+
+#ifndef BIT
+#define BIT(nr)				(1 << (nr))
+#endif
+
+#define RKPM_SLP_ARMPD			BIT(0)
+#define RKPM_SLP_ARMOFF			BIT(1)
+#define RKPM_SLP_ARMOFF_DDRPD		BIT(2)
+#define RKPM_SLP_ARMOFF_LOGOFF		BIT(3)
+
+/* all plls except ddr's pll*/
+#define RKPM_SLP_PMU_HW_PLLS_PD		BIT(8)
+#define RKPM_SLP_PMU_PMUALIVE_32K	BIT(9)
+#define RKPM_SLP_PMU_DIS_OSC		BIT(10)
+
+#define RKPM_SLP_CLK_GT			BIT(16)
+#define RKPM_SLP_PMIC_LP		BIT(17)
+
+#define RKPM_SLP_32K_EXT		BIT(24)
+#define RKPM_SLP_TIME_OUT_WKUP		BIT(25)
+#define RKPM_SLP_PMU_DBG		BIT(26)
+
+/* the wake up source */
+#define RKPM_CPU0_WKUP_EN		BIT(0)
+#define RKPM_CPU1_WKUP_EN		BIT(1)
+#define RKPM_CPU2_WKUP_EN		BIT(2)
+#define RKPM_CPU3_WKUP_EN		BIT(3)
+#define RKPM_GPIO_WKUP_EN		BIT(4)
+#define RKPM_HDMI_HDP_WKUP_EN		BIT(5)
+#define RKPM_HDMI_CEC_WKUP_EN		BIT(6)
+#define RKPM_PWMIR_WKUP_EN		BIT(7)
+#define RKPM_GMAC_WKUP_EN		BIT(8)
+#define RKPM_TIMER_WKUP_EN		BIT(9)
+#define RKPM_USBDEV_WKUP_EN		BIT(10)
+#define RKPM_SYSINT_WKUP_EN		BIT(11)
+#define RKPM_TIME_OUT_WKUP_EN		BIT(12)
+
+/* the pwm regulator */
+#define RKPM_PWM0_M0_REGULATOR_EN	BIT(0)
+#define RKPM_PWM1_M0_REGULATOR_EN	BIT(1)
+#define RKPM_PWM2_M0_REGULATOR_EN	BIT(2)
+
+#endif
diff --git a/u-boot/include/edid.h b/u-boot/include/edid.h
index 6cfc308..0967912 100644
--- a/u-boot/include/edid.h
+++ b/u-boot/include/edid.h
@@ -882,6 +882,38 @@
 	u32 fps;
 };
 
+struct csc_info {
+	u16 hue;
+	u16 saturation;
+	u16 contrast;
+	u16 brightness;
+	u16 r_gain;
+	u16 g_gain;
+	u16 b_gain;
+	u16 r_offset;
+	u16 g_offset;
+	u16 b_offset;
+	u16 csc_enable;
+};
+
+
+#define ACM_GAIN_LUT_HY_LENGTH		(9*17)
+#define ACM_GAIN_LUT_HY_TOTAL_LENGTH	(ACM_GAIN_LUT_HY_LENGTH * 3)
+#define ACM_GAIN_LUT_HS_LENGTH		(13*17)
+#define ACM_GAIN_LUT_HS_TOTAL_LENGTH (ACM_GAIN_LUT_HS_LENGTH * 3)
+#define ACM_DELTA_LUT_H_LENGTH		65
+#define ACM_DELTA_LUT_H_TOTAL_LENGTH	(ACM_DELTA_LUT_H_LENGTH * 3)
+
+struct acm_data {
+	s16 delta_lut_h[ACM_DELTA_LUT_H_TOTAL_LENGTH];
+	s16 gain_lut_hy[ACM_GAIN_LUT_HY_TOTAL_LENGTH];
+	s16 gain_lut_hs[ACM_GAIN_LUT_HS_TOTAL_LENGTH];
+	u16 y_gain;
+	u16 h_gain;
+	u16 s_gain;
+	u16 acm_enable;
+};
+
 struct base2_disp_info {
 	char disp_head_flag[6];
 	struct base2_screen_info screen_info[4];
@@ -890,8 +922,15 @@
 	struct base2_gamma_lut_data gamma_lut_data;
 	struct base2_cubic_lut_data cubic_lut_data;
 	struct framebuffer_info framebuffer_info;
-	u32 reserved[244];
+	u32 cacm_header;
+	u32 reserved[243];
 	u32 crc;
+	/* baseparameter version 3.0 add */
+	struct csc_info csc_info;
+	struct acm_data acm_data;
+	u8 resv2[10*1024]; /* */
+	u32 crc2;
+	/* baseparameter version 3.0 add */
 };
 
 struct base2_disp_header {
diff --git a/u-boot/include/image.h b/u-boot/include/image.h
index 449bd36..88009cc 100644
--- a/u-boot/include/image.h
+++ b/u-boot/include/image.h
@@ -703,6 +703,7 @@
 		 bootm_headers_t *images,
 		 char **of_flat_tree, ulong *of_size);
 void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
+void boot_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
 #ifdef CONFIG_SYSMEM
 int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob);
 #else
@@ -1347,9 +1348,13 @@
 #endif /* CONFIG_FIT */
 
 #if defined(CONFIG_ANDROID_BOOT_IMAGE)
+#include <android_image.h>
+
 struct andr_img_hdr;
 u32 android_bcb_msg_sector_offset(void);
-u32 android_image_major_version(void);
+int android_image_init_resource(struct blk_desc *desc,
+				disk_partition_t *out_part,
+				ulong *out_blk_offset);
 int android_image_check_header(const struct andr_img_hdr *hdr);
 int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
 			     ulong *os_data, ulong *os_len);
@@ -1368,6 +1373,10 @@
 
 struct andr_img_hdr *populate_andr_img_hdr(struct blk_desc *dev_desc,
 					   disk_partition_t *part_boot);
+int populate_boot_info(const struct boot_img_hdr_v34 *boot_hdr,
+		       const struct vendor_boot_img_hdr_v34 *vendor_boot_hdr,
+		       const struct boot_img_hdr_v34 *init_boot_hdr,
+		       struct andr_img_hdr *hdr, bool save_hdr);
 
 /** android_image_load - Load an Android Image from storage.
  *
@@ -1392,6 +1401,9 @@
 int android_image_load_by_partname(struct blk_desc *dev_desc,
 				   const char *boot_partname,
 				   unsigned long *load_address);
+
+int android_image_verify_resource(const char *boot_part, ulong *resc_buf);
+
 #endif /* CONFIG_ANDROID_BOOT_IMAGE */
 
 int bootm_parse_comp(const unsigned char *hdr);
diff --git a/u-boot/include/irq-platform.h b/u-boot/include/irq-platform.h
index 222d5c7..53516fc 100644
--- a/u-boot/include/irq-platform.h
+++ b/u-boot/include/irq-platform.h
@@ -241,6 +241,46 @@
 #define IRQ_GPIO3			69
 #define IRQ_GPIO4			70
 
+#elif defined(CONFIG_ROCKCHIP_RK3528)
+#define GPIO0_PHYS			0xff610000
+#define GPIO1_PHYS			0xffaf0000
+#define GPIO2_PHYS			0xffb00000
+#define GPIO3_PHYS			0xffb10000
+#define GPIO4_PHYS			0xffb20000
+
+#define GIC_IRQS_NR			(5 * 32)
+#define GPIO_IRQS_NR			(5 * 32)
+
+#define GPIO_BANK_NUM			5
+#define GPIO_BANK_PINS			32
+
+#define IRQ_TIMER0			63
+#define IRQ_GPIO0			103
+#define IRQ_GPIO1			105
+#define IRQ_GPIO2			107
+#define IRQ_GPIO3			108
+#define IRQ_GPIO4			110
+
+#elif defined(CONFIG_ROCKCHIP_RK3562)
+#define GPIO0_PHYS			0xff260000
+#define GPIO1_PHYS			0xff620000
+#define GPIO2_PHYS			0xff630000
+#define GPIO3_PHYS			0xffac0000
+#define GPIO4_PHYS			0xffad0000
+
+#define GIC_IRQS_NR			(5 * 32)
+#define GPIO_IRQS_NR			(5 * 32)
+
+#define GPIO_BANK_NUM			5
+#define GPIO_BANK_PINS			32
+
+#define IRQ_TIMER0			77
+#define IRQ_GPIO0			32
+#define IRQ_GPIO1			34
+#define IRQ_GPIO2			36
+#define IRQ_GPIO3			38
+#define IRQ_GPIO4			40
+
 #elif defined(CONFIG_ROCKCHIP_RK3568)
 #define GPIO0_PHYS			0xfdd60000
 #define GPIO1_PHYS			0xfe740000
diff --git a/u-boot/include/key.h b/u-boot/include/key.h
index 7a9f9e4..0ccf7b1 100644
--- a/u-boot/include/key.h
+++ b/u-boot/include/key.h
@@ -33,9 +33,10 @@
 
 	/* ADC key */
 	u8 channel;
-	u32 adcval;
-	u32 min;
-	u32 max;
+	int in_volt;
+	int center;
+	int min;
+	int max;
 
 	/* GPIO key */
 	u32 irq;
diff --git a/u-boot/include/linux/dw_hdmi.h b/u-boot/include/linux/dw_hdmi.h
index 18433ea..3d15ead 100644
--- a/u-boot/include/linux/dw_hdmi.h
+++ b/u-boot/include/linux/dw_hdmi.h
@@ -92,6 +92,7 @@
 	RK3366_HDMI,
 	RK3368_HDMI,
 	RK3399_HDMI,
+	RK3528_HDMI,
 	RK3568_HDMI,
 };
 
@@ -177,7 +178,7 @@
 	const struct dw_hdmi_mpll_config *mpll_cfg;
 	const struct dw_hdmi_mpll_config *mpll_cfg_420;
 	const struct dw_hdmi_curr_ctrl *cur_ctr;
-	const struct dw_hdmi_phy_config *phy_config;
+	struct dw_hdmi_phy_config *phy_config;
 	int (*configure_phy)(struct dw_hdmi *hdmi,
 			     const struct dw_hdmi_plat_data *pdata,
 			     unsigned long mpixelclock);
diff --git a/u-boot/include/linux/mtd/mtd.h b/u-boot/include/linux/mtd/mtd.h
index b848c0d..c5c9c41 100644
--- a/u-boot/include/linux/mtd/mtd.h
+++ b/u-boot/include/linux/mtd/mtd.h
@@ -551,30 +551,6 @@
 }
 #endif
 
-#ifdef __UBOOT__
-/*
- * Debugging macro and defines
- */
-#define MTD_DEBUG_LEVEL0	(0)	/* Quiet   */
-#define MTD_DEBUG_LEVEL1	(1)	/* Audible */
-#define MTD_DEBUG_LEVEL2	(2)	/* Loud    */
-#define MTD_DEBUG_LEVEL3	(3)	/* Noisy   */
-
-#ifdef CONFIG_MTD_DEBUG
-#define MTDDEBUG(n, args...)				\
-	do {						\
-		if (n <= CONFIG_MTD_DEBUG_VERBOSE)	\
-			printk(KERN_INFO args);		\
-	} while(0)
-#else /* CONFIG_MTD_DEBUG */
-#define MTDDEBUG(n, args...)				\
-	do {						\
-		if (0)					\
-			printk(KERN_INFO args);		\
-	} while(0)
-#endif /* CONFIG_MTD_DEBUG */
-#endif
-
 static inline int mtd_is_bitflip(int err) {
 	return err == -EUCLEAN;
 }
diff --git a/u-boot/include/linux/mtd/spinand.h b/u-boot/include/linux/mtd/spinand.h
index 99024f7..cc905f8 100644
--- a/u-boot/include/linux/mtd/spinand.h
+++ b/u-boot/include/linux/mtd/spinand.h
@@ -252,6 +252,7 @@
 extern const struct spinand_manufacturer winbond_spinand_manufacturer;
 extern const struct spinand_manufacturer dosilicon_spinand_manufacturer;
 extern const struct spinand_manufacturer esmt_spinand_manufacturer;
+extern const struct spinand_manufacturer xincun_spinand_manufacturer;
 extern const struct spinand_manufacturer xtx_spinand_manufacturer;
 extern const struct spinand_manufacturer hyf_spinand_manufacturer;
 extern const struct spinand_manufacturer fmsh_spinand_manufacturer;
@@ -262,6 +263,7 @@
 extern const struct spinand_manufacturer silicongo_spinand_manufacturer;
 extern const struct spinand_manufacturer unim_spinand_manufacturer;
 extern const struct spinand_manufacturer skyhigh_spinand_manufacturer;
+extern const struct spinand_manufacturer gsto_spinand_manufacturer;
 
 /**
  * struct spinand_op_variants - SPI NAND operation variants
diff --git a/u-boot/include/max96745.h b/u-boot/include/max96745.h
index b69e011..2eb0450 100644
--- a/u-boot/include/max96745.h
+++ b/u-boot/include/max96745.h
@@ -17,6 +17,21 @@
 #define RESET_ALL		BIT(7)
 #define SLEEP			BIT(3)
 
+/* 0011h */
+#define CXTP_B			BIT(2)
+#define CXTP_A			BIT(0)
+
+/* 0028h, 0032h */
+#define LINK_EN			BIT(7)
+#define TX_RATE			GENMASK(3, 2)
+
+/* 0029h, 0033h */
+#define RESET_LINK		BIT(0)
+#define RESET_ONESHOT		BIT(1)
+
+/* 002Ah, 0034h */
+#define LINK_LOCKED		BIT(0)
+
 /* 0076h, 0086h */
 #define DIS_REM_CC		BIT(7)
 
diff --git a/u-boot/include/max96752f.h b/u-boot/include/max96752f.h
deleted file mode 100644
index cda7291..0000000
--- a/u-boot/include/max96752f.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * (C) Copyright 2022 Rockchip Electronics Co., Ltd
- */
-
-#ifndef _MAX96752F_H_
-#define _MAX96752F_H_
-
-#include <linux/bitfield.h>
-
-#define GPIO_A_REG(gpio)	(0x0200 + ((gpio) * 3))
-#define GPIO_B_REG(gpio)	(0x0201 + ((gpio) * 3))
-#define GPIO_C_REG(gpio)	(0x0202 + ((gpio) * 3))
-#define OLDI_REG(x)		(0x01cd + (x))
-
-/* 0002h */
-#define AUD_TX_EN		BIT(2)
-
-/* 0010h */
-#define RESET_ALL		BIT(7)
-#define RESET_LINK		BIT(6)
-#define RESET_ONESHOT		BIT(5)
-#define AUTO_LINK		BIT(4)
-#define SLEEP			BIT(3)
-#define LINK_CFG		GENMASK(1, 0)
-
-/* 0050h */
-#define STR_SEL			GENMASK(1, 0)
-
-/* 0073h */
-#define TX_SRC_ID		GENMASK(2, 0)
-
-/* 0140h */
-#define AUD_RX_EN		BIT(0)
-
-/* 0200h */
-#define RES_CFG			BIT(7)
-#define TX_PRIO			BIT(6)
-#define TX_COMP_EN		BIT(5)
-#define GPIO_OUT		BIT(4)
-#define GPIO_IN			BIT(3)
-#define GPIO_RX_EN		BIT(2)
-#define GPIO_TX_EN		BIT(1)
-#define GPIO_OUT_DIS		BIT(0)
-
-/* 0201h */
-#define PULL_UPDN_SEL		GENMASK(7, 6)
-#define OUT_TYPE		BIT(5)
-#define GPIO_TX_ID		GENMASK(4, 0)
-
-/* 0202h */
-#define OVR_RES_CFG		BIT(7)
-#define GPIO_RX_ID		GENMASK(4, 0)
-
-/* 01CEh */
-#define OLDI_OUTSEL		BIT(7)
-#define OLDI_FORMAT		BIT(6)
-#define OLDI_4TH_LANE		BIT(5)
-#define OLDI_SWAP_AB		BIT(4)
-#define OLDI_SPL_EN		BIT(3)
-#define OLDI_SPL_MODE		GENMASK(2, 1)
-#define OLDI_SPL_POL		BIT(0)
-
-void max96752f_init(struct udevice *dev);
-
-#endif
diff --git a/u-boot/include/max96755f.h b/u-boot/include/max96755f.h
index deea4ce..de33ab6 100644
--- a/u-boot/include/max96755f.h
+++ b/u-boot/include/max96755f.h
@@ -181,6 +181,7 @@
 	struct drm_display_mode mode;
 	u32 num_lanes;
 	struct gpio_desc lock_gpio;
+	u32 dsi_lane_map[4];
 };
 
 #endif
diff --git a/u-boot/include/mmc.h b/u-boot/include/mmc.h
index 0d23e40..45b77ec 100644
--- a/u-boot/include/mmc.h
+++ b/u-boot/include/mmc.h
@@ -192,6 +192,8 @@
 #define EXT_CSD_HS_TIMING		185	/* R/W */
 #define EXT_CSD_REV			192	/* RO */
 #define EXT_CSD_CARD_TYPE		196	/* RO */
+#define EXT_CSD_CARD_TYPE		196	/* RO */
+#define EXT_CSD_DRIVER_STRENGTH		197	/* RO */
 #define EXT_CSD_SEC_CNT			212	/* RO, 4 bytes */
 #define EXT_CSD_HC_WP_GRP_SIZE		221	/* RO */
 #define EXT_CSD_HC_ERASE_GRP_SIZE	224	/* RO */
@@ -231,6 +233,7 @@
 #define EXT_CSD_BUS_WIDTH_8	2	/* Card is in 8 bit mode */
 #define EXT_CSD_DDR_BUS_WIDTH_4	5	/* Card is in 4 bit DDR mode */
 #define EXT_CSD_DDR_BUS_WIDTH_8	6	/* Card is in 8 bit DDR mode */
+#define EXT_CSD_BUS_WIDTH_STROBE BIT(7) /* Enhanced strobe mode */
 
 #define EXT_CSD_TIMING_BC	0	/* Backwards compatility */
 #define EXT_CSD_TIMING_HS	1	/* High speed */
@@ -470,6 +473,8 @@
 	 * @return 0 if write-enabled, 1 if write-protected, -ve on error
 	 */
 	int (*execute_tuning)(struct udevice *dev, u32 opcode);
+	/* set_enhanced_strobe() - set HS400 enhanced strobe */
+	int (*set_enhanced_strobe)(struct udevice *dev);
 };
 
 #define mmc_get_ops(dev)        ((struct dm_mmc_ops *)(dev)->driver->ops)
@@ -487,6 +492,7 @@
 int mmc_getcd(struct mmc *mmc);
 int mmc_getwp(struct mmc *mmc);
 
+int mmc_set_enhanced_strobe(struct mmc *mmc);
 #else
 struct mmc_ops {
 	bool (*card_busy)(struct mmc *mmc);
@@ -511,6 +517,7 @@
 	uint f_max;
 	uint b_max;
 	unsigned char part_type;
+	u8 fixed_drv_type;
 };
 
 struct sd_ssr {
@@ -598,6 +605,7 @@
 #if CONFIG_IS_ENABLED(DM_MMC)
 	struct udevice *dev;	/* Device for this MMC controller */
 #endif
+	u8 raw_driver_strength;
 };
 
 struct mmc_hwpart_conf {
@@ -785,5 +793,7 @@
  */
 void mmc_gpio_init_direct(void);
 
+#define mmc_driver_type_mask(n)		(1 << (n))
+
 #endif /* _MMC_H_ */
 
diff --git a/u-boot/include/mp_boot.h b/u-boot/include/mp_boot.h
new file mode 100644
index 0000000..44a16c6
--- /dev/null
+++ b/u-boot/include/mp_boot.h
@@ -0,0 +1,25 @@
+/*
+ * (C) Copyright 2023 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef _MP_BOOT_H_
+#define _MP_BOOT_H_
+
+#include <spl.h>
+
+struct task_data {
+	struct spl_load_info info;
+
+	/* to be filled by smp task */
+	void *boot_addr;
+	ulong boot_size;
+};
+
+void mpb_init_1(struct spl_load_info info);
+void mpb_init_x(int evt);
+ulong mpb_post(int evt);
+
+#endif
+
diff --git a/u-boot/include/power/rk8xx_pmic.h b/u-boot/include/power/rk8xx_pmic.h
index aa51e88..84d1104 100644
--- a/u-boot/include/power/rk8xx_pmic.h
+++ b/u-boot/include/power/rk8xx_pmic.h
@@ -206,6 +206,7 @@
 #define RK817_ID_LSB	0xee
 #define RK8XX_ID_MSK	0xfff0
 
+#define RK817_PMIC_CHRG_TERM	0xe6
 #define RK817_PMIC_SYS_CFG1	0xf1
 #define RK817_PMIC_SYS_CFG3	0xf4
 #define RK817_GPIO_INT_CFG	0xfe
@@ -287,6 +288,7 @@
 	uint8_t sleep_pin;
 	uint8_t rst_fun;
 	int not_save_power_en;
+	int sys_can_sd;
 };
 
 int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt);
diff --git a/u-boot/include/rk_timer_irq.h b/u-boot/include/rk_timer_irq.h
index 44fc395..69f9ee3 100644
--- a/u-boot/include/rk_timer_irq.h
+++ b/u-boot/include/rk_timer_irq.h
@@ -66,6 +66,12 @@
 #elif defined(CONFIG_ROCKCHIP_RV1126)
 #define TIMER_BASE		(0xFF660000 + 0x20)	/* TIMER 1 */
 #define TIMER_IRQ		IRQ_TIMER1
+#elif defined(CONFIG_ROCKCHIP_RK3528)
+#define TIMER_BASE		(0xFFAB0000 + 0x00)	/* TIMER 0 */
+#define TIMER_IRQ		IRQ_TIMER0
+#elif defined(CONFIG_ROCKCHIP_RK3562)
+#define TIMER_BASE		(0xFFA50000 + 0x00)	/* TIMER 0 */
+#define TIMER_IRQ		IRQ_TIMER0
 #elif defined(CONFIG_ROCKCHIP_RK3568)
 /* Only timer0 can wakeup system suspend */
 #define TIMER_BASE		(0xFE5F0000 + 0x00)	/* TIMER 1 */
diff --git a/u-boot/include/rockchip/crypto_v2.h b/u-boot/include/rockchip/crypto_v2.h
index 9469266..41d1e83 100644
--- a/u-boot/include/rockchip/crypto_v2.h
+++ b/u-boot/include/rockchip/crypto_v2.h
@@ -564,7 +564,7 @@
 #define	LLI_DMA_CTRL_DST_DONE		_BIT(9)
 #define	LLI_DMA_CTRL_SRC_DONE		_BIT(10)
 
-#define LLI_USER_CPIHER_START		_BIT(0)
+#define LLI_USER_CIPHER_START		_BIT(0)
 #define LLI_USER_STRING_START		_BIT(1)
 #define LLI_USER_STRING_LAST		_BIT(2)
 #define LLI_USER_STRING_AAD		_BIT(3)
diff --git a/u-boot/include/scsi.h b/u-boot/include/scsi.h
index 7173912..23a275f 100644
--- a/u-boot/include/scsi.h
+++ b/u-boot/include/scsi.h
@@ -7,6 +7,9 @@
  #ifndef _SCSI_H
  #define _SCSI_H
 
+#include <asm/cache.h>
+#include <linux/dma-direction.h>
+
 struct scsi_cmd {
 	unsigned char		cmd[16];					/* command				   */
 	/* for request sense */
@@ -27,6 +30,7 @@
 	unsigned long		trans_bytes;			/* tranfered bytes		*/
 
 	unsigned int		priv;
+	enum dma_data_direction dma_dir;
 };
 
 /*-----------------------------------------------------------
diff --git a/u-boot/include/sdhci.h b/u-boot/include/sdhci.h
index 354f1e7..ebbca24 100644
--- a/u-boot/include/sdhci.h
+++ b/u-boot/include/sdhci.h
@@ -256,6 +256,18 @@
 	void	(*set_ios_post)(struct sdhci_host *host);
 	int	(*set_clock)(struct sdhci_host *host, unsigned int clock);
 	void	(*set_clock_ext)(struct sdhci_host *host, u32 div);
+
+	/**
+	 * set_enhanced_strobe() - Set HS400 Enhanced Strobe config
+	 *
+	 * This is called after setting the card speed and mode to
+	 * HS400 ES, and should set any host-specific configuration
+	 * necessary for it.
+	 *
+	 * @host: SDHCI host structure
+	 * Return: 0 if successful, -ve on error
+	 */
+	int	(*set_enhanced_strobe)(struct sdhci_host *host);
 };
 
 struct sdhci_host {
@@ -280,6 +292,7 @@
 	struct mmc_config cfg;
 };
 
+void sdhci_enable_clk(struct sdhci_host *host, u16 clk);
 int sdhci_set_clock(struct sdhci_host *host, unsigned int clock);
 
 #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
diff --git a/u-boot/include/spl_ab.h b/u-boot/include/spl_ab.h
index 6075555..f24d3ff 100644
--- a/u-boot/include/spl_ab.h
+++ b/u-boot/include/spl_ab.h
@@ -6,6 +6,7 @@
 #ifndef _SPL_AB_H_
 #define _SPL_AB_H_
 
+#include <spl.h>
 #include <android_avb/libavb_ab.h>
 #include <android_avb/avb_ab_flow.h>
 
@@ -45,4 +46,13 @@
  */
 int spl_ab_decrease_tries(struct blk_desc *dev_desc);
 
+/*
+ * spl_ab_decrease_reset
+ *
+ * @dev_desc: block description
+ *
+ * return: 0 success, others fail.
+ */
+int spl_ab_decrease_reset(struct blk_desc *dev_desc);
+
  #endif
diff --git a/u-boot/include/spl_display.h b/u-boot/include/spl_display.h
new file mode 100644
index 0000000..3cb7fe2
--- /dev/null
+++ b/u-boot/include/spl_display.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier:     GPL-2.0+ */
+/*
+ * (C) Copyright 2023 Rockchip Electronics Co., Ltd
+ *
+ */
+
+#ifndef _SPL_DISPLAY_H_
+#define _SPL_DISPLAY_H_
+
+#include <common.h>
+#include <drm_modes.h>
+#include <mp_boot.h>
+
+/* SPL display */
+#define RK3528_VOP_BASE				0xff840000
+#define RK3528_HDMI_BASE			0xff8d0000
+#define RK3528_HDMIPHY_BASE			0xffe00000
+#define RK3528_CRU_BASE				0xff4a0000
+#define RK3528_GPIO0_IOC_BASE			0xff540000
+#define RK3528_GPIO_BASE			0xff610000
+
+struct spl_display_info {
+	struct drm_display_mode mode;
+	u32 bus_format;
+	u32 enabled;
+};
+#endif
+
diff --git a/u-boot/include/u-boot/sha1.h b/u-boot/include/u-boot/sha1.h
index 2634a29..3bb6e62 100644
--- a/u-boot/include/u-boot/sha1.h
+++ b/u-boot/include/u-boot/sha1.h
@@ -31,7 +31,7 @@
 typedef struct
 {
     unsigned long total[2];	/*!< number of bytes processed	*/
-    unsigned long state[5];	/*!< intermediate digest state	*/
+    uint32_t state[5];		/*!< intermediate digest state	*/
     unsigned char buffer[64];	/*!< data block being processed */
 }
 sha1_context;
diff --git a/u-boot/lib/avb/libavb/avb_sha512.c b/u-boot/lib/avb/libavb/avb_sha512.c
index d3e437b..2cdd6ca 100644
--- a/u-boot/lib/avb/libavb/avb_sha512.c
+++ b/u-boot/lib/avb/libavb/avb_sha512.c
@@ -38,33 +38,6 @@
 #include <android_avb/avb_sha.h>
 #include <android_avb/avb_util.h>
 
-/* Crypto-v1 is not support sha512 */
-#ifdef CONFIG_ROCKCHIP_CRYPTO_V2
-void avb_sha512_init(AvbSHA512Ctx* ctx) {
-  ctx->crypto_ctx.algo = CRYPTO_SHA512;
-  ctx->crypto_ctx.length = ctx->tot_len;
-  memset(ctx->buf, 0, sizeof(ctx->buf));
-
-  ctx->crypto_dev = crypto_get_device(ctx->crypto_ctx.algo);
-  if (!ctx->crypto_dev)
-    avb_error("Can't get sha512 crypto device\n");
-  else
-    crypto_sha_init(ctx->crypto_dev, &ctx->crypto_ctx);
-}
-
-void avb_sha512_update(AvbSHA512Ctx* ctx, const uint8_t* data, size_t len) {
-  if (ctx->crypto_dev)
-    crypto_sha_update(ctx->crypto_dev, (u32 *)data, len);
-}
-
-uint8_t* avb_sha512_final(AvbSHA512Ctx* ctx) {
-  if (ctx->crypto_dev)
-    crypto_sha_final(ctx->crypto_dev, &ctx->crypto_ctx, ctx->buf);
-
-  return ctx->buf;
-}
-
-#else
 #define SHFR(x, n) (x >> n)
 #define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n)))
 #define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n)))
@@ -160,6 +133,19 @@
 /* SHA-512 implementation */
 
 void avb_sha512_init(AvbSHA512Ctx* ctx) {
+/* Crypto-v1 is not support sha512 */
+#ifdef CONFIG_ROCKCHIP_CRYPTO_V2
+  ctx->crypto_ctx.algo = CRYPTO_SHA512;
+  ctx->crypto_ctx.length = ctx->tot_len;
+  memset(ctx->buf, 0, sizeof(ctx->buf));
+
+  ctx->crypto_dev = crypto_get_device(ctx->crypto_ctx.algo);
+  /* If there is no available crypto device, calculate in software instead. */
+  if (ctx->crypto_dev) {
+    crypto_sha_init(ctx->crypto_dev, &ctx->crypto_ctx);
+    return;
+  }
+#endif
 #ifdef UNROLL_LOOPS_SHA512
   ctx->h[0] = sha512_h0[0];
   ctx->h[1] = sha512_h0[1];
@@ -347,6 +333,15 @@
 }
 
 void avb_sha512_update(AvbSHA512Ctx* ctx, const uint8_t* data, size_t len) {
+/* Crypto-v1 is not support sha512 */
+#ifdef CONFIG_ROCKCHIP_CRYPTO_V2
+  /* If there is no available crypto device, calculate in software instead. */
+  if (ctx->crypto_dev) {
+    crypto_sha_update(ctx->crypto_dev, (u32 *)data, len);
+    return;
+  }
+#endif
+
   size_t block_nb;
   size_t new_len, rem_len, tmp_len;
   const uint8_t* shifted_data;
@@ -378,6 +373,15 @@
 }
 
 uint8_t* avb_sha512_final(AvbSHA512Ctx* ctx) {
+/* Crypto-v1 is not support sha512 */
+#ifdef CONFIG_ROCKCHIP_CRYPTO_V2
+  /* If there is no available crypto device, calculate in software instead. */
+  if (ctx->crypto_dev) {
+    crypto_sha_final(ctx->crypto_dev, &ctx->crypto_ctx, ctx->buf);
+    return ctx->buf;
+  }
+#endif
+
   size_t block_nb;
   size_t pm_len;
   uint64_t len_b;
@@ -414,4 +418,3 @@
 
   return ctx->buf;
 }
-#endif
diff --git a/u-boot/lib/avb/libavb/avb_slot_verify.c b/u-boot/lib/avb/libavb/avb_slot_verify.c
index af556e5..be3ff38 100644
--- a/u-boot/lib/avb/libavb/avb_slot_verify.c
+++ b/u-boot/lib/avb/libavb/avb_slot_verify.c
@@ -22,7 +22,7 @@
  * SOFTWARE.
  */
 #include <common.h>
-#include <sysmem.h>
+#include <android_image.h>
 #include <android_avb/avb_slot_verify.h>
 #include <android_avb/avb_chain_partition_descriptor.h>
 #include <android_avb/avb_cmdline.h>
@@ -30,6 +30,7 @@
 #include <android_avb/avb_hash_descriptor.h>
 #include <android_avb/avb_hashtree_descriptor.h>
 #include <android_avb/avb_kernel_cmdline_descriptor.h>
+#include <android_avb/avb_ops_user.h>
 #include <android_avb/avb_sha.h>
 #include <android_avb/avb_util.h>
 #include <android_avb/avb_vbmeta_image.h>
@@ -118,7 +119,7 @@
 
   /* Allocate and copy the partition. */
   if (!*out_image_preloaded) {
-    *out_image_buf = sysmem_alloc(MEM_AVB_ANDROID, image_size);
+    *out_image_buf = avb_malloc(image_size);
     if (*out_image_buf == NULL) {
       return AVB_SLOT_VERIFY_RESULT_ERROR_OOM;
     }
@@ -296,7 +297,7 @@
   bool image_preloaded = false;
   uint8_t* digest;
   size_t digest_len;
-  const char* found;
+  const char* found = NULL;
   uint64_t image_size;
   size_t expected_digest_len = 0;
   uint8_t expected_digest_buf[AVB_SHA512_DIGEST_SIZE];
@@ -388,7 +389,7 @@
       allow_verification_error);
   if (ret != AVB_SLOT_VERIFY_RESULT_OK) {
     goto out;
-  } else if (image_preloaded) {
+  } else if (allow_verification_error) {
     goto out;
   }
 
@@ -482,7 +483,7 @@
 
 fail:
   if (image_buf != NULL && !image_preloaded) {
-    sysmem_free((phys_addr_t)image_buf);
+    avb_free(image_buf);
   }
   return ret;
 }
@@ -556,7 +557,7 @@
 out:
   /* Free the current buffer if any. */
   if (image_buf != NULL && !image_preloaded) {
-    sysmem_free((phys_addr_t)image_buf);
+    avb_free(image_buf);
   }
   /* Buffers that are already saved in slot_data will be handled by the caller
    * even on failure. */
@@ -1662,7 +1663,7 @@
         avb_free(loaded_partition->partition_name);
       }
       if (loaded_partition->data != NULL && !loaded_partition->preloaded) {
-        sysmem_free((phys_addr_t)loaded_partition->data);
+        avb_free(loaded_partition->data);
       }
     }
     avb_free(data->loaded_partitions);
diff --git a/u-boot/lib/avb/libavb_user/Kconfig b/u-boot/lib/avb/libavb_user/Kconfig
index 3892094..249263e 100755
--- a/u-boot/lib/avb/libavb_user/Kconfig
+++ b/u-boot/lib/avb/libavb_user/Kconfig
@@ -16,7 +16,6 @@
 	    - only allow "boot_android" as bootcmd;
 	    - enter rockusb or fastboot when boot failed;
 	    - not allow ctrl+c to enter hush;
-	  only the CONFIG_BOOTDELAY can interrupt the bootflow.
 
 config SPL_AVB_LIBAVB_USER
 	bool "Android AVB read/write hardware for spl"
diff --git a/u-boot/lib/avb/libavb_user/avb_ops_user.c b/u-boot/lib/avb/libavb_user/avb_ops_user.c
index f7b2ac7..18c0c1f 100644
--- a/u-boot/lib/avb/libavb_user/avb_ops_user.c
+++ b/u-boot/lib/avb/libavb_user/avb_ops_user.c
@@ -81,10 +81,9 @@
 		return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
 	}
 
-	if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) {
-		printf("Could not find \"%s\" partition\n", partition);
+	if (part_get_info_by_name(dev_desc, partition, &part_info) < 0)
 		return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
-	}
+
 	*out_size_in_bytes = (part_info.size) * 512;
 	return AVB_IO_RESULT_OK;
 }
@@ -281,6 +280,7 @@
 {
 	if (out_is_unlocked) {
 #ifdef CONFIG_OPTEE_CLIENT
+		uint8_t vboot_flag = 0;
 		int ret;
 
 		ret = trusty_read_lock_state((uint8_t *)out_is_unlocked);
@@ -291,7 +291,16 @@
 		case TEE_ERROR_GENERIC:
 		case TEE_ERROR_NO_DATA:
 		case TEE_ERROR_ITEM_NOT_FOUND:
-			*out_is_unlocked = 1;
+			if (trusty_read_vbootkey_enable_flag(&vboot_flag)) {
+				printf("Can't read vboot flag\n");
+				return AVB_IO_RESULT_ERROR_IO;
+			}
+
+			if (vboot_flag)
+				*out_is_unlocked = 0;
+			else
+				*out_is_unlocked = 1;
+
 			if (trusty_write_lock_state(*out_is_unlocked)) {
 				printf("%s: init lock state error\n", __FILE__);
 				ret = AVB_IO_RESULT_ERROR_IO;
@@ -429,30 +438,111 @@
 					   size_t* out_num_bytes_preloaded,
 					   int allow_verification_error)
 {
+	struct preloaded_partition *preload_info = NULL;
+	struct AvbOpsData *data = ops->user_data;
 	struct blk_desc *dev_desc;
+	disk_partition_t part_info;
 	ulong load_addr;
-	int ret;
+	AvbIOResult ret;
+	int full_preload = 0;
 
-	/* no need go further */
-	if (!allow_verification_error)
-		return AVB_IO_RESULT_OK;
-
-	printf("get image from preloaded partition...\n");
 	dev_desc = rockchip_get_bootdev();
 	if (!dev_desc)
-	    return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
+		return AVB_IO_RESULT_ERROR_IO;
 
-	load_addr = env_get_ulong("kernel_addr_r", 16, 0);
-	if (!load_addr)
-		return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;
+	if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) {
+		printf("Could not find \"%s\" partition\n", partition);
+		return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
+	}
 
-	ret = android_image_load_by_partname(dev_desc, partition, &load_addr);
-	if (!ret) {
-		*out_pointer = (u8 *)load_addr;
-		*out_num_bytes_preloaded = num_bytes; /* return what it expects */
+	if (!allow_verification_error) {
+		if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) ||
+		    !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8))
+			preload_info = &data->boot;
+		else if (!strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11))
+			preload_info = &data->vendor_boot;
+		else if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9))
+			preload_info = &data->init_boot;
+		else if (!strncmp(partition, ANDROID_PARTITION_RESOURCE, 8))
+			preload_info = &data->resource;
+
+		if (!preload_info) {
+			printf("Error: unknown full load partition '%s'\n", partition);
+			return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
+		}
+
+		printf("preloaded(s): %sfull image from '%s' at 0x%08lx - 0x%08lx\n",
+		       preload_info->size ? "pre-" : "", partition,
+		       (ulong)preload_info->addr,
+		       (ulong)preload_info->addr + num_bytes);
+
+		/* If the partition hasn't yet been preloaded, do it now.*/
+		if (preload_info->size == 0) {
+			ret = ops->read_from_partition(ops, partition,
+						       0, num_bytes,
+						       preload_info->addr,
+						       &preload_info->size);
+			if (ret != AVB_IO_RESULT_OK)
+				return ret;
+		}
+		*out_pointer = preload_info->addr;
+		*out_num_bytes_preloaded = preload_info->size;
 		ret = AVB_IO_RESULT_OK;
 	} else {
-		ret = AVB_IO_RESULT_ERROR_IO;
+		if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) ||
+		    !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) ||
+		    !strncmp(partition, ANDROID_PARTITION_BOOT, 4) ||
+		    !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8) ||
+		    !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) {
+			/* If already full preloaded, just use it */
+			if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) ||
+			    !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8)) {
+				preload_info = &data->boot;
+				if (preload_info->size) {
+					*out_pointer = preload_info->addr;
+					*out_num_bytes_preloaded = num_bytes;
+					full_preload = 1;
+				}
+			}
+			printf("preloaded: %s image from '%s\n",
+			       full_preload ? "pre-full" : "distribute", partition);
+		} else {
+			printf("Error: unknown preloaded partition '%s'\n", partition);
+			return AVB_IO_RESULT_ERROR_OOM;
+		}
+
+		/*
+		 * Already preloaded during boot/recovery loading,
+		 * here we just return a dummy buffer.
+		 */
+		if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) ||
+		    !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) ||
+		    !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) {
+			*out_pointer = (u8 *)avb_malloc(ARCH_DMA_MINALIGN);
+			*out_num_bytes_preloaded = num_bytes; /* return what it expects */
+			return AVB_IO_RESULT_OK;
+		}
+
+		/* If already full preloaded, there is nothing to do and just return */
+		if (full_preload)
+			return AVB_IO_RESULT_OK;
+
+		/*
+		 * only boot/recovery partition can reach here
+		 * and init/vendor_boot are loaded at this round.
+		 */
+		load_addr = env_get_ulong("kernel_addr_r", 16, 0);
+		if (!load_addr)
+			return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;
+
+		ret = android_image_load_by_partname(dev_desc, partition, &load_addr);
+		if (!ret) {
+			*out_pointer = (u8 *)load_addr;
+			*out_num_bytes_preloaded = num_bytes; /* return what it expects */
+			ret = AVB_IO_RESULT_OK;
+		} else {
+			ret = AVB_IO_RESULT_ERROR_IO;
+		}
 	}
 
 	return ret;
@@ -489,7 +579,8 @@
 
 AvbOps *avb_ops_user_new(void)
 {
-	AvbOps *ops;
+	AvbOps *ops = NULL;
+	struct AvbOpsData *ops_data = NULL;
 
 	ops = calloc(1, sizeof(AvbOps));
 	if (!ops) {
@@ -510,8 +601,20 @@
 		free(ops);
 		goto out;
 	}
+
+	ops_data = calloc(1, sizeof(struct AvbOpsData));
+	if (!ops_data) {
+		printf("Error allocating memory for AvbOpsData.\n");
+		free(ops->atx_ops);
+		free(ops->ab_ops);
+		free(ops);
+		goto out;
+	}
+
 	ops->ab_ops->ops = ops;
 	ops->atx_ops->ops = ops;
+	ops_data->ops = ops;
+	ops->user_data = ops_data;
 
 	ops->read_from_partition = read_from_partition;
 	ops->write_to_partition = write_to_partition;
@@ -533,12 +636,14 @@
 	ops->atx_ops->set_key_version = avb_set_key_version;
 	ops->atx_ops->get_random = rk_get_random;
 
-out:
 	return ops;
+out:
+	return NULL;
 }
 
 void avb_ops_user_free(AvbOps *ops)
 {
+	free(ops->user_data);
 	free(ops->ab_ops);
 	free(ops->atx_ops);
 	free(ops);
diff --git a/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c b/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c
index a536fd9..78e0d9a 100644
--- a/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c
+++ b/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c
@@ -158,6 +158,7 @@
 int rk_avb_read_lock_state(uint8_t *lock_state)
 {
 #ifdef CONFIG_OPTEE_CLIENT
+	uint8_t vboot_flag = 0;
 	int ret;
 
 	ret = trusty_read_lock_state(lock_state);
@@ -167,7 +168,16 @@
 	case TEE_ERROR_GENERIC:
 	case TEE_ERROR_NO_DATA:
 	case TEE_ERROR_ITEM_NOT_FOUND:
-		*lock_state = 1;
+		if (trusty_read_vbootkey_enable_flag(&vboot_flag)) {
+			printf("Can't read vboot flag\n");
+			return -1;
+		}
+
+		if (vboot_flag)
+			*lock_state = 0;
+		else
+			*lock_state = 1;
+
 		if (rk_avb_write_lock_state(*lock_state)) {
 			printf("avb_write_lock_state error!");
 			ret = -1;
diff --git a/u-boot/lib/optee_clientApi/OpteeClientInterface.c b/u-boot/lib/optee_clientApi/OpteeClientInterface.c
index c16a460..9f2022b 100644
--- a/u-boot/lib/optee_clientApi/OpteeClientInterface.c
+++ b/u-boot/lib/optee_clientApi/OpteeClientInterface.c
@@ -73,6 +73,20 @@
 	flush_cache(aligned_input, aligned_len);
 }
 
+static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size)
+{
+	ulong alignment = CONFIG_SYS_CACHELINE_SIZE;
+	ulong aligned_input, aligned_len;
+
+	if (!addr || !size)
+		return;
+
+	/* Must invalidate dcache after crypto DMA write data region */
+	aligned_input = round_down(addr, alignment);
+	aligned_len = round_up(size + (addr - aligned_input), alignment);
+	invalidate_dcache_range(aligned_input, aligned_input + aligned_len);
+}
+
 static uint32_t trusty_base_write_security_data(char *filename,
 						uint32_t filename_size,
 						uint8_t *data,
@@ -1014,6 +1028,8 @@
 					&TeecOperation,
 					&ErrorOrigin);
 
+	crypto_invalidate_cacheline(dst_phys_addr, len);
+
 exit:
 	TEEC_ReleaseSharedMemory(&SharedMem_config);
 	TEEC_CloseSession(&TeecSession);
diff --git a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c
index ca60698..414f5f4 100644
--- a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c
+++ b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c
@@ -528,7 +528,7 @@
 {
 	unsigned char *cp, *vp;
 	struct rkss_file_verification *verify;
-	int ret, i;
+	int ret, i, write_table_flag = 0;
 
 	for (i = 0; i < RKSS_PARTITION_TABLE_COUNT; i++) {
 		cp = table_data + (i * RKSS_DATA_SECTION_LEN);
@@ -541,12 +541,15 @@
 			memset(cp, 0, RKSS_DATA_SECTION_LEN);
 			verify->checkstr = RKSS_CHECK_STR;
 			verify->version = RKSS_VERSION_V1;
+			write_table_flag = 1;
 		}
 	}
-	ret = rkss_write_multi_sections(table_data, 0, RKSS_PARTITION_TABLE_COUNT);
-	if (ret < 0) {
-		printf("TEEC: rkss_write_multi_sections failed!!! ret: %d.\n", ret);
-		return TEEC_ERROR_GENERIC;
+	if (write_table_flag == 1) {
+		ret = rkss_write_multi_sections(table_data, 0, RKSS_PARTITION_TABLE_COUNT);
+		if (ret < 0) {
+			printf("TEEC: rkss_write_multi_sections failed!!! ret: %d.\n", ret);
+			return TEEC_ERROR_GENERIC;
+		}
 	}
 	debug("TEEC: verify ptable success.\n");
 	return TEEC_SUCCESS;
diff --git a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c
index ff34e4e..d204a31 100644
--- a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c
+++ b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c
@@ -1384,7 +1384,6 @@
 	case OPTEE_MRF_CLOSE:
 		debug(">>>>>>> [%d] OPTEE_MRF_CLOSE!\n", rkss_step++);
 		ret = ree_fs_new_close(num_params, params);
-		rkss_storage_write();
 		break;
 	case OPTEE_MRF_READ:
 		debug(">>>>>>> [%d] OPTEE_MRF_READ!\n", rkss_step++);
@@ -1401,12 +1400,10 @@
 	case OPTEE_MRF_REMOVE:
 		debug(">>>>>>> [%d] OPTEE_MRF_REMOVE!\n", rkss_step++);
 		ret = ree_fs_new_remove(num_params, params);
-		rkss_storage_write();
 		break;
 	case OPTEE_MRF_RENAME:
 		debug(">>>>>>> [%d] OPTEE_MRF_RENAME!\n", rkss_step++);
 		ret = ree_fs_new_rename(num_params, params);
-		rkss_storage_write();
 		break;
 	case OPTEE_MRF_OPENDIR:
 		debug(">>>>>>> [%d] OPTEE_MRF_OPENDIR!\n", rkss_step++);
@@ -1424,5 +1421,6 @@
 		ret = TEEC_ERROR_BAD_PARAMETERS;
 		break;
 	}
+	rkss_storage_write();
 	return ret;
 }
diff --git a/u-boot/lib/rsa/rsa-sign.c b/u-boot/lib/rsa/rsa-sign.c
index fed64d5..71a940c 100644
--- a/u-boot/lib/rsa/rsa-sign.c
+++ b/u-boot/lib/rsa/rsa-sign.c
@@ -610,7 +610,7 @@
 		   BIGNUM **modulusp, BIGNUM **exponent_BN, BIGNUM **r_squaredp,
 		   BIGNUM **c_factorp, BIGNUM **np_factorp)
 {
-	BIGNUM *big1, *big2, *big32, *big2_32, *big4100, *big2180;
+	BIGNUM *big1, *big2, *big32, *big2_32, *big4100, *big2180, *big4228;
 	BIGNUM *n, *e, *r, *r_squared, *tmp, *c_factor, *np_factor;
 	const BIGNUM *key_n, *key_e;
 	BN_CTX *bn_ctx = BN_CTX_new();
@@ -622,6 +622,7 @@
 	big32 = BN_new();
 	big4100 = BN_new();
 	big2180 = BN_new();
+	big4228 = BN_new();
 
 	r = BN_new();
 	r_squared = BN_new();
@@ -631,7 +632,7 @@
 	big2_32 = BN_new();
 	n = BN_new();
 	e = BN_new();
-	if (!big1 || !big2 || !big32 || !big4100 || !big2180 || !r ||
+	if (!big1 || !big2 || !big32 || !big4100 || !big2180 || !big4228 || !r ||
 	    !r_squared || !tmp || !big2_32 || !n || !e ||
 	    !c_factor || !np_factor) {
 		fprintf(stderr, "Out of memory (bignum)\n");
@@ -645,7 +646,8 @@
 	if (!BN_copy(n, key_n) || !BN_copy(e, key_e) ||
 	    !BN_set_word(big1, 1L) ||
 	    !BN_set_word(big2, 2L) || !BN_set_word(big32, 32L) ||
-	    !BN_set_word(big4100, 4100L) || !BN_set_word(big2180, 2180L))
+	    !BN_set_word(big4100, 4100L) || !BN_set_word(big2180, 2180L) ||
+	    !BN_set_word(big4228, 4228L))
 		ret = -1;
 
 	/* big2_32 = 2^32 */
@@ -675,9 +677,15 @@
 		ret = -1;
 
 	/* Calculate np_factor = 2^2180 div n */
-	if (!BN_exp(tmp, big2, big2180, bn_ctx) ||
-	    !BN_div(np_factor, NULL, tmp, n, bn_ctx))
-		ret = -1;
+	if (BN_num_bits(n) == 2048) {
+		if (!BN_exp(tmp, big2, big2180, bn_ctx) ||
+		    !BN_div(np_factor, NULL, tmp, n, bn_ctx))
+			ret = -1;
+	} else {/* Calculate 4096 np_factor = 2^4228 div n */
+		if (!BN_exp(tmp, big2, big4228, bn_ctx) ||
+		    !BN_div(np_factor, NULL, tmp, n, bn_ctx))
+			ret = -1;
+	}
 
 	*modulusp = n;
 	*exponent_BN = e;
@@ -690,6 +698,7 @@
 	BN_free(big32);
 	BN_free(big4100);
 	BN_free(big2180);
+	BN_free(big4228);
 	BN_free(r);
 	BN_free(tmp);
 	BN_free(big2_32);
diff --git a/u-boot/lib/rsa/rsa-verify.c b/u-boot/lib/rsa/rsa-verify.c
index 18b9ff9..fe15293 100644
--- a/u-boot/lib/rsa/rsa-verify.c
+++ b/u-boot/lib/rsa/rsa-verify.c
@@ -86,11 +86,17 @@
 	uint8_t buf[sig_len];
 	rsa_key rsa_key;
 	int i, ret;
+#ifdef CONFIG_FIT_ENABLE_RSA4096_SUPPORT
+	if (key_len != RSA4096_BYTES)
+		return -EINVAL;
 
+	rsa_key.algo = CRYPTO_RSA4096;
+#else
 	if (key_len != RSA2048_BYTES)
 		return -EINVAL;
 
 	rsa_key.algo = CRYPTO_RSA2048;
+#endif
 	rsa_key.n = malloc(key_len);
 	rsa_key.e = malloc(key_len);
 	rsa_key.c = malloc(key_len);
@@ -599,7 +605,7 @@
 	struct udevice *dev;
 	struct key_prop prop;
 	char name[100] = {0};
-	u16 secure_boot_enable = 0;
+	u16 secure_flags = 0;
 	const void *blob = info->fdt_blob;
 	uint8_t digest[FIT_MAX_HASH_LEN];
 	uint8_t digest_read[FIT_MAX_HASH_LEN];
@@ -610,11 +616,11 @@
 		return -ENODEV;
 
 	ret = misc_otp_read(dev, OTP_SECURE_BOOT_ENABLE_ADDR,
-			    &secure_boot_enable, OTP_SECURE_BOOT_ENABLE_SIZE);
+			    &secure_flags, OTP_SECURE_BOOT_ENABLE_SIZE);
 	if (ret)
 		return ret;
 
-	if (secure_boot_enable)
+	if (secure_flags == 0xff)
 		return 0;
 
 	sig_node = fdt_subnode_offset(blob, 0, FIT_SIG_NODENAME);
@@ -701,9 +707,9 @@
 		goto error;
 	}
 
-	secure_boot_enable = 0xff;
+	secure_flags = 0xff;
 	ret = misc_otp_write(dev, OTP_SECURE_BOOT_ENABLE_ADDR,
-			     &secure_boot_enable, OTP_SECURE_BOOT_ENABLE_SIZE);
+			     &secure_flags, OTP_SECURE_BOOT_ENABLE_SIZE);
 	if (ret)
 		goto error;
 
diff --git a/u-boot/lib/sha1.c b/u-boot/lib/sha1.c
index f54bb5b..399607a 100644
--- a/u-boot/lib/sha1.c
+++ b/u-boot/lib/sha1.c
@@ -26,6 +26,15 @@
 #include <watchdog.h>
 #include <u-boot/sha1.h>
 
+#include <linux/compiler.h>
+
+#ifdef USE_HOSTCC
+#undef __weak
+#define __weak
+#undef __maybe_unused
+#define __maybe_unused
+#endif
+
 const uint8_t sha1_der_prefix[SHA1_DER_LEN] = {
 	0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e,
 	0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14
@@ -66,7 +75,7 @@
 	ctx->state[4] = 0xC3D2E1F0;
 }
 
-static void sha1_process(sha1_context *ctx, const unsigned char data[64])
+static void __maybe_unused sha1_process_one(sha1_context *ctx, const unsigned char data[64])
 {
 	unsigned long temp, W[16], A, B, C, D, E;
 
@@ -220,6 +229,18 @@
 	ctx->state[4] += E;
 }
 
+__weak void sha1_process(sha1_context *ctx, const unsigned char *data,
+			 unsigned int blocks)
+{
+	if (!blocks)
+		return;
+
+	while (blocks--) {
+		sha1_process_one(ctx, data);
+		data += 64;
+	}
+}
+
 /*
  * SHA-1 process buffer
  */
@@ -243,17 +264,15 @@
 
 	if (left && ilen >= fill) {
 		memcpy ((void *) (ctx->buffer + left), (void *) input, fill);
-		sha1_process (ctx, ctx->buffer);
+		sha1_process(ctx, ctx->buffer, 1);
 		input += fill;
 		ilen -= fill;
 		left = 0;
 	}
 
-	while (ilen >= 64) {
-		sha1_process (ctx, input);
-		input += 64;
-		ilen -= 64;
-	}
+	sha1_process(ctx, input, ilen / 64);
+	input += ilen / 64 * 64;
+	ilen = ilen % 64;
 
 	if (ilen > 0) {
 		memcpy ((void *) (ctx->buffer + left), (void *) input, ilen);
diff --git a/u-boot/lib/sha256.c b/u-boot/lib/sha256.c
index 251825c..ef20b40 100644
--- a/u-boot/lib/sha256.c
+++ b/u-boot/lib/sha256.c
@@ -15,6 +15,13 @@
 #include <watchdog.h>
 #include <u-boot/sha256.h>
 
+#include <linux/compiler.h>
+
+#ifdef USE_HOSTCC
+#undef __weak
+#define __weak
+#endif
+
 const uint8_t sha256_der_prefix[SHA256_DER_LEN] = {
 	0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
 	0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
@@ -56,7 +63,7 @@
 	ctx->state[7] = 0x5BE0CD19;
 }
 
-static void sha256_process(sha256_context *ctx, const uint8_t data[64])
+static void sha256_process_one(sha256_context *ctx, const uint8_t data[64])
 {
 	uint32_t temp1, temp2;
 	uint32_t W[64];
@@ -187,6 +194,18 @@
 	ctx->state[7] += H;
 }
 
+__weak void sha256_process(sha256_context *ctx, const unsigned char *data,
+			   unsigned int blocks)
+{
+	if (!blocks)
+		return;
+
+	while (blocks--) {
+		sha256_process_one(ctx, data);
+		data += 64;
+	}
+}
+
 void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t length)
 {
 	uint32_t left, fill;
@@ -205,17 +224,15 @@
 
 	if (left && length >= fill) {
 		memcpy((void *) (ctx->buffer + left), (void *) input, fill);
-		sha256_process(ctx, ctx->buffer);
+		sha256_process(ctx, ctx->buffer, 1);
 		length -= fill;
 		input += fill;
 		left = 0;
 	}
 
-	while (length >= 64) {
-		sha256_process(ctx, input);
-		length -= 64;
-		input += 64;
-	}
+	sha256_process(ctx, input, length / 64);
+	input += length / 64 * 64;
+	length = length % 64;
 
 	if (length)
 		memcpy((void *) (ctx->buffer + left), (void *) input, length);
diff --git a/u-boot/make.sh b/u-boot/make.sh
index 233bc9a..de6d978 100755
--- a/u-boot/make.sh
+++ b/u-boot/make.sh
@@ -13,7 +13,7 @@
 ########################################### User can modify #############################################
 RKBIN_TOOLS=../rkbin/tools
 CROSS_COMPILE_ARM32=../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
-CROSS_COMPILE_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
+CROSS_COMPILE_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
 ########################################### User not touch #############################################
 # Declare global INI file searching index name for every chip, update in select_chip_info()
 RKCHIP=
@@ -48,6 +48,7 @@
 SCRIPT_UBOOT="${SRCTREE}/scripts/uboot.sh"
 SCRIPT_LOADER="${SRCTREE}/scripts/loader.sh"
 SCRIPT_DECOMP="${SRCTREE}/scripts/decomp.sh"
+SCRIPT_CHECKCONFIG="${SRCTREE}/scripts/check-rkconfig.sh"
 CC_FILE=".cc"
 REP_DIR="./rep"
 #########################################################################################################
@@ -268,7 +269,7 @@
 			CROSS_COMPILE_ARM64=`cat ${CC_FILE}`
 		else
 			if grep -q '^CONFIG_ARM64=y' .config ; then
-				CROSS_COMPILE_ARM64=$(cd `dirname ${CROSS_COMPILE_ARM64}`; pwd)"/aarch64-linux-gnu-"
+				CROSS_COMPILE_ARM64=$(cd `dirname ${CROSS_COMPILE_ARM64}`; pwd)"/aarch64-none-linux-gnu-"
 			else
 				CROSS_COMPILE_ARM32=$(cd `dirname ${CROSS_COMPILE_ARM32}`; pwd)"/arm-linux-gnueabihf-"
 			fi
@@ -768,6 +769,9 @@
 
 function finish()
 {
+	# check special config
+	${SCRIPT_CHECKCONFIG}
+
 	echo
 	if [ "${ARG_BOARD}" == "" ]; then
 		echo "Platform ${RKCHIP_LABEL} is build OK, with exist .config"
diff --git a/u-boot/scripts/README.rockchip b/u-boot/scripts/README.rockchip
index 907e376..8c8ea31 100644
--- a/u-boot/scripts/README.rockchip
+++ b/u-boot/scripts/README.rockchip
@@ -33,7 +33,7 @@
 		./scripts/stacktrace.sh dump.txt tpl
 
 	# avbtool.py
-		./avbtool.py info_image --image vbmeta.img
+		./scripts/avbtool.py info_image --image vbmeta.img
 
 [tools]
 	# resource_tool
diff --git a/u-boot/scripts/android2fit.sh b/u-boot/scripts/android2fit.sh
index cb7d2c9..b2ef05c 100755
--- a/u-boot/scripts/android2fit.sh
+++ b/u-boot/scripts/android2fit.sh
@@ -61,9 +61,9 @@
 
 	rm images/ -rf && mkdir -p images/
 	cp ${OUT}/kernel images/
-	cp ${OUT}/resource images/
+	cp ${OUT}/resource images/second
 	cp ${OUT}/ramdisk images/
-	cp ${OUT}/rk-kernel.dtb images/
+	cp ${OUT}/rk-kernel.dtb images/dtb
 	rm ${OUT}/ -rf
 
 	./make.sh fit
diff --git a/u-boot/scripts/check-rkconfig.sh b/u-boot/scripts/check-rkconfig.sh
new file mode 100755
index 0000000..fcf2f55
--- /dev/null
+++ b/u-boot/scripts/check-rkconfig.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+#
+# Copyright (c) 2023 Rockchip Electronics Co., Ltd
+#
+# SPDX-License-Identifier: GPL-2.0
+#
+
+set -e
+
+if [ -f dts/kern.dtb ]; then
+	if ! grep -Eq 'CONFIG_EMBED_KERNEL_DTB=y' .config ; then
+		echo "ERROR: dts/kern.dtb was found, but CONFIG_EMBED_KERNEL_DTB is disabled."
+		exit 1
+	fi
+fi
+
+if grep -Eq 'CONFIG_EMBED_KERNEL_DTB=y' .config ; then
+	KDTB=`sed -n "/CONFIG_EMBED_KERNEL_DTB_PATH=/s/CONFIG_EMBED_KERNEL_DTB_PATH=//p" .config | tr -d '\r' | tr -d '"'`
+	if [ ! -f ${KDTB} ]; then
+		echo "ERROR: '${KDTB}' was not found assigned by CONFIG_EMBED_KERNEL_DTB_PATH."
+		exit 1
+	fi
+fi
diff --git a/u-boot/scripts/fit-core.sh b/u-boot/scripts/fit-core.sh
index ecfd40d..1136ecb 100644
--- a/u-boot/scripts/fit-core.sh
+++ b/u-boot/scripts/fit-core.sh
@@ -18,9 +18,11 @@
 SIG_BOOT="${FIT_DIR}/boot.data2sign"
 SIG_RECOVERY="${FIT_DIR}/recovery.data2sign"
 # offs
-OFFS_DATA="0x1000"
-# file
-CHIP_FILE="arch/arm/lib/.asm-offsets.s.cmd"
+if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then
+	OFFS_DATA="0x1200"
+else
+	OFFS_DATA="0x1000"
+fi
 # placeholder address
 FDT_ADDR_PLACEHOLDER="0xffffff00"
 KERNEL_ADDR_PLACEHOLDER="0xffffff01"
@@ -94,6 +96,19 @@
 			exit 1
 		fi
 	done
+}
+
+function check_rsa_algo()
+{
+	if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then
+		rsa_algo="rsa4096"
+	else
+		rsa_algo="rsa2048"
+	fi
+	if ! grep -qr ${rsa_algo} $1 ; then
+		echo "ERROR: Wrong rsa_algo in its file. It should be ${rsa_algo}."
+		exit 1
+	fi
 }
 
 function check_rsa_keys()
@@ -378,6 +393,8 @@
 	else
 		check_rsa_keys
 
+		check_rsa_algo ${ITS_BOOT}
+
 		if ! grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then
 			echo "ERROR: CONFIG_FIT_SIGNATURE is disabled"
 			exit 1
@@ -396,10 +413,9 @@
 		fi
 
 		# fixup
-		COMMON_FILE=`sed -n "/_common.h/p" ${CHIP_FILE} | awk '{ print $1 }'`
-		FDT_ADDR_R=`awk /fdt_addr_r/         ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
-		KERNEL_ADDR_R=`awk /kernel_addr_r/   ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
-		RMADISK_ADDR_R=`awk /ramdisk_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
+		FDT_ADDR_R=`strings env/built-in.o | grep 'fdt_addr_r=' | awk -F "=" '{ print $2 }'`
+		KERNEL_ADDR_R=`strings env/built-in.o | grep 'kernel_addr_r=' | awk -F "=" '{ print $2 }'`
+		RMADISK_ADDR_R=`strings env/built-in.o | grep 'ramdisk_addr_r=' | awk -F "=" '{ print $2 }'`
 		sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g"         ${ITS_BOOT}
 		sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g"   ${ITS_BOOT}
 		sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RMADISK_ADDR_R}/g" ${ITS_BOOT}
@@ -464,6 +480,8 @@
 	else
 		check_rsa_keys
 
+		check_rsa_algo ${ITS_RECOVERY}
+
 		if ! grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then
 			echo "ERROR: CONFIG_FIT_SIGNATURE is disabled"
 			exit 1
@@ -482,10 +500,9 @@
 		fi
 
 		# fixup
-		COMMON_FILE=`sed -n "/_common.h/p" ${CHIP_FILE} | awk '{ print $1 }'`
-		FDT_ADDR_R=`awk /fdt_addr_r/         ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
-		KERNEL_ADDR_R=`awk /kernel_addr_r/   ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
-		RMADISK_ADDR_R=`awk /ramdisk_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
+		FDT_ADDR_R=`strings env/built-in.o | grep 'fdt_addr_r=' | awk -F "=" '{ print $2 }'`
+		KERNEL_ADDR_R=`strings env/built-in.o | grep 'kernel_addr_r=' | awk -F "=" '{ print $2 }'`
+		RMADISK_ADDR_R=`strings env/built-in.o | grep 'ramdisk_addr_r=' | awk -F "=" '{ print $2 }'`
 		sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g"         ${ITS_RECOVERY}
 		sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g"   ${ITS_RECOVERY}
 		sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RMADISK_ADDR_R}/g" ${ITS_RECOVERY}
diff --git a/u-boot/scripts/setlocalversion b/u-boot/scripts/setlocalversion
index a3014ca..6b433f0 100755
--- a/u-boot/scripts/setlocalversion
+++ b/u-boot/scripts/setlocalversion
@@ -60,8 +60,6 @@
 			# "v2.6.30-rc5-302-g72357d5"), we pretty print it.
 			if atag="`git describe 2>/dev/null`"; then
 				echo "$atag" | awk -F- '{printf("-%s", $(NF))}'
-				date=`git log -1 --author='@rock-chips' --date=format:%y%m%d | sed -n '/Date:/p' | awk '{ print "-"$2 }'`
-				printf '%s' $date
 
 			# If we don't have a tag at all we print -g{commitish}.
 			else
@@ -74,11 +72,16 @@
 			printf -- '-svn%s' "`git svn find-rev $head`"
 		fi
 
+		# Check submit date of the last rockchip commit
+		date=`git log -1 --author='@rock-chips' --date=format:%y%m%d | sed -n '/Date:/p' | awk '{ print "-"$2 }'`
+		printf '%s' $date
+
 		# Check for uncommitted changes
 		if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then
 			printf '%s' -dirty
 		fi
 
+		# Print build user
 		printf ' \#%s' $USER
 
 		# All done with git
diff --git a/u-boot/tools/Makefile b/u-boot/tools/Makefile
index 2bc097f..354b449 100644
--- a/u-boot/tools/Makefile
+++ b/u-boot/tools/Makefile
@@ -59,15 +59,9 @@
 
 # Rockchip pack tools
 ifdef CONFIG_ARCH_ROCKCHIP
-hostprogs-y += boot_merger
-hostprogs-y += trust_merger
-hostprogs-y += loaderimage
 hostprogs-y += resource_tool
 hostprogs-y += bmp2gray16
 
-boot_merger-objs := rockchip/boot_merger.o rockchip/sha2.o lib/sha256.o
-trust_merger-objs := rockchip/trust_merger.o rockchip/sha2.o lib/sha256.o
-loaderimage-objs := rockchip/loaderimage.o rockchip/sha.o lib/sha256.o rockchip/crc32_rk.o
 resource_tool-objs := rockchip/resource_tool.o
 bmp2gray16-objs := rockchip/bmp2gray16.o
 endif
diff --git a/u-boot/tools/rkcommon.c b/u-boot/tools/rkcommon.c
index 7650fa5..dc62d9c 100644
--- a/u-boot/tools/rkcommon.c
+++ b/u-boot/tools/rkcommon.c
@@ -138,6 +138,8 @@
 	{ "rv1108", "RK11", 0x1800, false, RK_HEADER_V1 },
 	{ "rv1126", "110B", 0x10000 - 0x1000, false, RK_HEADER_V1 },
 	{ "rk1808", "RK18", 0x200000 - 0x2000, false, RK_HEADER_V1 },
+	{ "rk3528", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 },
+	{ "rk3562", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 },
 	{ "rk3568", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 },
 	{ "rk3588", "RK35", 0x100000 - 0x1000, false, RK_HEADER_V2 },
 };
diff --git a/u-boot/usb_update.txt b/u-boot/usb_update.txt
new file mode 100644
index 0000000..fee7683
--- /dev/null
+++ b/u-boot/usb_update.txt
@@ -0,0 +1,4 @@
+# script file start
+echo "this is usb update script!"
+
+% script file end
\ No newline at end of file

--
Gitblit v1.6.2